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

iptables для прозрачного NAT

Я пытаюсь прозрачно маршрутизировать трафик одной виртуальной машины Xen через другую, например:

-------      192.168.250.4          192.168.250.3     ---------
| VM1 |   <-----------------bridged---------------->  | VM2   |  <-----> Internet
-------                                               | with  |
                                                      | squid |
                                                      | proxy |
                                                      ---------

Не спрашивайте почему, просто экспериментируйте с iptables. Я могу успешно маршрутизировать HTTP-трафик через прокси-сервер VM2 Squid (прозрачный режим) с

iptables -t nat -A PREROUTING -p tcp --dport 80 –s ! 192.168.250.3 -j REDIRECT --to-port 3128

но как я могу просто пропустить весь другой трафик? Я уже пробовал эту конфигурацию, но она выдает ошибку «Соединение отклонено» при попытке доступа в Интернет с ВМ1 (192.168.250.4):

vm2:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
# route outgoing udp traffic
DNAT       udp  -- !192.168.250.3        0.0.0.0/0           udp dpt:!80 to:192.168.250.3
# route outgoing tcp traffic
DNAT       tcp  -- !192.168.250.3        0.0.0.0/0           tcp dpt:!80 to:192.168.250.3
# this is the working squid rule
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 3128

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
# route incoming traffic
SNAT       all  --  0.0.0.0/0            192.168.250.3       to:192.168.250.4 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Что здесь не так? Я уже прочитал много руководств, но большинство из них не работают должным образом ... (Кстати: /proc/sys/net/ipv4/ip_forward равно 1)

Вместо использования REDIRECT попробуйте DNAT и SNAT. Попробуй это:

iptables -t nat -I PREROUTING -d 192.168.250.3 -j DNAT --to-destination 192.168.250.4 iptables -t nat -I POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.250.3

Наконец-то я нашел правильный способ сделать это:

NAT-ing исходящих подключений (VM1 -> Интернет / интрасеть) работает с перезаписью источника (SNAT):

iptables -t nat -A POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.2.125

где 192.168.2.125 это текущий внешний IP-адрес виртуальной машины 2 (должен не быть внутренним адресом). Поскольку в моем случае этот IP-адрес назначается DHCP, необходимо изменить правило, чтобы выполнять SNAT на динамическом IP-адресе. Это делается командой MASQUERADE:

iptables -t nat -A POSTROUTING -s 192.168.250.4 -j MASQUERADE

Окончательная конфигурация iptables теперь выглядит следующим образом (другие таблицы / цепочки пусты):

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.250.4        0.0.0.0/0