Не удается установить рукопожатие Wireguard на клиенте, данные не получены.

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

Возникли проблемы с настройкой Wireguard на новой установке NixOS (первый раз пробую NixOS). Сейчас я на этапе настройки, чтобы я мог подключиться вручную; когда это заработает, я буду шифровать всё, но сначала маленькие шаги, чтобы всё заработало вручную, прежде чем усложнять!

Краткое содержание – Клиент подключается к серверу и проводит рукопожатие, сервер подтверждает это и отправляет ответное рукопожатие, но клиент его не получает.

Конфигурация

Конфигурация в /etc/wireguard/wg0.conf на сервере и клиенте следующие. Я убрал ключи, но несколько раз проверил, что они верные, и уверен, что скопировал их правильно.

Сервер

[Interface]                                               
Address = 10.200.200.1/24                                 
ListenPort = 51820                                        
PrivateKey = REDACTED
DNS = 1.1.1.1          

... # Конфигурация для других компьютеров/телефонов, которые подключаются без проблем
                                   
[Peer] # crow
PublicKey = DklaI6GBwdeAGpeAbANfXJYeMk2Yl2qLOKL6RpxmEQI=
PresharedKey = REDACTED
AllowedIPs = 10.200.200.12/32

Клиент

[Interface]
Address = 10.200.200.12/32
PrivateKey = REDACTED
DNS = 1.1.1.1

[Peer]
PublicKey = z1dqOwXFwGSS2rm9jgiIAs1UXzp0Qdrvlh8Q01Kq1wk=
PresharedKey = REDACTED
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 152.228.170.148:51820
PersistentKeepalive = 25

Подключение

Я использую watch wg и включил журналирование ядра на клиенте и сервере с помощью echo "module wireguard +p" | sudo tee /sys/kernel/debug/dynamic_debug/control.

Клиент

Поднимаю wg0 на клиенте с помощью wg-quick up wg0, и интерфейс создается.

   wg-quick up wg0

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.200.200.12/32 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n
interface: wg0                                              
  public key: DklaI6GBwdeAGpeAbANfXJYeMk2Yl2qLOKL6RpxmEQI=
  private key: (hidden)
  listening port: 50821
  fwmark: 0xca6c
                                                            
peer: z1dqOwXFwGSS2rm9jgiIAs1UXzp0Qdrvlh8Q01Kq1wk=          
  preshared key: (hidden)                                   
  endpoint: 152.228.170.148:51820
  allowed ips: 0.0.0.0/0, ::/0
  transfer: 0 B received, 1.73 KiB sent
  persistent keepalive: every 25 seconds
[Jan17 09:21] wireguard: wg0: Интерфейс создан                                                                               
[  +0.004372] wireguard: wg0: Peer 52 создан                                                                                 
[  +0.015390] wireguard: wg0: Отправка keepalive пакета для peer 52 (152.228.170.148:51820)                                     
[  +0.000019] wireguard: wg0: Отправка инициирования рукопожатия для peer 52 (152.228.170.148:51820)                                 
[  +0.018190] wireguard: wg0: Неверный ответ рукопожатия от 152.228.170.148:51820                                           
[  +5.657511] wireguard: wg0: Рукопожатие для peer 52 (152.228.170.148:51820) не завершено через 5 секунд, повтор (попытка 2)
[  +0.000114] wireguard: wg0: Отправка инициирования рукопожатия для peer 52 (152.228.170.148:51820)                                 
[  +0.017913] wireguard: wg0: Неверный ответ рукопожатия от 152.228.170.148:51820                                           
[  +5.613783] wireguard: wg0: Рукопожатие для peer 52 (152.228.170.148:51820) не завершено через 5 секунд, повтор (попытка 3)
[  +0.000117] wireguard: wg0: Отправка инициирования рукопожатия для peer 52 (152.228.170.148:51820)                                 
[  +0.017912] wireguard: wg0: Неверный ответ рукопожатия от 152.228.170.148:51820                                           
[Jan17 09:22] wireguard: wg0: Рукопожатие для peer 52 (152.228.170.148:51820) не завершено через 5 секунд, повтор (попытка 4)
[  +0.000086] wireguard: wg0: Отправка инициирования рукопожатия для peer 52 (152.228.170.148:51820)                                 
[  +0.018423] wireguard: wg0: Неверный ответ рукопожатия от 152.228.170.148:51820                                           
[  +1.975477] wireguard: wg0: Peer 52 (152.228.170.148:51820) уничтожен                                                       
[  +0.023987] wireguard: wg0: Интерфейс уничтожен                                                                             

Сервер

На серверной стороне, которая работает нормально с несколькими другими компьютерами и телефонами, я вижу…

peer:  DklaI6GBwdeAGpeAbANfXJYeMk2Yl2qLOKL6RpxmEQI=
  preshared key: (hidden)
  endpoint: 88.97.78.71:59289
  allowed ips: 10.200.200.12/32
  transfer: 13.88 KiB received, 8.62 KiB sent

…и журнал ядра показывает, что подключение принято, пара ключей создана, рукопожатие получено и ответ отправлен.

