У меня есть многосетевой сервер 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
Проблема в том, что, поскольку маршрут по умолчанию проходит через eth2, ответы ping отправляются через 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. Вы должны добавить схему сети и трассировку для каждой сети с каждого устройства.