Вопрос или проблема
У меня был сервер wireguard на CentOS 8 Stream, который позволял мне играть в локальные игры с друзьями. После обновления до Rocky Linux 9 я больше не могу общаться с другими клиентами.
Для пояснения:
- клиент-сервер работает
- сервер ко всем клиентам работает
- клиент-клиент не работает.
Для всех задач wireguard я использовал диапазон сети CGN (100.64.0.0/24
). Моя локальная сеть имеет диапазон 192.168.2.0/24
.
Wireguard сервер имеет 2 интерфейса:
192.168.2.254/24
(который имеет проброс порта на роутере в интернет)100.64.0.1/24
(для задач wireguard)
Когда клиент подключается, он может использовать любые сервисы в моей локальной сети (192.168.2.0/24
), что нормально, так как я размещаю сервисы, такие как DNS, TeamSpeak и т.д.
Проблема в том, что клиенты не могут общаться/пинговать друг с другом в диапазоне wireguard (100.64.0.0/24
). Например: 100.64.0.103
не может пинговать 100.64.0.104
, оба являются внешними клиентами, подключенными к wireguard серверу.
Сервер может пинговать обоих клиентов, так что это, вероятно, проблема маршрутизации/фаервола на 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
# Клиент #1
[Peer]
PublicKey = …
AllowedIPs = 100.64.0.101/32
# Клиент #2
[Peer]
PublicKey = …
AllowedIPs = 100.64.0.102/32
# Клиент #3
[Peer]
PublicKey = …
AllowedIPs = 100.64.0.103/32
# Клиент #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
Может ли кто-нибудь сказать, что мне нужно изменить, чтобы сделать возможной связь клиент-клиент?
TLDR:
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://your_host_ip:51821 для создания конфигурации клиента. Если у вашего клиента нет доступа в интернет после подключения к VPN, добавьте любые DNS IP-адреса, которые вы хотите, в AllowedIPs.
AllowedIPs = 1.1.1.1/0, ::/0
Если у вас возникают проблемы с тайм-аутами слишком часто, вы можете использовать этот трюк, заставляя вашего клиента пинговать ваш хост с интервалом.
ping -l 10 your_host_ip > /dev/null &
.
Ответ или решение
Проблема с невозможностью связи между клиентами WireGuard возникает из-за отсутствия соответствующих правил маршрутизации или межсетевого экрана. Для решения этих проблем следует действовать в несколько этапов.
Теория
WireGuard представляет собой современный VPN-протокол, который обеспечивает безопасную и быструю связь. Для прямого взаимодействия между клиентами (peer-to-peer) в одной VPN-сети необходима корректная конфигурация маршрутов и правил межсетевого экранирования.
Пример
Из вашей конфигурации видно, что сервер и клиенты настроены в пределах подсети CGN (100.64.0.0/24). Сервер имеет IP-адрес 100.64.0.1, а клиенты используют адреса 100.64.0.101 и далее. Основные направления трафика работающие — это из клиента в сервер и из сервера в клиент. Однако клиент-к-клиент взаимодействие не функционирует, что указывает на межсетевые ограничения.
Применение
-
Маршрутизация:
Проверьте, что у всех клиентов WireGuard в конфигурации указаны адреса всех других клиентов для AllowedIPs. Хотя у вас указано 0.0.0.0/0, это правило охватывает все адреса, но в специфичных случаях некоторые конкретные маршруты могут потребоваться.
-
Межсетевой экран:
Включите правило, которое разрешает пересылку пакетов между интерфейсами WireGuard на уровне сервера. Это можно сделать с помощью команды iptables:
iptables -I FORWARD -i wg0 -o wg0 -j ACCEPT
Это правило разрешит трафик между клиентами через интерфейс wg0.
-
Проверка и отладка:
После внесения изменений, проверьте связь между клиентами. Попробуйте сделать ping с одного клиента на другой, чтобы убедиться в работоспособности. Если проблема не решена, рекомендуем убедиться, что нет других правил iptables или Firewalld, которые могли бы блокировать трафик между клиентами WireGuard.
Эти шаги должны помочь вам добиться работоспособности связи между клиентами в вашей среде WireGuard. Если проблема будет сохраняться, возможно, стоит также посмотреть на обновленные документы Rocky Linux, учитывая разницу в поведении сетевых конфигураций после обновления ОС.