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 / 787076
Accepted
Adrian
Adrian
Asked: 2024-11-23 07:26:28 +0800 CST2024-11-23 07:26:28 +0800 CST 2024-11-23 07:26:28 +0800 CST

Por que o netcat não imprime nada ao escutar no modo UDP quando não consegue alcançar o cliente, mesmo quando o cliente consegue alcançar o servidor?

  • 772

Estou usando uma instalação mínima nova do Ubuntu server 24.04.1 LTS. Eu executo esses comandos como root para configurar a rede e fazer alguns experimentos:

apt install netcat-traditional

ip netns add ns1
ip netns add ns2

ip link add my_veth1 type veth peer name my_veth2

ip link set my_veth1 up netns ns1
ip link set my_veth2 up netns ns2

ip -n ns1 address add 1.2.3.4 dev my_veth1
ip -n ns1 route add 2.3.4.0/24 dev my_veth1

ip netns exec ns2 nc -u -l -p 8080

então eu executo isso de outro terminal:

ip netns exec ns1 nc -u 2.3.4.5 8080 <<< 'Hello world from network namespace ns1'

UDP é um protocolo sem conexão. Se meu entendimento estiver correto, isso deve significar que o servidor UDP netcat do namespace de rede ns2 deve ser capaz de imprimir a mensagem que o cliente do ns1 enviou, independentemente de o servidor poder alcançar o cliente ou não, então, em teoria, eu não deveria ter que configurar uma rota em ns2ou um endereço IP em my_veth2. No entanto, nenhuma mensagem está sendo impressa no primeiro terminal, a menos que o endereço IP e a entrada da tabela de roteamento estejam configurados. Por quê?

  • Tentei adicionar o endereço IP 2.3.4.5, my_veth2mas não funcionou.
  • Tentei criar uma nova entrada na tabela de roteamento ns2para redirecionar todo o tráfego de 1.2.3.0/24para my_veth2, mas isso também não funcionou.
  • A mensagem só seria impressa ao adicionar o endereço IP 2.3.4.5a my_veth2AND criar uma nova entrada de tabela de roteamento em ns2 para redirecionar todo o tráfego de 1.2.3.0/24para my_veth2. Por que isso?

EDIT: Desabilitar o rp_filter não parece resolver o problema:

ip netns exec ns1 dd of=/proc/sys/net/ipv4/conf/all/rp_filter <<< '0'
ip netns exec ns2 dd of=/proc/sys/net/ipv4/conf/all/rp_filter <<< '0'
ip netns exec ns1 dd of=/proc/sys/net/ipv4/conf/my_veth1/rp_filter <<< '0'
ip netns exec ns2 dd of=/proc/sys/net/ipv4/conf/my_veth2/rp_filter <<< '0'

EDIT 2: Instalando e executando o tcpdump Aprendi que havia algumas solicitações ARP sendo enviadas e não estavam sendo respondidas:

$ ip netns exec ns1 tcpdump -l -i my_veth1
23:38:14.402259 ARP, Request who-has 2.3.4.5 tell 1.2.3.4, length 28
23:38:14.402259 ARP, Request who-has 2.3.4.5 tell 1.2.3.4, length 28
23:38:14.402259 ARP, Request who-has 2.3.4.5 tell 1.2.3.4, length 28
...

ns2 my_veth2 fornece a mesma saída

Então tentei criar a entrada da tabela ARP manualmente...

ip -n ns1 neighbour add 2.3.4.5 dev my_veth1 lladdr $(ip netns exec ns2 cat /sys/class/net/my_veth2/address)

E agora aparentemente o pacote UDP está sendo enviado

$ ip netns exec ns1 tcpdump -l -i my_veth1
00:24:15.164245 IP 1.2.3.4.36170 > 2.3.4.5.8080: UDP, length 39

ns2 my_veth2 fornece a mesma saída

No entanto, o primeiro terminal que tem o servidor UDP netcat em execução ainda não produz nada. Por quê?


EDIT 3: Depois de fazer tudo isso, tentei atribuir um endereço IP para my_veth2:

ip -n ns2 address add 2.3.4.5 dev my_veth2

E agora, quando envio o pacote UDP, recebo este erro no terminal que está executando o netcat em modo de escuta:

no connection : Network is unreachable

Por quê? Quero dizer, é claro que a rede está inacessível, mas isso não deve impedir o servidor de receber e exibir pacotes UDP. Na verdade, esse erro só é exibido quando ele recebe o pacote UDP. Então, mesmo que ele saiba que não pode responder, ele deve ser capaz de receber e exibir a mensagem, certo?

routing
  • 2 2 respostas
  • 71 Views

2 respostas

  • Voted
  1. Best Answer
    Steffen Ullrich
    2024-11-25T14:37:20+08:002024-11-25T14:37:20+08:00

    Inicialmente, você cria apenas um endereço IP "IP1" no ns1 e uma rota para um endereço IP imaginário (inexistente) "IP2" no ns2.

    Tentar enviar de ns1 para IP2 falhará, pois precisa de um endereço MAC (camada de link) para entregar o pacote. Daí a solicitação ARP que você vê. ns2 não responde à solicitação ARP para IP2, pois não tem IP2.

    Adicionar manualmente uma entrada ARP para IP2 no ns1 permite passar esse problema de camada de link. No ns2, o pacote do ns1 agora pode ser observado.

    Mas o netcat ainda não mostra nada, pois ele só espera pacotes em 0.0.0.0 - o que significa qualquer endereço IP configurado no ns2. Só que o IP2 não está configurado no ns2. Portanto, mesmo que o pacote tenha sido recebido na camada de link, ele não é processado na camada de rede (IP) - simplesmente não há endereço IP que corresponda ao destino do pacote.

    Somente quando o IP2 é adicionado como IP para o ns2 a camada de rede no ns2 se sente responsável por ele e entrega a carga útil ao aplicativo (nc).

    • 1
  2. Adrian
    2024-11-27T07:33:57+08:002024-11-27T07:33:57+08:00

    Respondendo a minha própria terceira edição...

    Não sei o REAL motivo pelo qual a decisão de rejeitar pacotes UDP naquele caso foi tomada, mas consigo pensar em algumas razões para isso:

    1. Segurança: Em casos como esse, é provável que o endereço IP do pacote tenha sido falsificado, e isso geralmente só é feito com intenções maliciosas. DDoS, por exemplo.
    2. Não faz sentido fazer nada com ele porque você deve estabelecer algum tipo de comunicação entre cliente e servidor e não pode fazer isso porque não pode responder. Se você abrir 2 terminais e estabelecer uma conexão UDP entre os 2 com netcat, verá que não só pode enviar UDP do cliente para o servidor, mas também do servidor para o cliente. É assim que a comunicação UDP deve ser: bidirecional, não apenas unilateral. Se a comunicação não pode ser bidirecional, por que se preocupar? Apenas envie uma mensagem de erro e saia, não tem jeito.
    • 0

relate perguntas

  • iptables: proxy de tráfego tcp transparente

  • O que iptables -j REDIRECT *realmente* faz nos cabeçalhos dos pacotes?

  • Alterar a métrica de uma interface permanentemente

  • Alguma distribuição criada para comutação/roteamento de camada 3?

  • Debian 9; configurando dispositivos de rede para um servidor www

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