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
. 패킷 스케줄링에 어떤 영향을 미치는지 모르겠습니다.