[Jan17 10:21] wireguard: wg0: Получение инициирования рукопожатия от peer 11 (88.97.78.71:47830)
[  +0.000009] wireguard: wg0: Отправка ответа на рукопожатие для peer 11 (88.97.78.71:47830)
[  +0.000267] wireguard: wg0: Пара ключей 1721 создана для peer 11
[  +5.674620] wireguard: wg0: Получение инициирования рукопожатия от peer 11 (88.97.78.71:47830)
[  +0.000009] wireguard: wg0: Отправка ответа на рукопожатие для peer 11 (88.97.78.71:47830)
[  +0.000235] wireguard: wg0: Пара ключей 1721 уничтожена для peer 11
[  +0.000002] wireguard: wg0: Пара ключей 1722 создана для peer 11
[  +5.631519] wireguard: wg0: Получение инициирования рукопожатия от peer 11 (88.97.78.71:47830)
[  +0.000011] wireguard: wg0: Отправка ответа на рукопожатие для peer 11 (88.97.78.71:47830)
[  +0.000248] wireguard: wg0: Пара ключей 1722 уничтожена для peer 11
[  +0.000004] wireguard: wg0: Пара ключей 1723 создана для peer 11

Проблема

Посмотрев на логи и вывод, кажется, что клиент отправляет данные/информацию/учетные данные на сервер, и он отвечает, но клиент ничего не получает, так как рукопожатие истекает через 5 секунд, как wg показывает transfer: 0 B received, 1.73 KiB sent. Если ничего не получено, это может объяснить, почему рукопожатие не удается. Я подозреваю, что это проблема с фаерволом на клиенте (роутер, который у меня в промежутке, не проблема, так как другие устройства в моей домашней сети могут нормально подключиться).

Я недостаточно знаком с iptables, и не уверен, что не так с конфигурацией или как это изменить. Текущие правила на клиенте, пока wg0 активно, следующие…

   iptables --list

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
nixos-fw   all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain nixos-drop (0 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain nixos-fw (1 references)
target     prot opt source               destination
nixos-fw-accept  all  --  anywhere             anywhere
nixos-fw-accept  all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
nixos-fw-accept  tcp  --  anywhere             anywhere             tcp dpt:datasurfsrvsec
nixos-fw-accept  udp  --  anywhere             anywhere             udp dpt:51820
nixos-fw-accept  icmp --  anywhere             anywhere             icmp echo-request
nixos-fw-log-refuse  all  --  anywhere             anywhere

Chain nixos-fw-accept (5 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain nixos-fw-log-refuse (1 references)
target     prot opt source               destination
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN LOG level info prefix "refused connection: "
nixos-fw-refuse  all  --  anywhere             anywhere             PKTTYPE != unicast
nixos-fw-refuse  all  --  anywhere             anywhere

Chain nixos-fw-refuse (2 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

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

Любые предложения будут очень признательны.

Ответ или решение

Здравствуйте,

На основании описанного вами проблемы, мы видим, что клиент WireGuard не получает ответ на рукопожатие от сервера, хотя сервер и получает и отправляет его правильно. Это нередко связано с проблемами в конфигурации сети или брандмауэра. Давайте детально рассмотрим аспекты, которые могут вызывать данное поведение, и способы их устранения.

Теория

WireGuard использует UDP для передачи данных, и корректная настройка сети является ключевой для успешного обмена данными. Любая ошибка в настройках брандмауэра или маршрутизации на стороне клиента может привести к тому, что пакеты не будут доходить до своего получателя или будут отбрасываться.

Пример

На клиентской машине вы наблюдаете, что отправка инициации рукопожатия происходит, но ответ на клиент не приходит. Сервер, однако, регистрирует получение и отправку ответного сообщения рукопожатия. Это указывает на проблему на пути обратно к клиенту.

Ваша конфигурация iptables на клиенте может быть причиной проблемы. Хотя вы открыли порт 51820 для UDP, общая конфигурация брандмауэра может блокировать возвратные пакеты от сервера.

Применение

  1. Проверка конфигурации брандмауэра:

    • Убедитесь, что на клиенте разрешены входящие соединения на порту 51820 UDP.
    • Проверьте правила iptables, особенно цепочки INPUT, OUTPUT и никаких специфичных DROP или REJECT правил для UDP.
    # Убедитесь, что входящие и исходящие соединения через UDP на порту 51820 разрешены
    iptables -A INPUT -p udp --dport 51820 -j ACCEPT
    iptables -A OUTPUT -p udp --sport 51820 -j ACCEPT
  2. Настройте маршрутизацию:

    Убедитесь, что клиентская машина правильно настроена для обработки трафика через интерфейс WireGuard:

    • Подтвердите, что маршрут до сервера и обратно настроен правильно.
    • Проверьте, что MTU интерфейса соответствует рекомендуемым значениям (обычно 1420 для WireGuard).
  3. Проверьте настройки сети:

    Убедитесь, что локальная сеть не блокирует UDP-пакеты, возможно, вам нужно будет проверить настройки роутера или модема.

  4. Диагностика и журналирование:

    • Используйте инструменты tcpdump или wireshark на клиенте, чтобы мониторить входящие пакеты и убедиться, что ответные сообщения действительно не поступают.

Применив данные шаги, вы сможете устранить потенциальные причины проблемы. Если после этих мер проблемы останутся, может потребоваться более глубокая диагностика сети, включая проверку настроек оборудования или обновлений ОС.

Надеюсь, это поможет вам настроить соединение WireGuard на вашем устройстве.

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

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