Вопрос или проблема
Возникли проблемы с настройкой 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, общая конфигурация брандмауэра может блокировать возвратные пакеты от сервера.
Применение
-
Проверка конфигурации брандмауэра:
- Убедитесь, что на клиенте разрешены входящие соединения на порту 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
-
Настройте маршрутизацию:
Убедитесь, что клиентская машина правильно настроена для обработки трафика через интерфейс WireGuard:
- Подтвердите, что маршрут до сервера и обратно настроен правильно.
- Проверьте, что MTU интерфейса соответствует рекомендуемым значениям (обычно 1420 для WireGuard).
-
Проверьте настройки сети:
Убедитесь, что локальная сеть не блокирует UDP-пакеты, возможно, вам нужно будет проверить настройки роутера или модема.
-
Диагностика и журналирование:
- Используйте инструменты
tcpdump
илиwireshark
на клиенте, чтобы мониторить входящие пакеты и убедиться, что ответные сообщения действительно не поступают.
- Используйте инструменты
Применив данные шаги, вы сможете устранить потенциальные причины проблемы. Если после этих мер проблемы останутся, может потребоваться более глубокая диагностика сети, включая проверку настроек оборудования или обновлений ОС.
Надеюсь, это поможет вам настроить соединение WireGuard на вашем устройстве.