Я пытаюсь обеспечить 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-адресации.