У меня есть хост, который отправляет пакеты на виртуальную машину, скажем, на 192.168.0.1/24 с 192.168.0.11 или 192.168.0.12 в качестве IP-адреса назначения. Я пытаюсь настроить виртуальную машину как NAT. Он маршрутизирует пакеты, изменяя IP-адрес назначения, в зависимости от исходного IP-адреса назначения, поэтому я не мог использовать только SNAT, поскольку исходный IP-адрес переключался в PREROUTING. Я пытался использовать флаг --set-mark, чтобы помечать пакеты как 11, так и 12, чтобы правила POSTROUTING знали, какое правило SNAT использовать. Вот мои правила:
iptables -t mangle -A PREROUTING --destination 192.168.0.11 -j MARK --set-mark 11
iptables -t nat -A PREROUTING -m mark --mark 11 -i eth0 -j DNAT --to 20.0.21.11
iptables -t nat -A POSTROUTING -m mark --mark 11 -o eth1 -j SNAT --to-source 20.0.1.1
и
iptables -t mangle -A PREROUTING --destination 192.168.0.12 -j MARK --set-mark 12
iptables -t nat -A PREROUTING -m mark --mark 12 -i eth0 -j DNAT --to 20.0.21.11
iptables -t nat -A POSTROUTING -m mark --mark 12 -o eth1 -j SNAT --to-source 20.0.1.2
Мои первые два правила увеличиваются, если я смотрю iptables -t mangle / nat -nvL, но правило POSTROUTING никогда не выполняется. Есть идеи, почему это должно быть?
Я просто подумал об этом, когда писал это. Первая сеть - это подсеть / 24, а вторая сеть в настоящее время настроена как подсеть / 8. Это как-то повлияет на это?
РЕДАКТИРОВАТЬ
Чтобы было немного понятнее.
На этом первом этапе хост отправляет 192.168.0.11/24 или 192.168.0.12/24 из 192.168.0.1/24 на виртуальную машину, вот так.
Destination IPs
HOST ================
=============== +--* 192.168.0.11 *--+ ======
* 192.168.0.1 *--- ================ ---* VM *
=============== +--* 192.168.0.12 *--+ ======
================
Затем я хочу, чтобы виртуальная машина пересылала эти пакеты с изменением обоих IP-адресов назначения на 20.0.21.11/8. Затем измените исходный IP-адрес на 20.0.21.1/8 или 20.0.21.2/8 в зависимости от того, какими были исходные IP-адреса назначения. Вот так.
Source IPs w/ 20.0.21.11 as Destination IP
==============
====== +--* 20.0.21.1 *--+ ============
* VM *--- ============== ---* Test rig *
====== +--* 20.0.21.2 *--+ ============
==============
Также для ясности, это NAT в частной сети. Здесь нет подключения к Интернету. Просто Host <--> VM <--> Test rig
РЕДАКТИРОВАТЬ 2
Еще один рисунок, чтобы было немного понятнее.
Destination IPs Source IPs
HOST ============== =============== Test rig
============= +--*192.168.0.11*-+ | 20.0.21.1 *--+ ==============
*192.168.0.1*--- ============== +--* VM | +--* 20.0.21.11 *
============= +--*192.168.0.12*-+ | 20.0.21.2 *--+ ==============
============== ===============
Вы включили переадресацию IP на хосте? В противном случае ваши вторые правила никогда не будут согласованы, поскольку перенаправленные пакеты будут игнорироваться ядром.
Вы можете проверить с помощью cat /proc/sys/net/ipv4/ip_forward
. Если результат равен нулю, вы можете попробовать echo 1 > /proc/sys/net/ipv4/ip_forward
чтобы увидеть, решит ли это вашу проблему. Если так, echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
заставит настройку пережить перезагрузку.
Я хотел сделать это замечание, но моя репутация была слишком мала. Извините, что опубликовал такой очевидный ответ, но это так много раз меня ловило, что его стоит опубликовать!
Ваши правила выглядят правильно, проверьте, настроены ли у вас мосты, они могут испортить интерфейсы ввода / вывода пакетов. Вы также можете добавить правила -j LOG, чтобы смотреть, что соответствует вашим журналам.