Раньше я настраивал iptables для пересылки пакетов между различными сетевыми интерфейсами на сервере с несколькими сетевыми интерфейсами.
Пока все работало нормально, пока я не обновил свой сервер до Ubuntu 1604.
Ubuntu 1604 поставляется с новым ядром, которое переименовывает сетевые интерфейсы (Предсказуемые имена сетевых интерфейсов)
Допустим, этот сервер соединяет две подсети вместе:
enp3s0
с ip 192.168.1.155
, подключается к сети 192.168.1.0/24
,enxa0cec80f64f3
с ip 10.1.1.1
подключается к сети 10.1.1.0/24
.Как ниже.
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
Форвард не работает должным образом.
192.168.1.155
, ДОБИТЬСЯ УСПЕХА;10.1.1.1
, ДОБИТЬСЯ УСПЕХА;10.1.1.2
), НЕ СМОГЛИ;Когда я проверил сервер с помощью 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
, исправил проблему.