AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 760179
Accepted
MrSnrub
MrSnrub
Asked: 2023-10-30 12:19:56 +0800 CST2023-10-30 12:19:56 +0800 CST 2023-10-30 12:19:56 +0800 CST

Roteador NAT com 2 IPs WAN externos A+B e múltiplas LANs internas: Deixe 1 LAN usar o endereço IP externo B, todos os outros A

  • 772

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.1
  • eth0:0: Segundo endereço IP nessa interface: 134.257.10. 20/24 _
  • eth1: LAN 1, 192.168.1.1/24
  • eth2: LAN2, 192.168.2.1/24
  • eth3: 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)?

iptables
  • 1 1 respostas
  • 129 Views

1 respostas

  • Voted
  1. Best Answer
    A.B
    2023-10-30T15:42:19+08:002023-10-30T15:42:19+08:00

    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 -Aser aplicado no local correto no conjunto de regras existente (lembre-se do falso 257):

    iptables -t nat -I POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT --to-source 134.257.10.20
    

    iptables (ao contrário de nftables ) não pode corresponder à interface de entrada de um pacote roteado em um gancho POSTROUTING, portanto -i eth3não pode ser usado acima, e a correspondência é feita verificando a origem do endereço IP original.


    Resolver um problema cometh0: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 ifconfigcomando do Linux, cujo uso está obsoleto há mais de 20 anos no Linux, mas ainda existe. Na verdade, no Linux ifconfignã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:0na verdade, é visto por qualquer outra coisa que não seja ifconfig, incluindo o kernel, como o endereço 134.257.10.20/24 definido eth0com um rótulo associado eth0:0. Este endereço secundário poderia ter sido adicionado assim (depois que o endereço principal já estivesse definido) com o ip addrequivalente moderno:

    ip addr add 134.257.10.20/24 brd + label eth0:0 dev eth0 
    

    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: eth0alé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:

    -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
    

    com:

    -A PREROUTING -i eth0 -d 134.257.10.10 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
    

    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 PREROUTING -i eth0 -d 134.257.10.20 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.3.33:25
    

    A correspondência tem que ser feita na interface real ( eth0) e no endereço, porque é isso eth0:0: o endereço e não uma interface.

    O conjunto de regras final torna-se então (lembre-se do falso 257, é claro):

    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    -A PREROUTING -d 134.257.10.10/32 -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
    -A PREROUTING -d 134.257.10.20/32 -i eth0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.3.33:25
    -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT --to-source 134.257.10.20
    -A POSTROUTING -o eth0 -j MASQUERADE
    COMMIT
    
    • 3

relate perguntas

  • Uma pequena dúvida sobre MASQUERADE e SNAT/DNAT

  • iptables não filtra tráfego em ponte

  • iptables persistentes

  • Regras do Iptables para permitir que o appVM passe pelo proxyVM configurado para passar apenas por uma VPN no QubesOS

  • Como fazer todo o tráfego passar por uma interface no Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve