Вопрос или проблема
Я настраиваю Linux-систему в качестве маршрутизатора. И моя сеть довольно проста на данный момент:
- У меня маршрутизатор подключен к оптоволоконному модему, который проходит аутентификацию у моего интернет-провайдера с помощью
pppd
. - У меня есть Ethernet-интерфейс,
enp2s0
, который является шлюзом на маршрутизаторе:
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::20d:b9ff:fe5a:2f91 prefixlen 64 scopeid 0x20<link>
ether 00:0d:b9:5a:2f:91 txqueuelen 1000 (Ethernet)
RX packets 57348511 bytes 31510953543 (29.3 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 116229180 bytes 129467792313 (120.5 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xf7a00000-f7a1ffff
- У меня есть беспроводной интерфейс:
wlp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.1.2 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::6f0:21ff:fe91:cf90 prefixlen 64 scopeid 0x20<link>
ether 04:f0:21:91:cf:90 txqueuelen 1000 (Ethernet)
RX packets 493730 bytes 595814115 (568.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 355275 bytes 344035494 (328.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
К которому я хотел бы, чтобы клиенты подключались.
- У меня есть
nftables
и несколько базовых правил маршрутизации для маршрутизации трафика.
Мои клиенты могут подключаться к Ethernet-интерфейсу нормально. И интернет и т.д. работают как ожидается. Однако, когда я подключаюсь к беспроводному интерфейсу и пингую:
-> % ping -I wlp65s0 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.1.1.48 wlp65s0: 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
60 packets transmitted, 0 received, 100% packet loss, time 60428ms
Я, похоже, не получаю никаких ответов.
На маршрутизаторе я вижу следующее, когда включаю nftables trace
:
trace id 85cd7345 ip filter trace_chain packet: iif "ppp0" ip saddr 8.8.8.8 ip daddr 10.1.1.48 ip dscp af21 ip ecn not-ect ip ttl 61 ip id 0 ip length 84 icmp type echo-reply icmp code net-unreachable icmp id 12 icmp sequence 59 @th,64,96 0xd9d22c6700000000d1790900
trace id 85cd7345 ip filter forward packet: iif "ppp0" oif "enp2s0" ip saddr 8.8.8.8 ip daddr 10.1.1.48 ip dscp af21 ip ecn not-ect ip ttl 60 ip id 0 ip length 84 icmp type echo-reply icmp code net-unreachable icmp id 12 icmp sequence 59 @th,64,96 0xd9d22c6700000000d1790900
trace id 3626e73a ip filter trace_chain packet: iif "wlp4s0" ether saddr 48:ad:9a:9d:5e:a4 ether daddr 04:f0:21:91:cf:90 ip saddr 10.1.1.48 ip daddr 8.8.8.8 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 52040 ip length 84 icmp type echo-request icmp code net-unreachable icmp id 12 icmp sequence 60 @th,64,96 0xdad22c67000000006cd70900
trace id 3626e73a ip filter forward packet: iif "wlp4s0" oif "ppp0" ether saddr 48:ad:9a:9d:5e:a4 ether daddr 04:f0:21:91:cf:90 ip saddr 10.1.1.48 ip daddr 8.8.8.8 ip dscp cs0 ip ecn not-ect ip ttl 63 ip id 52040 ip length 84 icmp type echo-request icmp code net-unreachable icmp id 12 icmp sequence 60 @th,64,96 0xdad22c67000000006cd70900
trace id a6c3e760 ip filter trace_chain packet: iif "ppp0" ip saddr 8.8.8.8 ip daddr 10.1.1.48 ip dscp af21 ip ecn not-ect ip ttl 61 ip id 0 ip length 84 icmp type echo-reply icmp code net-unreachable icmp id 12 icmp sequence 60 @th,64,96 0xdad22c67000000006cd70900
trace id a6c3e760 ip filter forward packet: iif "ppp0" oif "enp2s0" ip saddr 8.8.8.8 ip daddr 10.1.1.48 ip dscp af21 ip ecn not-ect ip ttl 60 ip id 0 ip length 84 icmp type echo-reply icmp code net-unreachable icmp id 12 icmp sequence 60 @th,64,96 0xdad22c67000000006cd70900
Что я не могу понять.
Любые подсказки будут очень полезны.
Если я изменю адрес беспроводного интерфейса на 10.1.2.1, я смогу подключаться к другим хостам в локальной сети/вне сети.
Я полагаю, что маршрутизатор не знает, куда отправлять трафик на 10.1.1.48; он может идти либо через 10.1.1.1 (Ethernet), либо через 10.1.1.2 (Wi-Fi). Поэтому ответ на пинг идет на Ethernet-порт, и беспроводной клиент никогда его не видит. Мы можем видеть это по части iif "ppp0" oif "enp2s0"
трассировки; пакет приходит от ppp0 (это “iif”) и пытается быть отправленным по Ethernet (это “oif”).
Это также объяснит, почему установка беспроводного интерфейса в другую подсеть (10.1.2.1) решает проблему; есть уникальный интерфейс на подсеть.
Если вы хотите, чтобы клиенты Wi-Fi и Ethernet были в одной подсети, то вам, возможно, лучше создать мост. Назовем этот мост “br-lan”. Этот мост получит IP-адрес 10.1.1.1. Затем вы добавляете Ethernet- и Wi-Fi-адаптеры (которые не имеют IP-адресов!) к мосту. Теперь все работает.
Как вы создадите мост, будет зависеть от того, какой дистрибутив Linux вы используете.
На RedHat и производных (например, Alma, Rocky) это можно сделать с помощью сетевого менеджера. Что-то вроде (не протестировано)
nmcli connection delete enp2s0
nmcli connection delete wlp4s0
nmcli connection add type bridge con-name br-lan ifname br-lan bridge.stp no ip4 10.1.1.1/24 ipv6.method disabled
nmcli connection add type bridge-slave con-name enp2s0 ifname enp2s0 master br-lan
nmcli connection add type bridge-slave con-name wlp4s0 ifname wlp4s0 master br-lan
Это удалит любую существующую конфигурацию для Ethernet и Wi-Fi (поэтому будьте осторожны; вы потеряете доступ в сеть на данном этапе; делайте это из консоли) и затем создаст мост с требуемым IP-адресом, после чего прикрепит два интерфейса к нему.
Ответ или решение
Настройка маршрутизаторов Ethernet и Wi-Fi на Linux: Подробное руководство
Введение
В последние годы маршрутизация на базе Linux становится все более популярной из-за своей гибкости и мощных инструментов. В этом руководстве рассматривается распространенная проблема с маршрутизацией, когда клиенты не могут получить ответ от внешних серверов по Wi-Fi. Мы подробно разберем, как настроить маршрутизаторы Ethernet и Wi-Fi в Linux, включая создание моста, чтобы избежать конфликтов маршрутизации в одной подсети.
Описание проблемы
На вашей системе вы успешно настроили маршрутизацию для Ethernet-интерфейса, однако при подключении к беспроводному интерфейсу возникают проблемы с получением ответов от внешних серверов, таких как 8.8.8.8 (DNS-сервер Google). При выполнении команды ping
вы получаете сообщения о 100% потере пакетов, и это поведение подтверждается трассировкой правил nftables
, где видно, что ответ отправляется на Ethernet-интерфейс вместо Wi-Fi.
Решение проблемы с маршрутизацией
-
Конфликт IP-адресов в одной подсети:
При этом ваши Wi-Fi и Ethernet клиентские устройства находятся в одной подсети (10.1.1.0/24), что создает путаницу для маршрутизатора в выборе интерфейса для отправки ответов. Если сетевое устройство использует один и тот же IP-адрес, маршрутизатор не может определить, куда именно отправлять пакеты. -
Создание моста:
Чтобы устранить конфликт и обеспечить стабильную связь между устройствами в одной подсети, рекомендуется настроить мост (bridge). Это позволяет объединить интерфейсы Ethernet и Wi-Fi, таким образом, чтобы все устройства могли взаимодействовать друг с другом без проблем.
Настройка моста на Linux
Следующий шаг — создать мост, который будет интегрировать ваши Ethernet и Wi-Fi интерфейсы. Пример команд для создания моста на системах с NetworkManager, таких как RedHat и его производные (AlmaLinux, Rocky):
nmcli connection delete enp2s0
nmcli connection delete wlp4s0
nmcli connection add type bridge con-name br-lan ifname br-lan bridge.stp no ip4 10.1.1.1/24 ipv6.method disabled
nmcli connection add type bridge-slave con-name enp2s0 ifname enp2s0 master br-lan
nmcli connection add type bridge-slave con-name wlp4s0 ifname wlp4s0 master br-lan
Пояснение команд
-
Удаление существующих конфигураций: Первые две команды удаляют текущие настройки для Ethernet и Wi-Fi интерфейсов. Будьте осторожны, выполняя эти команды, поскольку это может привести к потере сетевого доступа (рекомендуется выполнять из консоли).
-
Создание моста: Следующая команда создает новый интерфейс моста с IP-адресом 10.1.1.1 и отключает протокол IPv6 (если он вам не нужен).
-
Добавление интерфейсов в мост: Последние две команды добавляют Ethernet и Wi-Fi интерфейсы в созданный мост.
Тестирование работы после настройки
После выполнения этих команд и перезапуска сетевых интерфейсов вы можете выполнить ping
на 8.8.8.8 и проверить соединение с интернетом через оба интерфейса. Убедитесь, что устройства в вашей локальной сети (как проводные, так и беспроводные) могут успешно обмениваться данными.
Заключение
Понимание и настройка маршрутизации в Linux требует внимательности и точности. Создание моста между Ethernet и Wi-Fi интерфейсами позволяет избежать конфликтов и обеспечивает стабильную работу сети. Если вы столкнетесь с дополнительными проблемами, рекомендуем обращаться к официальной документации nftables
и сетевым инструментам вашей операционной системы для получения более детальной информации.