更新

更新

我的目标是创建一个 VPN,以便

  1. 客户端具有静态 IP 地址。
  2. 客户端能够彼此通信并与服务器通信,
  3. 客户端可以通过VPN访问全球互联网。
  4. 另外,我想设置 DNS 和私有域名(与 NginX 合作)。

这是服务器的配置:

[Interface]
Address = 10.0.0.1/24
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
Endpoint = <server ip>:5555

但是当我尝试加载服务器的配置时wg setconf wg0 /etc/wireguard/wg0.conf出现此错误:

Line unrecognized: `Address=10.0.0.1/24'
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),我能够连接,但是:

  • 我没有网络连接。我甚至无法通过全局 IP 地址 ping 通服务器,但我可以用私有 IP 地址 ping 通10.0.0.1
  • 即使我更改了客户端配置中的端口,我也能连接到 VPN。我认为这意味着它实际上并没有连接。

那么,我该如何实现我的目标?我的配置有什么问题?

PS.iptables服务器上没有安装 和 防火墙,所以不会有问题。另外,我在 中指定了net.ipv4.ip_forward=1& 。 软件版本。操作系统是,内核:,WG:。 net.ipv6.conf.all.forwarding=1/etc/sysctl.conf
Ubuntu 18.04.4 LTS4.15.0-20-genericwireguard-tools v1.0.20200206


更新

Address从服务器的配置中删除,并AllowedIPs = 10.0.0.2/24在客户端的配置中进行设置,最终我通过私有 IP 从客户端连接到服务器的 NginX,并且能够访问互联网(因为流量在 VPN 之外)。

但是如果我AllowedIPs = 0.0.0.0/0在客户端上设置,我就无法访问互联网,尽管仍然可以通过 VPN 的 IP 地址 10.0.0.1 访问服务器。我尝试用 解决这个问题ifconfig wg0 broadcast/multicast,但没有成功。现在命令ip address show wg0提供以下输出:

4: wg0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.10.10.1/24 scope global wg0
       valid_lft forever preferred_lft forever
    inet 10.10.10.1 peer 10.10.10.2/32 scope global wg0
       valid_lft forever preferred_lft forever

另外,我无法从另一个客户端访问一个客户端,我认为这是同样的问题。我该如何修复 WireGuard 配置或服务器网络设置来解决这个问题?

答案1

好吧,经过几天几夜的等待,关闭了服务器,我自己解决了所有问题:)

  • 首先,我想提一下,实用wg程序wg-quick对配置文件的处理方式不同。因此,我的wg setconf wg0 /etc/wireguard/wg0.conf没有按预期工作,我猜它使用了旧的配置格式。现在我使用wg-quickthrough systemctl

  • 其次,尽管我调用了,但我将添加到net.ipv4.ip_forward=1文件的操作/etc/sysctl.conf仍然不起作用systemctl daemon-reload ; systemctl restart systemd-networkd。我必须使用命令将配置与内核链接起来sysctl -p /etc/sysctl.conf。这允许对等点相互通信并通过 VPN 访问互联网。

  • 值得一提的是,对于所有注释,Address最好使用 32 位子网掩码,这意味着精确的 IP,而不是范围。

  • 此外,我还使用 BIND9 设置了自定义 DNS,以便在网络中创建自己的域。并使用 NginX 检查发送者的 IP 地址,以将访问限制在 VPN 客户端的范围内。

目前,我的配置如下。

服务器

[Interface]
PrivateKey = ___some_private_key___
Address = 10.0.0.1/32
ListenPort = 5555

# The following is needed only if you have `ufw` installed
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Specify each client info separately
PublicKey = ___some_public_key___
AllowedIPs = 10.0.1.1/32

客户

[Interface]
PrivateKey = ___some_private_key___
Address = 10.0.1.1/32
ListenPort = 5555

[Peer]
PublicKey = ___some_public_key___
AllowedIPs = 10.0.0.0/16
Endpoint = ___server_ip_address_on_the_internet__:5555

答案2

的手册中wg没有提到该set命令可以理解该Address指令,也没有提到其配置格式规范:

       The Interface section may contain the following fields:

       ·      PrivateKey — [...] Required.

       ·      ListenPort — [...] Optional; if not specified, chosen randomly.

       ·      FwMark — [...] Optional.

       The Peer sections may contain the following fields:

       ·      PublicKey  —  [...] Required.

       ·      PresharedKey — [...]

       ·      AllowedIPs — [...] May be specified multiple times.

       ·      Endpoint  — [...]  Optional.

       ·      PersistentKeepalive  — [...] Optional.

相反,要使用包含的配置文件来设置您的界面Address,您应该使用一些名为的帮助程序wg-qucik

$ sudo wg-quick up /etc/wireguard/wg0.conf

此命令将创建接口wg0本身,因此您可能需要清除已经使用ip命令创建的接口。

相关内容