O que acontece com o tráfego da LAN local no linux para endereços que não são loopback?

4

Uma coisa que eu nunca entendi bem no Linux é o que acontece com o tráfego local que não é direcionado ao loopback.

Por exemplo, dada a seguinte configuração de rede:

[root@pe-323-master ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:2B:59:85
          inet addr:172.16.90.133  Bcast:172.16.90.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe2b:5985/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1881 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1205 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:234047 (228.5 KiB)  TX bytes:134389 (131.2 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:2B:59:8F
          inet addr:10.20.2.2  Bcast:10.20.2.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe2b:598f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:77 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:14880 (14.5 KiB)  TX bytes:1188 (1.1 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:13585 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13585 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6501824 (6.2 MiB)  TX bytes:6501824 (6.2 MiB)

o que realmente acontece quando eu faço ping em um endereço local não-loopback?

[root@pe-323-master ~]# ping -c 1 172.16.90.133
PING 172.16.90.133 (172.16.90.133) 56(84) bytes of data.
64 bytes from 172.16.90.133: icmp_seq=1 ttl=64 time=0.011 ms

--- 172.16.90.133 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.011/0.011/0.011/0.000 ms

Esse tráfego sai do arame e volta ou é roteado internamente?

    
por zacharyalexstern 30.06.2014 / 20:09

3 respostas

1

Você pode fazer um tcpdump na interface de loopback enquanto faz o ping para o endereço IP da máquina. Isso mostrará o que está acontecendo.

Realmente, o tráfego nunca sai da máquina. Se o fizesse, não o receberia de volta. Um switch ou roteador não encaminhará o tráfego de volta à interface de onde veio.

    
por 30.06.2014 / 21:03
1

Bem, porque foi bastante simples - fiz uma experiência no meu próprio sistema.

Terminal 1

$ uname -a
Linux my-pc 3.15.1-1-ARCH #1 SMP PREEMPT Tue Jun 17 09:32:20 CEST 2014 x86_64 GNU/Linux

$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.2  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::21f:bcff:fe09:7b0a  prefixlen 64  scopeid 0x20<link>
        ether 66:60:13:37:06:66  txqueuelen 1000  (Ethernet)
        RX packets 451273  bytes 458871230 (437.6 MiB)
        RX errors 0  dropped 12  overruns 0  frame 0
        TX packets 305732  bytes 32068185 (30.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 13166  bytes 667544 (651.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13166  bytes 667544 (651.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


$ ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.048 ms
^C
--- 192.168.1.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.048/0.048/0.048/0.000 ms

Terminal 2

$ sudo tcpdump -i lo 'icmp and src 192.168.1.2'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
21:27:17.944958 IP my-pc.home > my-pc.home: ICMP echo request, id 32419, seq 1, length 64
21:27:17.944975 IP my-pc.home > my-pc.home: ICMP echo reply, id 32419, seq 1, length 64

Terminal 3

$ sudo tcpdump -i eth0 'icmp and src 192.168.1.2'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

Os resultados .. Pelo menos no meu computador, o ping vai para lo nunca deixando meu sistema. Espero que este experimento simples, que você pode experimentar, ajude você mesmo.

Outra maneira é usar o traceroute.

$ sudo traceroute 192.168.1.2
traceroute to 192.168.1.2 (192.168.1.2), 30 hops max, 60 byte packets
 1  my-pc.home (192.168.1.2)  0.048 ms  0.014 ms  0.022 ms
    
por 01.07.2014 / 03:32
0

Linux (e eu acho que a maioria das outras variantes unix, mas não tenho certeza) encaminha o tráfego localmente, localmente, onde:

  • por “ligado localmente”, quero dizer tráfego emitido pelo sistema e cujo destino é um endereço IP associado a uma das interfaces de rede do sistema;
  • por "rotas localmente", quero dizer que o tráfego não é enviado para o driver da interface de rede, mas movido diretamente da fila de saída para a fila de entrada.

Pacotes ligados localmente passam pelas cadeias netfilter ( iptables ) como se eles não estivessem ligados localmente - eles não são reencaminhados para 127.0.0.1 ou para a interface lo . Eu não sei como eles afetam o agendamento de pacotes.

    
por 01.07.2014 / 01:46