Eu tenho um roteador Linux simples com vários NICs e encaminhamento IPv4 habilitado.
O roteador possui dois endereços IP WAN estáticos, atribuÃdos a uma interface ( eth0
, eth0:0
). (No texto a seguir, ofuscarei os endereços IP públicos reais (257 como um octeto).)
O roteador pode receber ping em ambos os endereços IP WAN externos da Internet externa.
Interfaces:
eth0
: Conexão com a Internet, 134.257.10. 24/10 , gateway 134.257.10.1eth0:0
: Segundo endereço IP nessa interface: 134.257.10. 20/24 _eth1
: LAN 1, 192.168.1.1/24eth2
: LAN2, 192.168.2.1/24eth3
: LAN 3, 192.168.3.1/24
Minha configuração funciona e todos os clientes LAN (LAN 1-3) podem acessar a Internet e são vistos externamente como 134.257.10. 10 . Além disso, tenho dois encaminhamentos de porta de entrada.
Minha tabela NAT do iptables é assim:
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Port forwarding:
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
-A PREROUTING -i eth0:0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.3.33:25
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
Como posso fazer com que os clientes LAN3 ( eth3
) apareçam como 134.257.10. 20 na Internet ( eth0:0
) para conexões de saÃda em vez de 134.257.10. 10 ( eth0
)?
Use SNAT em vez de MASQUERADE
... para escolher algo diferente do padrão.
Em vez de usar MASQUERADE para o caso genérico (todas as outras LANs), adicione uma exceção SNAT para clientes LAN3. Isso deve corresponder antes da outra regra nat/POSTROUTING para substituÃ-la, portanto
-I
é usado abaixo em vez de-A
ser aplicado no local correto no conjunto de regras existente (lembre-se do falso 257):iptables (ao contrário de nftables ) não pode corresponder à interface de entrada de um pacote roteado em um gancho POSTROUTING, portanto
-i eth3
não pode ser usado acima, e a correspondência é feita verificando a origem do endereço IP original.Resolver um problema com
eth0:0
Enquanto estiver fazendo isso, corrija o uso incorreto do chamado nome de interface de alias, que é um conceito que existe apenas para compatibilidade com o
ifconfig
comando do Linux, cujo uso está obsoleto há mais de 20 anos no Linux, mas ainda existe. Na verdade, no Linuxifconfig
não é possÃvel lidar com mais de um endereço IPv4 em uma interface e esta solução alternativa está aqui para superar isso.eth0:0
na verdade, é visto por qualquer outra coisa que não sejaifconfig
, incluindo o kernel, como o endereço 134.257.10.20/24 definidoeth0
com um rótulo associadoeth0:0
. Este endereço secundário poderia ter sido adicionado assim (depois que o endereço principal já estivesse definido) com oip addr
equivalente moderno:Isso é importante porque o iptables não corresponderá corretamente a uma regra usando
eth0:0
. Portanto, ele deve ser substituÃdo no iptables por uma verificação na interface:eth0
além de uma verificação no endereço IP na mesma regra.Portanto, se a porta 80 for destinada a atingir 192.168.1.10:80 apenas para o primeiro endereço IP público e não para ambos, substitua:
com:
Se for para ambos os endereços, a regra inicial está correta.
Mas com certeza a regra para a porta 25 deveria ser reescrita assim:
A correspondência tem que ser feita na interface real (
eth0
) e no endereço, porque é issoeth0:0
: o endereço e não uma interface.O conjunto de regras final torna-se então (lembre-se do falso 257, é claro):