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 / 567432
Accepted
Martin
Martin
Asked: 2020-02-14 08:55:11 +0800 CST2020-02-14 08:55:11 +0800 CST 2020-02-14 08:55:11 +0800 CST

Existe um ponto para configurar o endereço de origem SNAT no gateway NAT?

  • 772

Digamos que tenha a seguinte topologia de rede: Configurações de rede do gateway NAT

O gateway NAT linux-routertem a seguinte regra SNAT em vigor:

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  10.99.99.50          anywhere             to:1.1.1.6

Além disso, como visto no desenho, o 1.1.1.6endereço é configurado na lointerface. Tecnicamente, isso não é necessário, ou seja, pode-se excluí-lo e linux-svrainda tem a conectividade. Assim, há um ponto para configurar o endereço de origem SNAT no gateway NAT? Apenas para fins de solução de problemas, pois é mais fácil associar e 1.1.1.6rastrear linux-svr?

iptables nat
  • 1 1 respostas
  • 2061 Views

1 respostas

  • Voted
  1. Best Answer
    A.B
    2020-02-23T06:48:26+08:002020-02-23T06:48:26+08:00

    netfilter é agnóstico de rota. Essa é a coisa importante que explica o que acontece abaixo. O tratamento de NAT do netfilter altera os endereços e, em alguns casos, quando isso é feito antes de uma decisão de rota, isso por sua vez altera a decisão de rota. O netfilter não toma decisões de rota por si mesmo: esse é apenas o papel da pilha de roteamento.

    Estou assumindo abaixo que o linux-router não possui regra de firewall adicional (na tabela de filtros padrão do iptables ), porque nunca foi mencionado na pergunta. Além disso, para evitar a multiplicação de casos para endereçar, estou assumindo que não há outro sistema a ser considerado além de linux-srv (e linux-router ) na LAN 10.99.99.0/24 (não seria difícil resolvê-los também).


    Sobre como remover 1.1.1.6

    O SNAT acontece no POSTROUTING, após qualquer decisão de roteamento. Se o SNAT encontrar um IP que corresponda aos critérios fornecidos, ele adicionará uma entrada conntrack para lidar com as respostas. Algo semelhante a isso acontece no roteador linux (usando conntrack -E -e NEW):

        [NEW] tcp      6 120 SYN_SENT src=10.99.99.50 dst=8.8.8.8 sport=57490 dport=80 [UNREPLIED] src=8.8.8.8 dst=1.1.1.6 sport=80 dport=57490
    

    Não é trabalho do netfilter garantir que as respostas realmente voltem. Esse é novamente o trabalho da pilha de roteamento (incluindo roteamento externo onde o linux-router não tem controle).

    Antes de ser deletado, 1.1.1.6 era um IP de linux-router . A interface onde este IP foi adicionado não importa muito, pois o Linux está seguindo o modelo de host fraco : ele pode responder a consultas a este IP recebidas em qualquer interface. A remoção desta entrada não impedirá o recebimento de pacotes para 1.1.1.6, pois o M10i tem uma rota específica para chegar a 1.1.1.6: usando 1.1.215.48 que pertence ao linux-router . Portanto , o roteador linux nunca recebe uma solicitação ARP para este IP: a solicitação ARP vinda de M10i é sempre 1.1.215.48 (e para dizer o mesmo, a tabela ARP de M10i terá armazenado em cache apenas 1.1.215.48, não 1.1.1.6). Isso significa que a existência deste IP não importa: linux-routersempre receberá tráfego para 1.1.1.6. Mas agora há uma diferença:

    • se o pacote recebido não corresponder a uma entrada conntrack criada anteriormente

    Se o pacote não estiver relacionado à atividade anterior do linux-srv , este pacote alcançará a primeira decisão de rota , como visto neste esquema . De acordo com sua tabela de roteamento atual, deve ser isso:

        # ip route get from 198.51.100.101 iif eth0 1.1.1.6
        1.1.1.6 from 198.51.100.101 via 1.1.215.60 dev eth0 
            cache iif eth0 
    

    Se tivesse sido M10i (ou qualquer sistema na LAN 1.1.215.32/27), o linux-router também teria adicionado redirecionamentos ICMP de tempos em tempos, como isso pode dizer:

        # ip route get from 1.1.215.60 iif eth0 1.1.1.6
        1.1.1.6 from 1.1.215.60 via 1.1.215.60 dev eth0 
            cache <redirect> iif eth0 
    

    De qualquer forma, para pacotes vindos da internet, os pacotes serão enviados de volta para M10i , que provavelmente está implementando Strict Reverse Path Forwarding : este pacote roteado de volta será descartado por M10i , já que sua fonte (198.51.100.101) está no lado errado de sua tabela de roteamento e, portanto, filtrada por Strict Path Forwarding. Sem o Strict Reverse Path Forwarding, isso teria causado um loop entre o M10i e o roteador linux até que o TTL do pacote fosse decrementado para 0 e o pacote também fosse descartado.

    • Se o pacote de entrada corresponder a um fluxo anterior NATed e rastreado por conntrack.

    Exemplo anterior: um pacote de resposta recebido de 8.8.8.8 tcp porta 80 para 1.1.1.6 porta 57490, que seria rastreado por conntrack -E:

         [UPDATE] tcp      6 60 SYN_RECV src=10.99.99.50 dst=8.8.8.8 sport=57490 dport=80 src=8.8.8.8 dst=1.1.1.6 sport=80 dport=57490
         [UPDATE] tcp      6 432000 ESTABLISHED src=10.99.99.50 dst=8.8.8.8 sport=57490 dport=80 src=8.8.8.8 dst=1.1.1.6 sport=80 dport=57490 [ASSURED]
    

    Em algum ponto de pré-roteamento, conntrack irá lidar com "de-SNAT" (como um lembrete, este pacote nunca irá atravessar novamente a tabela nat do iptables , isso também está escrito no esquema anterior: tabela "nat" consultada apenas para "NEW "conexões ). O IP de destino agora é alterado para 10.99.99.50, e o pacote atinge a primeira decisão de rota: ele é roteado para linux-srv . Tudo funciona bem.

    Então eu expliquei o que acontece quando você remove o 1.1.1.6: não afeta o linux-srv como um cliente de internet, mas cria uma pequena interrupção entre o M10i e o linux-router para pacotes de entrada não relacionados.

    Se você quiser que alguns clientes na internet alcancem linux-srv usando uma regra DNAT no linux-router , então para as conexões afetadas (por exemplo: um servidor web na porta tcp linux-srv 80), tudo funcionará sem interrupção. Para outras tentativas, novamente há o pequeno problema entre M10i e linux-router .


    Sobre a remoção do seletor/filtro de IP de origem para a regra SNAT

    Não foi fornecida uma informação: se também existe um seletor/filtro na interface de saída, ou não. As duas regras abaixo obteriam a mesma saída de iptables -t nat -n -L(mas não de iptables -t nat -n -v -Lou melhor iptables-save):

    iptables -t nat -A POSTROUTING -o eth0 -s 10.99.99.254 -j SNAT --to-source 1.1.1.6
    

    ou

    iptables -t nat -A POSTROUTING -s 10.99.99.254 -j SNAT --to-source 1.1.1.6
    

    Na verdade, não importa neste caso se você agora usar um desses dois comandos:

    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 1.1.1.6
    iptables -t nat -A POSTROUTING -j SNAT --to-source 1.1.1.6
    
    • com 1.1.1.6 ainda pertencente ao linux-router

    Como um endereço de destino IP privado não pode ser visto vindo do lado de eth0, o linux-router pode efetivamente rotear apenas um endereço IP: linux-srv 's 10.99.99.50 e esse roteamento só pode acontecer quando é iniciado a partir de 10.99.99.50 primeiro , para que seja SNAT para um IP público. Como o iptables criará uma nova entrada conntrack apenas na conexão inicial (estado NOVO), depois disso a entrada conntrack não será mais alterada e tudo funcionará bem.

    • com 1.1.1.6 removido do roteador linux

    • Para linux-srv , tudo ainda funcionará como esperado quando se conectar à Internet: a explicação anterior também se aplica.

    • Para qualquer conexão de entrada desconhecida de fora para 1.1.1.6 (por exemplo, de 198.51.100.101):

      A pilha de roteamento determina que 1.1.1.6 deve ser roteado para M10i (veja explicação feita anteriormente). Uma entrada tentativa de conntrack é adicionada no estado NEW e o pacote atinge nat/POSTROUTING: o pacote é SNATed para 1.1.1.6 e enviado de volta para M10i . O M10i tem uma rota para 1.1.1.6 e envia novamente o pacote alterado para o linux-router com IP de origem e destino como 1.1.1.6 (como a origem está no lado correto de suas tabelas de roteamento, ele nem é descartado pelo Strict Reverse Path Forwarding ). linux-router recebe um pacote ... de lá eu não posso dizer se é um bug ou não, mas aqui está o que é capturado em um experimento reproduzindo seu caso com conntrack -E, com um único pacote TCP SYN recebido de 198.51.100.101:

           # conntrack -E
               [NEW] tcp      6 120 SYN_SENT src=198.51.100.101 dst=1.1.1.6 sport=48202 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=48202
               [NEW] tcp      6 120 SYN_SENT src=1.1.1.6 dst=1.1.1.6 sport=48202 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=60062
               [NEW] tcp      6 120 SYN_SENT src=1.1.1.6 dst=1.1.1.6 sport=60062 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=23442
               [NEW] tcp      6 120 SYN_SENT src=1.1.1.6 dst=1.1.1.6 sport=23442 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=54429
               [NEW] tcp      6 120 SYN_SENT src=1.1.1.6 dst=1.1.1.6 sport=54429 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=7652
               [NEW] tcp      6 120 SYN_SENT src=1.1.1.6 dst=1.1.1.6 sport=7652 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=34503
               [NEW] tcp      6 120 SYN_SENT src=1.1.1.6 dst=1.1.1.6 sport=34503 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=49256
               [NEW] tcp      6 120 SYN_SENT src=1.1.1.6 dst=1.1.1.6 sport=49256 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=58399
               [NEW] tcp      6 120 SYN_SENT src=1.1.1.6 dst=1.1.1.6 sport=58399 dport=5555 [UNREPLIED] src=1.1.1.6 dst=1.1.1.6 sport=5555 dport=54522
               [...]
      

      Mesmo que o comportamento do netfilter não seja normal, há realmente um loop acontecendo entre o M10i e o linux-router (até que o TTL caia para 0).


    Conclusão

    Não remova o endereço IP local 1.1.1.6. Você está criando problemas de roteamento, e não é função do netfilter corrigir esses problemas de roteamento. Mesmo se você adicionar regras de firewall impedindo esses loops, não é um comportamento sensato usar rotas incorretas.

    Da mesma forma, você pode optar por remover o seletor de IP de origem para a regra SNAT, mas é melhor não se também não houver nenhuma interface selecionada: (ou seja, se você escolher esta regra: iptables -t nat -A POSTROUTING -j SNAT --to-source 1.1.1.6). só está funcionando porque existem endereços IP privados, não roteáveis ​​na Internet, em jogo. Se não fosse esse o caso, qualquer conexão de fora tentando alcançar a LAN atrás da interface eth2 do roteador linux seria SNATed para 1.1.1.6.

    Isso também seria o caso, por exemplo, se você adicionasse uma regra DNAT para ter alguns serviços do linux-srv acessíveis pela Internet, impedindo que o linux-srv veja um endereço de origem diferente de 1.1.1.6. Aqui está um exemplo concreto em uma simulação (com uma restauração sã de 1.1.1.6 para linux-router ):

    # ip -br a
    lo               UNKNOWN        127.0.0.1/8 1.1.1.6/32 
    eth0@if5         UP             1.1.215.48/27 
    eth2@if4         UP             10.99.99.254/24 
    
    # iptables -t nat -A PREROUTING -d 1.1.1.6 -p tcp --dport 80 -j DNAT --to-destination 10.99.99.50
    
    # iptables-save | grep -v ^#
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -d 1.1.1.6/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.99.99.50
    -A POSTROUTING -j SNAT --to-source 1.1.1.6
    COMMIT
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    COMMIT
    
    # conntrack -E 
       [NEW] tcp      6 120 SYN_SENT src=198.51.100.101 dst=1.1.1.6 sport=45752 dport=80 [UNREPLIED] src=10.99.99.50 dst=1.1.1.6 sport=80 dport=45752
     [UPDATE] tcp      6 60 SYN_RECV src=198.51.100.101 dst=1.1.1.6 sport=45752 dport=80 src=10.99.99.50 dst=1.1.1.6 sport=80 dport=45752
     [UPDATE] tcp      6 432000 ESTABLISHED src=198.51.100.101 dst=1.1.1.6 sport=45752 dport=80 src=10.99.99.50 dst=1.1.1.6 sport=80 dport=45752 [ASSURED]
    

    Embora possa não estar claro, isso significa que as respostas esperadas são de 10.99.99.50 a 1.1.1.6 (não a 198.51.100.101): linux-srv permanece cego em qual endereço IP realmente conectado a ele, ele sempre verá 1.1.1.6 .

    • 1

relate perguntas

  • iptables não filtra tráfego em ponte

  • iptables persistentes

  • Como configurar um noip no linux, se eu tiver Double NAT ISP Like JioFi?

  • 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