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

ICMP ECHO REPLY не передается правильно через SNAT

Я пытаюсь обеспечить L3-соединение между двумя удаленными сетями LAN (10.0.0.0/24, 10.0.1.0/24) с помощью OpenVPN со следующей настройкой:

+----------------+  +---------------------+  +---------------------+
|VM A            |  |VM B (OpenVPN Server)|  |VM C (OpenVPN Client)|
|eth0:10.0.0.5/24|--|eth0:10.0.0.4/24     |  |eth0:10.0.1.4/24     |
+----------------+  |tun0:10.8.0.1/32     |==|tun0:10.8.0.2/32     |
                    +---------------------+  +---------------------+

Предоставление следующего правила таблицы IP:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.0.0.4

Pinging VMC-> VMA (10.0.0.5) IP-адрес эхо-запроса ICMP правильно настроен по протоколу SNAT на виртуальной машине B:

VM-B# tcpdump -i eth0 icmp
09:27:36.170555 IP 10.0.0.4 > 10.0.0.5: ICMP echo request, id 4049, seq 2, length 64
09:27:36.171201 IP 10.0.0.5 > 10.0.0.4: ICMP echo reply, id 4049, seq 2, length 64

Но эхо-запрос эхо-ответа VMA-> VMC (10.0.1.4) НЕ является SNATed на виртуальной машине B:

VM-B# tcpdump -i eth0 icmp
09:33:31.791095 IP 10.0.0.5 > 10.0.1.4: ICMP echo request, id 6590, seq 2, length 64
09:33:31.795299 IP 10.0.1.4 > 10.0.0.5: ICMP echo reply, id 6590, seq 2, length 64

что в моем случае приводит к отбрасыванию пакета другими базовыми (хост-машиной виртуальной машины) правилами iptables анти-спуфинга для предотвращения спуфинга IP.

Я не понимаю, почему пакет эхо-ответа ICMP не обрабатывается правильно по протоколу SNAT и как это сделать. Спасибо.

Эхо-ответ ICMP - это возвращаемая половина соединения, и не зря они обрабатываются по-другому.

Во-первых, если вы сделал сделать то, что вы хотите, вы сломаете PING: VMA отправит эхо-запрос ICMP на 10.0.1.4, но получить эхо-ответ ICMP (PONG) от 10.0.0.4. Он не будет связывать этот PONG с ранее отправленным PING, поэтому вы увидите 100% потерю пакетов (плюс бесплатные PONG).

Способ обработки SNAT при возвратах состоит в том, чтобы выполнять DNAT при исходящих каналах, и позволить логике упорядочивания NAT обрабатывать де-NAT, деформируя возвращаемую половину трафика. Но вы не можете сделать это здесь, потому что если вы DNAT все, что входит в eth0 VMB, чтобы 10.0.0.4, вы больше не сможете разговаривать с VMB.

Итак, правильное решение - исправить основную проблему и согласовать логику обнаружения марсиан на вашем хосте с вашей реальной схемой IP-адресации.