Клиентская связь WireGuard не работает.

Вопрос или проблема

У меня был сервер 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 и далее. Основные направления трафика работающие — это из клиента в сервер и из сервера в клиент. Однако клиент-к-клиент взаимодействие не функционирует, что указывает на межсетевые ограничения.

Применение

  1. Маршрутизация:

    Проверьте, что у всех клиентов WireGuard в конфигурации указаны адреса всех других клиентов для AllowedIPs. Хотя у вас указано 0.0.0.0/0, это правило охватывает все адреса, но в специфичных случаях некоторые конкретные маршруты могут потребоваться.

  2. Межсетевой экран:

    Включите правило, которое разрешает пересылку пакетов между интерфейсами WireGuard на уровне сервера. Это можно сделать с помощью команды iptables:

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

    Это правило разрешит трафик между клиентами через интерфейс wg0.

  3. Проверка и отладка:

    После внесения изменений, проверьте связь между клиентами. Попробуйте сделать ping с одного клиента на другой, чтобы убедиться в работоспособности. Если проблема не решена, рекомендуем убедиться, что нет других правил iptables или Firewalld, которые могли бы блокировать трафик между клиентами WireGuard.

Эти шаги должны помочь вам добиться работоспособности связи между клиентами в вашей среде WireGuard. Если проблема будет сохраняться, возможно, стоит также посмотреть на обновленные документы Rocky Linux, учитывая разницу в поведении сетевых конфигураций после обновления ОС.

Оцените материал
Добавить комментарий

Капча загружается...