我有一台 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 &