route packets through hardware loopback interface, not lo

5,756

Local traffic doesn't go through Ethernet interfaces. Fundamentally, local traffic goes through the local interface. The OS has no idea that your eth1 interface has hardware loopback.

Share:
5,756

Related videos on Youtube

Trevor
Author by

Trevor

Updated on September 18, 2022

Comments

  • Trevor
    Trevor almost 2 years

    My embedded Linux board has 3 interfaces:

    • eth0 - For all outbound traffic
    • eth1 - A hardware loopback (traffic leaves board, but comes immediately back in the same port)
    • lo - Standard loopback interface

    ifconfig reveals the following:

    eth1      Link encap:Ethernet  HWaddr AA:BB:CC:DD:EE:FF  
              inet addr:169.254.1.1  Bcast:169.254.255.255  Mask:255.255.255.255
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
              Base address:0x8000 
    
    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:14 errors:0 dropped:0 overruns:0 frame:0
              TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:1561 (1.5 KiB)  TX bytes:1561 (1.5 KiB)
    

    And, route yields:

    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    169.254.1.1     *               255.255.255.255 UH    0      0        0 eth1
    A.B.C.96        *               255.255.255.240 U     0      0        0 eth0
    127.0.0.0       *               255.0.0.0       U     0      0        0 lo
    default         A.B.C.110       0.0.0.0         UG    0      0        0 eth0
    

    I can ping the eth1 interface's assigned IP, like so:

    PING 169.254.1.1 (169.254.1.1): 56 data bytes
    64 bytes from 169.254.1.1: seq=0 ttl=64 time=0.143 ms
    64 bytes from 169.254.1.1: seq=1 ttl=64 time=0.067 ms
    

    But, all of the packets appear on the lo interface, not eth1, according to the ifconfig reported RX/TX counters.

    Why? Is the traffic really ingressing and egressing the eth1 port, but being accounted under the lo interface? Or, is the traffic really all flowing through lo?

    Thanks!

  • Trevor
    Trevor over 11 years
    thanks! That's what I also suspected, so why is all the traffic aimed at 169.254.1.1 going through lo instead of eth1?
  • Trevor
    Trevor over 11 years
    Thanks, poige, but I don't understand what any of those lines are doing, much less, why. Sorry.
  • David Schwartz
    David Schwartz over 11 years
    Because it's local traffic.
  • poige
    poige over 11 years
    @Trevor, comments added, and you can use ip help, ip ad help or ip ro help to become familiar with ip tool. Also, google for LARTC — Linux Advanced Routing & Traffic Control HOWTO.
  • Alex
    Alex over 3 years
    it is not generally true indeed. if you ping some local IP - yes it goes to LO. however all local traffic that goes inside host with docker containers do NOT go to lo indeed. it depends of actual case not in general.