
Что произойдет, если хост в сети получит IP-пакет с MAC-адресом источника, который отличается от MAC-адреса в локальной таблице ARP для этого исходного IP-адреса?
Запись таблицы ARP для этого IP-адреса была и будет заполнена посредством действительного ответа ARP.
Теперь я заметил, что принимающий хост (Ubuntu 18.04) не отправляет ответный пакет (ICMP echo response или TCP SYN/ACK ...и т.д.). Никакой ответный пакет не покидает интерфейс.
Теперь возникает вопрос, по каким причинам хозяин ведет себя таким образом. Какие проверки проводятся с MAC- и IP-адресами пакетов, локальной таблицей ARP и таблицей маршрутизации и т. д.?
Редактировать:
Чтобы прояснить ситуацию:
Если хост Hb отправляет запрос ping на 10.2.0.5 (хост Ha), Ha получает ICMP-пакет с исходным IP-адресом 10.1.0.3, а исходный MAC-адрес — это MAC-адрес маршрутизатора. Но в таблице ARP хоста Ha есть запись: 10.1.0.3 -> MAC-адрес Hb. Таким образом, MAC-адреса различаются!
решение1
Такое поведение вполне ожидаемо и связано с конфигурацией маршрутизации хоста Hb
, который, скорее всего, имеет только маршрут по умолчанию через маршрутизатор. Таким образом, если вы не настроили дополнительный маршрут, пакеты в N2
сеть ( 10.2.0.0/24
) отправляются через маршрут по умолчанию.
Таким образом, проблема вызвана включенным фильтром обратного пути на Ha
хосте, который отбрасывает входящие пакеты из-за ограничений по адресу источника.
Чтобы устранить эту проблему, вам следует проверить вывод следующих команд на Ha
хосте:
ip netconf show dev <iface-N2>
- проверьтеrp_filter
значение. Скорее всего, этоstrict
.ip route get 10.2.0.5 from 10.1.0.3 iif <iface-N2>
- скорее всего, он покажет что-то вродеinvalid cross-device link
.nstat -az TcpExtIPReversePathFilter
- скорее всего, он будет иметь ненулевое значение.
Есть три незаметных способа решить эту проблему:
Просто отключите
rp_filter
наHa
хосте с помощью sysctl (sysctl -w net.ipv4.conf.all.rp_filter=0
иsysctl -w net.ipv4.conf.<iface-N2>.rp_filter=0
). Также вам следует отредактировать/etc/sysctl.conf
файл, чтобы сделать эти изменения постоянными.Просто добавьте маршрут на
Hb
хосте к10.2.0.5
сквозному10.1.0.5
адресу (команда для Linuxip route add 10.2.0.5 via 10.1.0.5
, для Windowsroute add 10.2.0.5 mask 255.255.255.255 10.1.0.5
)Настройте трансляцию исходного адреса (NAT) на маршрутизаторе, чтобы переписать адрес
Hb
на адрес маршрутизатора. Правило iptables для этого:
iptables -t nat -A POSTROUTING -o <iface-N2> --src 10.1.0.3 --dst 10.2.0.5 -j MASQUERADE