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 / server / Perguntas / 1161033
Accepted
Andreas Fischer
Andreas Fischer
Asked: 2024-06-16 23:20:36 +0800 CST2024-06-16 23:20:36 +0800 CST 2024-06-16 23:20:36 +0800 CST

Altere o endereço IP de origem, envie por eth0 em vez de lo

  • 772

Se um pacote for enviado usando TCP e endereço de origem 127.1.1.1 (lo) e porta de destino 80, desejo ser enviado por eth0 e endereço de origem abcd.

Como posso fazer isso funcionar?

Tentei:

iptables -t nat -A POSTROUTING -s 127.1.1.1 -j SNAT --to-source a.b.c.d

No entanto, isso ainda está atingindo o tempo limite:

nc -s 127.1.1.1 <external IP> 80

Muito obrigado.

linux
  • 3 3 respostas
  • 116 Views

3 respostas

  • Voted
  1. Tom Yan
    2024-06-17T19:52:20+08:002024-06-17T19:52:20+08:00

    ainda recebendo um tempo limite

    Presumo que você já tenha definido o net.ipv4.conf.eth0.route_localnetsysctl como 1, o que é necessário para o que você está fazendo. Caso contrário nc, deverá falhar imediatamente ou apresentar um Invalid argumenterro, dependendo da variante do netcat que você está usando.

    Embora eu não tenha certeza do que você quer dizer com tempo limite quando não está usando o -w. Talvez você esteja se referindo ao fato de que ele fica parado para sempre? Nesse caso, AFAIK indica mais ou menos que o host de destino (ou um roteador intermediário) possui um firewall que descartou o pacote. (Sem esse firewall, normalmente o sistema operacional apenas redefiniria a conexão imediatamente quando fosse TCP, embora o GNU netcat pareça um pouco lento em "aceitar o fato", enquanto o OpenBSD netcat simplesmente sai imediatamente.)

    O problema é que o pacote pode não ter levado o link que você deseja (por exemplo, aquele eth0).

    iptables -t nat -A POSTROUTING -s 127.1.1.1 -j SNAT --to-source a.b.c.d
    

    A regra é válida, como se houver apenas um link que possa ser aquele que você deseja que o tráfego siga, e todos os endereços de destino possíveis forem cobertos por uma rota desse link, tudo bem.

    O problema é:

    Se... eu quero ser enviado pela eth0

    Parece que existem vários links e, por algum motivo, você deseja que o endereço de origem escolhido seja o que determina qual link determinados tráfegos levariam. (E por algum motivo peculiar, você decidiu usar o bloco de endereço de loopback para a tarefa.)

    No entanto, SNATnão afeta o roteamento, pois é aplicado após a decisão de roteamento ter sido tomada (nota POSTROUTING).

    Normalmente o roteamento funciona assim: seria usada uma rota na tabela de rotas principal com o comprimento de prefixo mais longo que cobre o endereço de destino; se houver mais de uma rota (com o mesmo comprimento de prefixo mais longo), aquela com métrica menor será usada. (Não sei o que aconteceria se a métrica deles também fosse a mesma; pessoalmente , considero apenas que isso resultaria em um comportamento não determinístico e em algo a ser evitado.)

    Como você pode ver, além dos fatores do próprio mecanismo de roteamento, o endereço de destino é a única coisa que importa.

    Se precisar levar em consideração o endereço de origem, você precisará de roteamento baseado em política, também conhecido como regra IP + tabela de rotas alternativa.

    Por exemplo:

    ip route add 10.0.0.0/24 dev eth0 table 111
    ip route add default via 10.0.0.1 dev eth0 table 111
    ip rule add iif lo from 127.1.1.1 lookup 111
    

    Observe que iif loa regra não tem nada a ver com o fato de você querer de alguma forma aproveitar o bloco de endereço de loopback. Apenas "apertou" a regra para que ela fosse aplicada apenas a tráfegos originados do próprio host (ou seja, caso este host esteja funcionando como roteador para algum outro host).

    Observe também que a fromcorrespondência deve ter o endereço de origem "original", e não o endereço de origem "destino" definido por SNAT.

    Existem mais alguns "seletores" que você pode usar para "restringir" ainda mais a regra, como ipproto tcp dport 80.

    PS Escrever esta resposta não significa que eu ache que o que você está tentando fazer (como sua abordagem) faz sentido. Só que não estou interessado em descobrir se é um XYProblem, pelo menos não até/a menos que você apresente ativamente todo o contexto por trás de sua ideia.

    • 1
  2. Robert Glonek
    2024-06-17T02:50:46+08:002024-06-17T02:50:46+08:00

    Pense em POSTROUTING como o que fazer na volta (o processo inverso). Você também precisa disso. Mas o que você está procurando é PREROUTING. Isso é usado para definir o que acontece com os pacotes antes de serem enviados ou para onde encaminhá-los. O verdadeiro problema é que, se o tráfego se originar no host local, o NAT PREROUTING não terá efeito. Neste caso, você deseja apenas usar a tabela OUTPUT para -j DNAT para encaminhar pacotes de saída para outro IP. O DNAT também mascarará o IP de origem conforme você desejar. Se o tráfego vier de fora e você deseja DNAT, adicione-o ao NAT PREROUTING (iptables -t nat -I PREROUTING… -j DNAT —-to…). A tabela IUTOUT está na cadeia de filtros padrão, então apenas: iptables -I OUTPUT… -j DNAT —-to…). Você desejará a regra POSTROUTING ou INPUT na direção oposta, pois precisará reverter o NAT do IP (reescrevendo o IP de origem/destino). É para isso que serve o SNAT aqui (fonte nat) - para pacotes que voltam.

    • 0
  3. Best Answer
    Lasse Michael Mølgaard
    2024-06-17T03:44:27+08:002024-06-17T03:44:27+08:00

    Estou me perguntando um pouco sobre o que você deseja alcançar.

    Se for apenas a porta 80 em um único endereço IP ao qual você precisa acessar, o encaminhamento de porta é de longe o caminho mais fácil.

    No entanto, o endereço IP selecionado na sua pergunta sugere que você deseja utilizar vários endereços IP na localnetsub-rede (127.0.0.0/8).

    Nesse caso, acho que você está pensando em implementar um arquivo 1:1 NAT.

    Isso requer uma sub-rede disponível 10.1.0.0/16e, em seguida, usa o roteamento de origem e destino para que qualquer pacote IP 127.1.x.xpareça originar-se de 10.1.x.x.

    Da mesma forma, você deseja que todos os pacotes IP destinados sejam 10.1.x.xencaminhados para 127.1.x.x.

    Resumindo:

    • 10.1.1.1mapeia para 127.1.1.1.
    • 10.1.1.2mapeia para 127.1.1.2.
    • etc.

    Fiz uma pergunta semelhante em 2021 e acredito que ela também pode ser usada nesta questão.

    Isso significaria que você precisa usar os seguintes comandos:

    # Translates any ip address from 127.1.x.x into 10.1.x.x
    # Note the '-s' after POSTROUTING
    
    iptables -t nat -A POSTROUTING -s 127.1.1.0/16 -j NETMAP --to 10.1.0.0/16
    
    # Translates any traffic for 10.1.x.x into 127.1.x.x
    # Note the '-d' after PREROUTING
    
    iptables -t nat -A PREROUTING -d 10.1.0.0/16 -j NETMAP --to 127.1.0.0/16
    

    Isso também significaria que você precisa de uma rota estática para o seu roteador informando que a sub-rede 10.1.0.0/16pode ser acessada através do endereço IP do seu servidor.

    Como por exemplo o comando:

    ip route add 10.1.0.0/16 via A.B.C.D, onde ABCD é o endereço IP que você usa para se comunicar com o servidor.

    Esta resposta atende às suas necessidades?

    • 0

relate perguntas

  • Como descobrir detalhes sobre hardware na máquina Linux?

Sidebar

Stats

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

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 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