我需要创建一个VPN,这样
- 客户端具有静态 IP 地址。
- 客户端可以相互通信,也可以与服务器通信,
- 客户端可以通过 VPN 访问 Internet。
- 另外,我想设置自己的 DNS 和私有域(由 NginX 处理)。
我的配置服务器是:
[Interface]
Address = 10.0.0.1/24, fd86:ea04:1115::1/64
ListenPort = 5555
PrivateKey = xxxxx
[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0
这些是客户端配置:
[Interface]
PrivateKey = xxxxx
ListenPort = 5555
Address = 10.0.0.2/32
DNS = 8.8.8.8
[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0, ::/0
但是当我尝试通过加载服务器配置时wg setconf wg0 /etc/wireguard/wg0.conf
出现此错误:
Line unrecognized: `Address=10.0.0.1/24,fd86:ea04:1115::1/64'
Configuration parsing error
所以我注释掉了那行。但这可能会迫使 WG 为自己和客户选择随机 IP 地址。
要启动 WireGuard,我运行以下命令:
ip link add dev wg0 type wireguard
ip address add dev wg0 10.0.0.1/24
ip link set up dev wg0
之后,该命令wg
给出以下输出:
interface: wg0
public key: xxxxx
private key: (hidden)
listening port: 5555
peer: xxxxx
endpoint: <my IP address>:6228
allowed ips: 0.0.0.0/0
latest handshake: 2 minutes, 11 seconds ago
transfer: 26.02 KiB received, 248 B sent
从客户端(我的带有 WireGuard GUI 的 MacOS)我可以连接,但是:
- 没有网络连接。我什至无法在全局地址上 ping 服务器,尽管它可以在私有地址上运行
10.0.0.1
。 - 即使我在客户端配置中指定了不同的端口,我也可以连接到 VPN。我想这意味着它实际上并没有连接。
如何让 WireGuard 以我想要的方式工作?我的配置有什么问题?
PS。服务器上iptables
没有防火墙,所以这不是问题。另外,在文件中,/etc/sysctl.conf
我指定了net.ipv4.ip_forward=1
and net.ipv6.conf.all.forwarding=1
,并执行了systemctl restart systemd-networkd
.
软件版本。操作系统:Ubuntu 18.04.1 LTS
,内核:4.15.0-20-generic
,WG wireguard-tools v1.0.20200206
:。
所以,经过几天,几夜和杀死服务器后,我终于弄清楚了一切
:)
首先,值得注意的是实用程序
wg
和wg-quick
使用配置的方式不同(显然,wg
它们不支持最新的配置格式)。所以wg setconf wg0 /etc/wireguard/wg0.conf
我开始wg-quick
使用systemctl
.其次,即使在
net.ipv4.ip_forward=1
执行. 我还必须使用命令将配置发送到操作系统内核。这最终允许客户端相互通信并从 VPN 下访问互联网。/etc/sysctl.conf
systemctl daemon-reload ; systemctl restart systemd-networkd
sysctl -p /etc/sysctl.conf
值得注意的是,对于所有应用程序,
Address
最好指定 32 位的子网掩码,因为它表示特定的 IP 地址,而不是范围。此外,我还能够使用 BIND9 设置我自己的 DNS,以便在我的网络上创建一个自定义域。并通过监听本地网络上的地址和额外验证发件人 IP 来提高 NginX,以限制仅 VPN 客户端的访问。
结果,我的配置变成了这样:
服务器
客户