루프백이 아닌 주소로 향하는 Linux의 로컬 LAN 트래픽은 어떻게 되나요?

루프백이 아닌 주소로 향하는 Linux의 로컬 LAN 트래픽은 어떻게 되나요?

Linux에서 내가 전혀 이해하지 못한 것 중 하나는 루프백 대상이 아닌 로컬 트래픽에 어떤 일이 발생하는지입니다.

예를 들어 다음 네트워크 설정을 가정합니다.

[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)

루프백이 아닌 로컬 주소를 ping하면 실제로 어떤 일이 발생합니까?

[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

이 트래픽이 회선을 통해 나갔다가 돌아오는 것입니까, 아니면 내부적으로 라우팅됩니까?

답변1

글쎄요, 간단하기 때문에 저는 제 시스템에서 실험을 해봤습니다.

터미널 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

터미널 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

제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

결과.. 적어도 내 컴퓨터에서는 핑이 lo내 시스템을 떠나지 않습니다.

또 다른 접근 방식은 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

답변2

컴퓨터의 IP 주소를 핑하는 동안 루프백 인터페이스에서 tcpdump를 수행할 수 있습니다. 이것은 무슨 일이 일어나고 있는지 보여줄 것입니다.

실제로 트래픽은 결코 기계를 떠나지 않습니다. 그렇다면 다시 가져 오지 않을 것입니다. 스위치나 라우터는 트래픽을 소스 인터페이스로 다시 전달하지 않습니다.

답변3

Linux(대부분의 다른 Unix 변형이라고 생각하지만 확실하지는 않습니다)는 로컬로 바인딩된 트래픽을 로컬로 라우팅합니다.

  • "로컬 바인딩"은 시스템의 네트워크 인터페이스 중 하나와 연결된 IP 주소로 향하는 시스템의 트래픽을 의미합니다.
  • "로컬 라우팅"이란 트래픽이 네트워크 인터페이스 드라이버로 전송되지 않고 나가는 대기열에서 들어오는 대기열로 직접 이동한다는 의미입니다.

로컬로 바인딩된 패킷은 마치 로컬로 바인딩되지 않은 것처럼 netfilter( iptables) 체인을 통과합니다. 즉, 127.0.0.1이나 인터페이스로 다시 라우팅되지 않습니다 lo. 패킷 스케줄링에 어떤 영향을 미치는지 모르겠습니다.

관련 정보