Назад | Перейти на главную страницу

Iptables не работает с сетевыми интерфейсами с длинными именами?

Раньше я настраивал iptables для пересылки пакетов между различными сетевыми интерфейсами на сервере с несколькими сетевыми интерфейсами.

Пока все работало нормально, пока я не обновил свой сервер до Ubuntu 1604.

Ubuntu 1604 поставляется с новым ядром, которое переименовывает сетевые интерфейсы (Предсказуемые имена сетевых интерфейсов)

Допустим, этот сервер соединяет две подсети вместе:

Как ниже.

               Terminal1(10.1.1.2/24, gateway10.1.1.1)
                                 ||
                                 ||
                                 \/
                   +---------------------------+
                   | enxa0cec80f64f3(10.1.1.1) |
                   |                           |
                   |           Server          |
                   |                           |
                   |   enp3s0(192.168.1.155)   |
                   +---------------------------+
                                 /\
                                 ||
                                 ||
    Host1(192.168.1.111/24, route to 10.1.1.0/24 via 192.168.1.155)

Чтобы хосты в двух сетях могли свободно общаться друг с другом, iptables на сервере настроен как

$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.1.1.0/24 -d 192.168.1.0/24 -i enxa0cec80f64f3 -o enp3s0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 192.168.1.0/24 -d 10.1.1.0/24 -i enp3s0 -o enxa0cec80f64f3 -m conntrack --ctstate NEW -j ACCEPT

Форвард не работает должным образом.

Когда я проверил сервер с помощью tcpdump, пакеты из enp3s0 сторона не была направлена ​​дальше. (Почему-то не могу просто проверить пакеты с другой стороны)

Может быть, iptables не работает с сетевыми интерфейсами с длинными именами, такими как enxa0cec80f64f3?

Правильный тест для пересылки - это будут ли пакеты, которые присутствуют на одном интерфейсе с местом назначения, к которому будет осуществляться доступ через другой, также появятся на этом другом интерфейсе, и правильный способ проверить это, например, tcpdump. Здесь переадресация происходит правильно; трафик на внутреннем интерфейсе:

[me@router ~]$ sudo tcpdump -n -n -i em2 icmp 
[...]
07:03:55.490295 IP 178.18.x.139 > 178.18.123.145: ICMP echo request, id 56423, seq 1, length 64
07:03:56.491899 IP 178.18.x.139 > 178.18.123.145: ICMP echo request, id 56423, seq 2, length 64

и заодно на внешнем:

[me@router ~]$ sudo tcpdump -n -n -i em1 icmp
[...]
07:03:55.490588 IP 178.18.x.139 > 178.18.123.145: ICMP echo request, id 56423, seq 1, length 64
07:03:56.492255 IP 178.18.x.139 > 178.18.123.145: ICMP echo request, id 56423, seq 2, length 64

Если вы этого не видите, а в вашем случае нет, первое, что нужно проверить, это iptables. Но, как указал Майкл Хэмптон, ваши правила ничего но ACCEPTв них, так что это не может быть проблемой. Вам также посоветовали проверить переключатель пересылки большого ядра

[me@router ~]$ cat /proc/sys/net/ipv4/ip_forward
1

который в вашем случае вернулся 0 - означает, что пересылка не была включена. Исправив это, предположительно, изменив соответствующую строку в /etc/sysctl.conf и бег sysctl -p, исправил проблему.