wireguard 客户端到客户端的通信不起作用

wireguard 客户端到客户端的通信不起作用

我有一台 CentOS 8 Stream wireguard 服务器,它允许我和朋友一起玩 LAN 游戏。自从我更新到 Rocky Linux 9 后,我就无法再与其他客户端通信了。

澄清:

  • 客户端到服务器的工作方式
  • 服务器对所有客户端都起作用
  • 客户端到客户端不起作用。

对于所有 wireguard 东西,我使用了 CGN 网络范围(100.64.0.0/24)我的本地 LAN 有一个192.168.2.0/24范围。

wireguard 服务器有 2 个接口:

  • 192.168.2.254/24(路由器上有到互联网的端口转发功能)
  • 100.64.0.1/24(用于 wireguard 内容)

当客户端连接时,它可以使用我的 LAN(192.168.2.0/24)网络上的任何服务,这很好,因为我托管了 DNS、TeamSpeak 等服务。

问题是,客户端无法在 wireguard 范围内互相通信/ping (100.64.0.0/24)。例如:100.64.0.103无法 ping 100.64.0.104,它们都是连接到 wireguard 服务器的外部客户端。

服务器可以 ping 两个客户端,所以我认为这是 wireguard 服务器上的路由/防火墙问题。

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = ...
Address = 100.64.0.1/24

PostUp = firewall-cmd --zone=public --add-masquerade
PostUp = firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -o ens3 -j ACCEPT
PostUp = firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o ens3 -j MASQUERADE

PostDown = firewall-cmd --zone=public --remove-masquerade
PostDown = firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -i wg0 -o ens3 -j ACCEPT
PostDown = firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o ens3 -j MASQUERADE

ListenPort = 51820


# Client #1
[Peer]
PublicKey = ...
AllowedIPs = 100.64.0.101/32


# Client #2
[Peer]
PublicKey = ...
AllowedIPs = 100.64.0.102/32


# Client #3
[Peer]
PublicKey = ...
AllowedIPs = 100.64.0.103/32


# Client #4
[Peer]
PublicKey = ...
AllowedIPs = 100.64.0.104/32

ip a

[root@wireguard ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:b7:7f:f7 brd ff:ff:ff:ff:ff:ff
    altname enp0s3
    inet 192.168.2.254/24 brd 192.168.2.255 scope global dynamic noprefixroute ens3
       valid_lft 84243sec preferred_lft 84243sec
    inet6 fe80::5054:ff:feb7:7ff7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 100.64.0.1/24 scope global wg0
       valid_lft forever preferred_lft forever

ip route

[root@wireguard ~]# ip route
default via 192.168.2.1 dev ens3 proto dhcp src 192.168.2.254 metric 100 
100.64.0.0/24 dev wg0 proto kernel scope link src 100.64.0.1 
192.168.2.0/24 dev ens3 proto kernel scope link src 192.168.2.254 metric 100 

iptables -L -n

[root@wireguard ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

Wireguard 客户端配置:

[Interface]
PrivateKey = ...
Address = 100.64.0.104/32
DNS = 192.168.2.250

[Peer]
PublicKey = ...
AllowedIPs = 0.0.0.0/0
Endpoint = vpn.example.com:51820

有人能告诉我需要做哪些改变才能实现客户端与客户端之间的通信吗?

答案1

总结:

iptables -I FORWARD -i wg0 -o wg0 -j ACCEPT

我从未尝试过 Rocky Linux。以下是我在 Ubuntu 和 wg-easy docker 上使用的。希望它也适用于你。

sudo docker run -d \
  --name=wg-easy \
  -e WG_HOST=YOUR_HOST_IP \
  -e PASSWORD=YOUR_WEB_INTERFACE_PASSWORD \
  -e "WG_POST_UP=iptables --table nat --append POSTROUTING --jump MASQUERADE --out-interface eth0; iptables -I FORWARD -i wg0 -o wg0 -j ACCEPT" \
  -e "WG_POST_DOWN=iptables --table nat --delete POSTROUTING --jump MASQUERADE --out-interface eth0" \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --network host \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

然后打开浏览器http://你的主机 ip:51821生成客户端配置。如果您的客户端在连接到 VPN 后没有互联网,请将您喜欢的任何 DNS IP 添加到 AllowedIPs

AllowedIPs = 1.1.1.1/0, ::/0

如果你经常遇到超时问题,你可以使用这个技巧,让你的客户端以一定的间隔 ping 你的主机

ping -l 10 your_host_ip > /dev/null &

相关内容