iptables para NAT transparente

iptables para NAT transparente

Estou tentando rotear de forma transparente o tráfego de uma VM Xen através de outra, assim:

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

Não pergunte por que, apenas experimente o iptables. Consigo rotear com êxito o tráfego HTTP por meio do proxy Squid da VM2 (modo transparente) com

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

mas como posso simplesmente passar por todos os outros tráfegos? Já tentei esta configuração mas me dá erros de "Conexão recusada" ao tentar acessar a Internet a partir da VM1 ( 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

O que há de errado aqui? Já li muitos tutoriais, mas a maioria não funciona corretamente... (Aliás: /proc/sys/net/ipv4/ip_forwardé 1)

Responder1

Em vez de usar REDIRECT, experimente DNAT e SNAT. Experimente isto:

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

Responder2

Finalmente encontrei a maneira correta de fazer isso:

Conexões de saída NAT (VM1 -> Internet/intranet) funcionam com reescrita de origem (SNAT):

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

onde 192.168.2.125está o IP externo atual da VM2 (devenãoser o endereço interno). Como esse IP é atribuído pelo DHCP no meu caso, a regra deve ser alterada para fazer SNAT no IP dinâmico. Isso é feito pelo comando MASQUERADE:

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

A configuração final do iptables agora se parece com isto (outras tabelas/cadeias estão vazias):

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

informação relacionada