Невозможно пропинговать многосетевой компьютер Linux с интерфейсом не по умолчанию
У меня есть многосетевой сервер Ubuntu с набором интерфейсов, который включает в себя:
eth2: 10.10.0.131/24
eth3: 10.20.0.2/24
Интерфейсом по умолчанию является eth2 со шлюзом 10.10.0.1. Вот как выглядит таблица маршрутизации:
root@c220-1:~# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.10.0.1 0.0.0.0 UG 0 0 0 eth2
10.10.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
10.20.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
10.30.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.40.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
Из отдельной сети (192.168.3.5/24
) Я могу связаться с этой машиной по интерфейсу eth2 (тот, который имеет шлюз по умолчанию), но не через интерфейс eth3. Я могу пинговать интерфейс eth3 с маршрутизатора в той же сети (10.20.0.1) без проблем.
Если я пинг 10.10.0.131 из 192.168.3.5, пакеты достигают машины, но он не отправляет никаких ответов:
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 98: 192.168.3.5 > 10.20.0.2: ICMP echo request, id 5451, seq 0, length 64
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 98: 192.168.3.5 > 10.20.0.2: ICMP echo request, id 5451, seq 1, length 64
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 98: 192.168.3.5 > 10.20.0.2: ICMP echo request, id 5451, seq 2, length 64
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 98: 192.168.3.5 > 10.20.0.2: ICMP echo request, id 5451, seq 3, length 64
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 98: 192.168.3.5 > 10.20.0.2: ICMP echo request, id 5451, seq 4, length 64
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 98: 192.168.3.5 > 10.20.0.2: ICMP echo request, id 5451, seq 5, length 64
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 98: 192.168.3.5 > 10.20.0.2: ICMP echo request, id 5451, seq 6, length 64
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 98: 192.168.3.5 > 10.20.0.2: ICMP echo request, id 5451, seq 7, length 64
Если я пинг с маршрутизатора (10.20.0.1) в той же сети, сервер отвечает правильно:
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 114: 10.20.0.1 > 10.20.0.2: ICMP echo request, id 28899, seq 2932, length 80
73:10:73:e4:10:06 > c4:c8:80:90:22:eb, IPv4, length 114: 10.20.0.2 > 10.20.0.1: ICMP echo reply, id 28899, seq 2932, length 80
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 114: 10.20.0.1 > 10.20.0.2: ICMP echo request, id 28899, seq 2932, length 80
73:10:73:e4:10:06 > c4:c8:80:90:22:eb, IPv4, length 114: 10.20.0.2 > 10.20.0.1: ICMP echo reply, id 28899, seq 2932, length 80
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 114: 10.20.0.1 > 10.20.0.2: ICMP echo request, id 28899, seq 2932, length 80
73:10:73:e4:10:06 > c4:c8:80:90:22:eb, IPv4, length 114: 10.20.0.2 > 10.20.0.1: ICMP echo reply, id 28899, seq 2932, length 80
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 114: 10.20.0.1 > 10.20.0.2: ICMP echo request, id 28899, seq 2932, length 80
73:10:73:e4:10:06 > c4:c8:80:90:22:eb, IPv4, length 114: 10.20.0.2 > 10.20.0.1: ICMP echo reply, id 28899, seq 2932, length 80
c4:c8:80:90:22:eb > 73:10:73:e4:10:06, IPv4, length 114: 10.20.0.1 > 10.20.0.2: ICMP echo request, id 28899, seq 2932, length 80
73:10:73:e4:10:06 > c4:c8:80:90:22:eb, IPv4, length 114: 10.20.0.2 > 10.20.0.1: ICMP echo reply, id 28899, seq 2932, length 80
Обратите внимание, что согласно ответу на этот похожий вопрос у меня отключен rp_filter на всех интерфейсах, но это не решает проблему:
$ for i in eth0 eth1 eth2 eth3 all default
> do
> cat /proc/sys/net/ipv4/conf/$i/rp_filter
> done
0
0
0
0
0
0
2 ответа
Проблема в том, что, поскольку маршрут по умолчанию - через eth2, ответы на эхо-запросы отправляются через eth2, даже если запросы были получены по eth3. (Если вы используете tcpdump eth2, вы должны увидеть отправленные ответы.) Вероятно, есть какое-то устройство, которое отбрасывает пакеты, потому что у них неверный IP-адрес источника для сети, в которой они находятся. Вам нужна некоторая маршрутизация политики источника, чтобы получить ответы, которые будут отправлены на интерфейс, на который они были получены.
Создайте новую таблицу маршрутизации (нужно сделать только один раз):
echo 13 eth3 >> /etc/iproute2/rt_tables
Добавьте маршрут по умолчанию к этой новой таблице, выходя из eth3:
ip route add default via 10.20.0.1 table eth3
Добавьте правило политики, чтобы использовать эту новую таблицу для пакетов с исходным адресом IP-адреса eth3:
ip rule add from 10.20.0.2 lookup eth3
Из отдельной сети (192.168.3.5/24) я могу подключиться к этой машине через интерфейс eth2 (тот, который имеет шлюз по умолчанию), но не через интерфейс eth3. Я могу пинговать интерфейс eth3 с маршрутизатора в той же сети (10.20.0.1) без проблем.
Похоже, вы пропустили маршрут на 192.168.3.5/24 из подсети 10.30.0/24. Вы должны добавить схему сети и трассировки для каждой сети с каждого устройства.