Como funciona a interface de loopback?

3

há coisas estranhas:

na minha virtualbox:
centos7

Interfaces:

enp0s3: 192.168.10.110/24<br>
lo:0 10.0.3.110/24<br>(ip alias)

rota:

default via 10.0.3.2 dev lo
192.168.10.0/24 dev enp0s3

enp0s3 is plugged in 10.0.3.0/24

Eu ativei o ip_forward (net.ipv4.ip_forward = 1)

Minha pergunta:

ping 10.0.3.2 funciona, mas por quê?

tcpdump não pode receber pacotes em enp0s3 , mas recebe pacotes em lo .

a rota padrão é lo , por que a dose ping 10.0.3.2 funciona? Por que não consigo obter pacotes no enp0s3?

    
por godcrying 07.05.2017 / 12:41

1 resposta

9

A interface de loopback é uma interface virtual. A única finalidade da interface de loopback é retornar os pacotes enviados para ela, ou seja, o que você enviar para ela é recebido na interface. Não faz sentido colocar uma rota padrão na interface de loopback, porque o único local para o qual ela pode enviar pacotes é o pedaço imaginário de fio que é passado da saída da interface para a entrada. Não há nada que possa mudar esse comportamento da interface de loopback, é o que ela está codificada para fazer.

Quando você executa ping em 10.0.3.2, a resposta não vem de algum dispositivo externo, mas da própria interface de loopback. Quando você adiciona um endereço na interface de loopback com, por exemplo,

sudo ip addr add 10.0.3.1/24 dev lo

uma rota para 10.0.3.0/24 é adicionada. Você pode ver isso com

ip route show table local

Algo como

local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1

deve aparecer. Essa entrada da tabela de roteamento indica que um pacote enviado para qualquer endereço entre 10.0.3.1 e 10.0.3.254 é enviado por meio da interface lo , a partir da qual é retornado imediatamente.

EDIT: esclarecimento como resposta ao comentário abaixo.

Aqui está o que acontece quando você executa o ping 10.0.3.2: o kernel obtém um pacote IP para entrega com um endereço de destino 10.0.3.2. Assim como com qualquer pacote a ser entregue, o kernel consulta a tabela de roteamento. Neste caso, a entrada correspondente é a seguinte: local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1 , que diz que o pacote deve ser entregue através da interface lo com o endereço de origem 10.0.3.1.

Agora, como o pacote foi fornecido para a interface lo , a interface de loopback faz o que normalmente faz: retira o pacote da fila de envio e o coloca na fila de recebimento. Do ponto de vista do kernel, agora recebemos um pacote de entrada pronto para consumo por um processo do servidor escutando em um soquete. (No caso do ping, o kernel processa-o internamente.) Agora recebemos um pacote ICMP "remoto" com um endereço de destino 10.0.3.2, que não é um dos nossos endereços locais, mas foi entregue ao loopback interface, no entanto.

Em seguida, o kernel envia uma resposta ao ping: um pacote de resposta ICMP com os endereços invertidos: 10.0.3.2 como endereço de origem e 10.0.3.1 como destino. Isso é entregue através da interface de loopback de volta ao programa ping, o que mostra que recebemos uma resposta do 10.0.3.2.

    
por 07.05.2017 / 15:33