Eu reorganizo e refino as suas regras:
$iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Esta regra permite que o firewall ENCAMINHE (ou seja, atue como roteador) para todos os pacotes que entram eth1 (local) e roteados para sair via eth0 (Internet)
$iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Esta regra executa o Source NAT: Ele substitui o endereço de origem dos pacotes de saída de 192.168.1.xxx para o seu endereço IP público, enquanto ao mesmo tempo registra o detalhes do NAT na tabela conntrack
(rastreamento de conexão) do roteador.
Como os detalhes do NAT são registrados, os pacotes de resposta da Internet serão verificados nessa tabela. Se a resposta corresponder a uma entrada conntrack, o pacote experimentará um 'NAT inverso' (meu termo), ou seja, substituindo o endereço de destino (lembre-se, é uma resposta!) Com o endereço do remetente original ( 192.168.1.xxx)
$iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
Esta regra permite que os pacotes que são respostas ao pacote de saída (por exemplo, o SNAT-ed acima) sejam roteados para a rede local.
Now gateway(192.168.1.1) receives this packet on interface eth1 and alters the source ip to ip address of interface eth0 and updates some table with a entry to reverse lookup when the response is received.Which rules is responsible for this operation rule1/rule 2?
É uma combinação das Regras 2 & 3 (no seu post original)
Say an application on gateway needs to access internet and creates packet and sends over eth0, when the response is received how the packet is routed to application on the gateway instead of transmitting the packet over interface eth1 according to rule1?
Se o próprio gateway enviar um pacote de saída, o pacote não corresponderá a nenhuma entrada da tabela conntrack e, portanto, não será 'inverso' NAT-ed '.
When sending a packet rule3 alters the source ip and it is called soruce NAT, simlarly when a reply packet is received on eth0, destination address changed, is it not destination NAT? why isn't a rule for that.?
Tecnicamente , é um DNAT. Mas o netfilter (isto é, a estrutura de filtragem de pacotes / manuseio que é o 'mecanismo' do iptables) é inteligente o suficiente. Sempre que um pacote de entrada é recebido, ele é combinado com a tabela conntrack do netfilter. Se o pacote é uma resposta a uma conexão de saída existente (sinalizador ACK, IP: porta correspondente, número de sequência TCP correspondente, etc), o netfilter automaticamente executa o DNAT. Não há necessidade de regras adicionais.
Suppose say there is another interface eth2 which is also connected to internet with a public ip and a default route exists in the routing table to route the traffic through this device :
$ip route add default via <IP> dev eth2 scope link
iptables forward chain rules of filter table say to exit the packets over eth0 but the routing table has default route through eth2, in this case which interface is used for internet?
iptables não executa o roteamento; ele age contra pacotes após eles são roteados pelo iproute2 (isto é, a estrutura de roteamento do Linux). É por isso que a cadeia da regra é chamada de "POSTROUTING".
Se o cenário é como você explicou, o iproute2 fará com que o kernel Linux envie os pacotes via eth2. Nesse caso, a regra original -t nat -A POSTROUTING -o eth0 -j MASQUERADE
não corresponderá mais e MASQUERADE / SNAT não será mais executada.
Is it possible to route the traffic that is forwarded from eth1(local n/w) to eth0 and the application data traffic that originate on gateway over interface eth2?
Sim, mas você precisa da ajuda de iproute2 .
Primeiro, você deve criar duas novas tabelas de roteamento. Vamos chamá-los de 100 e 102:
ip route add default via $DG_eth0 dev eth1 table 100
ip route add default via $DG_eth2 dev eth2 table 102
Em seguida, você cria políticas de roteamento:
# Rule #10: All packets must refer to the 'main' table
ip rule add order 10 from all lookup main
# Rule #20: Packets entering eth1 must refer to the '100' table
ip rule add order 20 iif eth1 lookup 100
# Rule #30: Packets from this gateway must refer to the '102' table
ip rule add order 30 iif lo lookup 102
Finalmente, você exclui a rota padrão na tabela main:
ip route delete default table main
A tabela main
é importante porque contém uma lista de todas as sub-redes em torno do seu gateway; é por isso que ainda deve ser mencionado na Regra 10.
Espero que eu seja claro o suficiente. Sinta-se à vontade para me fazer mais perguntas sobre o iptables.