Вопрос или проблема
У меня есть очень простая настройка, которая должна перенаправлять трафик между интерфейсом WireGuard (wg0) и интерфейсом LAN (enp0s25).
[ другой хост LAN ] <---> enp0s25 [ сервер ] wg0 <---> [ удаленный узел]
10.131.12.2 10.131.12.19 10.131.6.6 10.131.6.1
# sysctl -n net.ipv4.ip_forward
1
# nft list ruleset
table inet firewall {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
iifname "wg0" masquerade
oifname "wg0" masquerade
}
}
Это работает хорошо. Однако я хочу использовать виртуальные машины, поэтому создаю интерфейс моста в /etc/network/interfaces
с тем же MAC-адресом, что и enp0s25
:
allow-hotplug enp0s25
iface enp0s25 inet manual
auto br0
iface br0 inet dhcp
bridge_ports enp0s25
hwaddress ether d0:50:99:89:8d:e0
[ другой хост LAN ] <---> enp0s25/br0 [ сервер ] wg0 <---> [ удаленный узел]
10.131.12.2 10.131.12.19 10.131.6.6 10.131.6.1
Теперь я могу достучаться только до самого компьютера с wg0
, но не до других машин в LAN.
tcpdump показывает (описания добавлены к IP-адресам для ясности):
# tcpdump -i wg0 icmp
11:48:35.968486 IP 10.131.6.1 (удаленный узел wg) > 10.131.12.2 (другой хост LAN): ICMP запрос эхо, id 18176, seq 1072, длина 64
11:48:37.049028 IP 10.131.6.1 (удаленный узел wg) > 10.131.12.2 (другой хост LAN): ICMP запрос эхо, id 18176, seq 1073, длина 64
11:48:37.966377 IP 10.131.6.1 (удаленный узел wg) > 10.131.12.2 (другой хост LAN): ICMP запрос эхо, id 18176, seq 1074, длина 64
# tcpdump -i enp0s25 icmp
11:48:35.968513 IP 10.131.12.19 (этот хост) > 10.131.12.2 (другой хост LAN): ICMP запрос эхо, id 18176, seq 1072, длина 64
11:48:35.968752 IP 10.131.12.2 (другой хост LAN) > 10.131.12.19 (этот хост): ICMP ответ эхо, id 18176, seq 1072, длина 64
11:48:37.049057 IP 10.131.12.19 (этот хост) > 10.131.12.2 (другой хост LAN): ICMP запрос эхо, id 18176, seq 1073, длина 64
11:48:37.049300 IP 10.131.12.2 (другой хост LAN) > 10.131.12.19 (этот хост): ICMP ответ эхо, id 18176, seq 1073, длина 64
11:48:37.966399 IP 10.131.12.19 (этот хост) > 10.131.12.2 (другой хост LAN): ICMP запрос эхо, id 18176, seq 1074, длина 64
Запросы доходят от удаленного узла WG до другого хоста LAN и возвращаются обратно на сервер, но по какой-то причине не возвращаются на удаленный узел WG.
.
Ответ или решение
В вашей задаче вы сталкиваетесь с проблемой, связанной с перенаправлением трафика между интерфейсом WireGuard (wg0) и локальной сетью (LAN), когда в процесс вовлечен мостовой интерфейс (bridge interface) enp0s25/br0. Давайте подробно разберем эту проблему и предложим возможные решения.
Теория
Проблема, с которой вы сталкиваетесь, связана с маршрутизацией и обработкой сетевых пакетов в системе, когда используется мостовой интерфейс. Основной причиной может быть изменение сетевого стека и маршрутизации пакетов в системе после добавления br0.
-
Мостовой интерфейс (bridge interface):
Мостовой интерфейс объединяет несколько сетевых интерфейсов на канальном уровне (L2). Это значит, что пакеты пересылаются на уровне MAC-адресов без участия маршрутизации IP. Когда вы прикрепляете enp0s25 к мосту br0, изменяется поведение обработки пакетов, и это может повлиять на пересылку трафика. -
IP-адресация и маршрутизация:
Когда вы создаете мост, IP-адрес в большинстве случаев назначается самому мосту, а не физическому интерфейсу, который является частью моста. Это может изменить поведение маршрутизации, так как теперь IP-адрес привязан к br0, а не к enp0s25. -
Таблицы NAT и forarding пакетов:
Ваша конфигурация NAT с использованиемnftables
может также не учитывать изменения, связанные с добавлением моста. Например, правила NAT, которые работают на physical интерфейсе, могут не применяться автоматически на уровне моста.
Пример
Ваш вывод tcpdump
показывает, что ICMP запросы и ответы доходят до сервера, но не доходят обратно до удаленного WG хоста. Это указывает на проблему на этапе пересылки пакетов, когда они должны вернуться через интерфейс wg0.
Применение
Для исправления вашей конфигурации следуйте следующим шагам:
-
Проверьте правила NAT:
Убедитесь, что в правилах NAT учтен мостовой интерфейс. Возможно, потребуется добавить дополнительные правила для обработки трафика, проходящего через br0.table inet firewall { chain postrouting { type nat hook postrouting priority srcnat; policy accept; iifname "wg0" masquerade oifname "wg0" masquerade oifname "br0" masquerade } }
-
Маршрутизация IP:
Проверьте таблицы маршрутизации и убедитесь, что маршруты для сети WireGuard и LAN настроены корректно. Пакеты должны правильно маршрутизироваться через br0.ip route
Если маршрут для сети 10.131.12.0 не настроен на br0, это может быть причиной проблемы. Добавьте соответствующий маршрут, если необходимо.
-
Настройки мостового интерфейса:
Проверьте конфигурацию IP в файле/etc/network/interfaces
. Убедитесь, что IP-адреса правильно сконфигурированы и приязыаны к br0. -
Firewall и iptables/nftables:
Проверьте все правила iptables/nftables и их взаимодействие с bridge. Возможно, потребуется разрешить расшаривание трафика через все интерфейсы. -
Согласованность MAC-адресов:
Проверьте, чтобы один и тот же MAC-адрес не использовался на разных интерфейсах, что может вызвать проблемы с сетевыми Switch’ами. -
Отладка и Логирование:
Включите детальное логирование для диагностики пакетов, которые могут блокироваться различными фильтрами. Используйтеnft
иlogger
для логирования в реальном времени.
Следуя указанным шагам, вы сможете диагностировать проблему подробнее и, вероятно, устранить причины, из-за которых пакеты не возвращаются к удаленному WG узлу. Рассмотрите возможность использования более продвинутых средств мониторинга сетевого трафика для более глубокого анализа, таких как Wireshark
или встроенные средства в Linux для контроля трафика.