컬 127.0.0.1 --interface eth0을 사용할 때 eth0이 루프백 인터페이스에 액세스할 수 없는 이유는 무엇입니까?

컬 127.0.0.1 --interface eth0을 사용할 때 eth0이 루프백 인터페이스에 액세스할 수 없는 이유는 무엇입니까?

문제를 재현하는 방법은 다음과 같습니다.

  1. 포트 80에서 청취 서비스를 시작하십시오.nc -l 80 -k
  2. 이 서비스에 액세스하려면 컬을 사용하세요.curl 127.0.0.1 --interface eth0
  3. eth0tcpdump를 사용하여 다음에서 lo패킷을 캡처합니다 tcpdump -i eth0 port 80 -nn -v.tcpdump -i lo port 80 -nn -v

출력에는 패킷이 전송되었지만 응답을 받지 못했고 TCP 클라이언트가 재전송 제한에 도달할 때까지 패킷을 재전송했음을 tcpdump보여줍니다 .SYNeth0SYN

그러나 대상 IP를 (또한 eth0에 바인딩된 로컬 IP)로 변경하면 192.168.16.4액세스가 성공하고 tcpdump 출력에 패킷 SYNlo.

ifconfig출력 은 다음 과 같습니다 .

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.16.4  netmask 255.255.240.0  broadcast 192.168.31.255
        inet6 fe80::f820:20ff:fe16:588c  prefixlen 64  scopeid 0x20<link>
        ether fa:20:20:16:58:8c  txqueuelen 1000  (Ethernet)
        RX packets 16248748  bytes 2161348902 (2.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 15203841  bytes 4648786129 (4.3 GiB)
        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 1000  (Local Loopback)
        RX packets 4832071  bytes 2872871764 (2.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4832071  bytes 2872871764 (2.6 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

라우팅 테이블 내용은 다음과 같습니다.

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.16.1    0.0.0.0         UG    100    0        0 eth0
169.254.169.254 192.168.16.2    255.255.255.255 UGH   100    0        0 eth0
192.168.16.0    0.0.0.0         255.255.240.0   U     100    0        0 eth0

$ ip route show table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 
broadcast 192.168.16.0 dev eth0 proto kernel scope link src 192.168.16.4 
local 192.168.16.4 dev eth0 proto kernel scope host src 192.168.16.4 
broadcast 192.168.31.255 dev eth0 proto kernel scope link src 192.168.16.4

strace시스템 호출을 기록 하는 데 사용 하면 옵션의 의미 curl가 표시됩니다 --interface eth0.setsockopt(3, SOL_SOCKET, SO_BINDTODEVICE, "eth0\0", 5)

토론을 봤어요https://github.com/iputils/iputils/issues/198( ping -I같은 방법으로 진행) 그리고https://stackoverflow.com/questions/46036667/route-Between-network-interfaces-ubuntu

나는 생각 중입니다:

  1. curl 127.0.0.1 --interface eth0서비스에 액세스할 수 없는 이유는 무엇이며 , SYN패킷은 어떻게 되며 언제 삭제됩니까?
  2. curl 192.168.16.4 --interface eth0인터페이스를 사용하여 lo통신하지만 curl 127.0.0.1 --interface eth0사용하는 이유eth0
  3. 내가 하고 싶은 일은 내가 하고 싶은 일이라면 curl 127.0.0.1 --interface eth0가능한 일이다 .

고쳐 쓰다:

내가 사용하는 Linux 커널 버전은 입니다 4.18.0. 출력은 다음과 같습니다 curl 192.168.16.4 --interface eth0.tcpdump -i lo

$ tcpdump -i lo port 80 -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
09:15:38.915880 IP 192.168.16.4.40850 > 192.168.16.4.80: Flags [S], seq 1020241664, win 43690, options [mss 65495,sackOK,TS val 2673572844 ecr 0,nop,wscale 7], length 0
09:15:38.915891 IP 192.168.16.4.80 > 192.168.16.4.40850: Flags [S.], seq 3808229193, ack 1020241665, win 43690, options [mss 65495,sackOK,TS val 2673572844 ecr 2673572844,nop,wscale 7], length 0
09:15:38.915900 IP 192.168.16.4.40850 > 192.168.16.4.80: Flags [.], ack 1, win 342, options [nop,nop,TS val 2673572844 ecr 2673572844], length 0
09:15:38.915928 IP 192.168.16.4.40850 > 192.168.16.4.80: Flags [P.], seq 1:77, ack 1, win 342, options [nop,nop,TS val 2673572844 ecr 2673572844], length 76: HTTP: GET / HTTP/1.1
09:15:38.915931 IP 192.168.16.4.80 > 192.168.16.4.40850: Flags [.], ack 77, win 342, options [nop,nop,TS val 2673572844 ecr 2673572844], length 0

답변1

XY 문제와 매우 유사해 보이지만 다음과 같습니다.

시스템에는 두 가지 인터페이스가 있습니다.

  • eth0, IP 주소는 192.168.16.4
  • lo, IP 주소는 127.0.0.1입니다.

물론, 이 인터페이스에 직접 연결된 모든 IP 주소는 이 인터페이스를 통해 접근 가능합니다. 의 경우 eth0192.168.16.0/20 중 하나일 수 있고, 의 경우 lo127.0.0.1 중 하나일 수 있습니다.

직접 결합 범위에 포함되지 않는 데이터의 경우 데이터는 먼저 게이트웨이로 전송된 다음 게이트웨이에서 대상으로 추가 라우팅됩니다. 여태까지는 그런대로 잘됐다.

그러나 127.0.0.0/8은 루프백 네트워크용으로 예약되어 있습니다. 라우터는 더 이상 라우팅하지 않습니다. 따라서 게이트웨이로 보내더라도 더 이상 라우팅되지 않습니다.

라우터가 추가로 라우팅하더라도 인터페이스에 액세스할 수 없습니다 lo. 의 경우 eth0, 라우터에 연결한 케이블을 통해 라우터에 접근할 수 있습니다. 귀하의 인터페이스에는 그러한 액세스 권한이 없습니다 lo. 로컬 시스템에서만 액세스할 수 있습니다.

따라서 귀하의 질문에 :

  • 서비스에 액세스할 수 없는 이유는 무엇이며 curl 127.0.0.1 --interface eth0, SYN 패킷은 어떻게 되며 언제 삭제됩니까?

제거되는 위치는 운영 체제에 따라 다릅니다. 그러나 그것은 관문보다 더 멀리 가지 않습니다.

  • curl 192.168.16.4 --interface eth0인터페이스를 사용하여 lo통신하지만 curl 127.0.0.1 --interface eth0사용하는 이유eth0

이것은 결코 일어나지 않을 것입니다. curl 192.168.16.4 --interface eth0사용하지 마세요 lo.

  • 내가 하고 싶은 일은 내가 하고 싶은 일이라면 curl 127.0.0.1 --interface eth0가능한 일이다 .

커널 패치를 실행 중인 경우 systemd거기에도 패치를 적용하세요. curl괜찮을 것입니다. 또한 라우터에 맞춤형 소프트웨어를 설치해야 합니다. 시스템에서 라우팅을 활성화해야 합니다(물론 커널 패치와 위의 수정된 버전이 적용됨 zebra). 내 조언: 그것에 대해 생각조차 하지 마세요. 왜 이것을 시도하고 싶은지 진지하게 재평가하십시오.

보충으로, 보충으로

그러나 컬 192.168.16.4 --interface eth0은 lo 인터페이스를 사용합니다.

기기에서 볼 수 있는 내용은 systemd다음과 같습니다( 사용 curl dullaart.website).

07:41:06.008577 IP localhost.domain > localhost.45840: 6127 1/0/0 PTR localhost. (64)
07:41:12.433744 IP localhost.52411 > localhost.domain: 39930+ A? dullaart.website. (34)
07:41:12.433795 IP localhost.52411 > localhost.domain: 49165+ AAAA? dullaart.website. (34)
07:41:12.550329 IP localhost.domain > localhost.52411: 39930 1/0/0 A 212.1.212.17 (50)
07:41:12.582833 IP localhost.domain > localhost.52411: 49165 0/0/0 (34)

/etc/resolve.conf이는 다음 에 지정된 서버에서 수행되는 이름 확인입니다 .

nameserver 127.0.0.53

루프백 네트워크에 있습니다.

질문 결과에서와 같이 자신의 시스템으로 이동하면 일부(전부는 아님)가 lo바로가기로 사용될 수 있습니다. curl이는 커널이 두 인터페이스 뒤에 동일한 시스템이 있다는 것을 알고 있기 때문에 가능합니다. 따라서 대상이 자신의 시스템인 경우에만 사용할 수 있습니다 curl.lo

관련 정보