가상 인터페이스에서 트래픽을 캡처하는 방법은 무엇입니까?

가상 인터페이스에서 트래픽을 캡처하는 방법은 무엇입니까?

디버깅 목적으로 Linux 가상 인터페이스에서 트래픽을 캡처하고 싶습니다. 나는 세 가지 모두에서 veth, tundummy인터페이스 유형을 실험해 왔지만 아무 것도 표시하는 데 어려움을 겪고 있습니다 tcpdump.

가상 인터페이스를 설정하는 방법은 다음과 같습니다.

ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up

터미널에서 다음 명령을 사용하여 시청하세요 tcpdump.

tcpdump -i dummy10

나중에 다음 명령을 들어보세요 nc.

nc -l 99.99.99.1 2048

세 번째 단계에서는 다음 명령을 사용하여 HTTP 요청을 만듭니다 curl.

curl http://99.99.99.1:2048/

터미널 2에서는 요청 데이터를 볼 수 있지만 curl아무 것도 표시되지 않습니다 tcpdump.

튜닝/탭 튜토리얼로컬 인터페이스에서 작동할 때 커널이 실제로 패킷을 보내지 않을 수 있는 몇 가지 경우를 명확히 했습니다.

tshark의 출력을 보면 아무것도 표시되지 않습니다. 이 인터페이스를 통과하는 트래픽은 없습니다. 맞습니다. 인터페이스의 IP 주소에 대해 핑을 보내고 있기 때문에 운영 체제는 "온라인"으로 패킷을 보낼 필요가 없다고 올바르게 결정했으며 커널 자체는 이러한 핑에 응답하고 있습니다. 생각해 보면 다른 인터페이스(예: eth0)의 IP 주소를 ping하면 다음과 같은 일이 발생합니다. 즉, 패킷이 전송되지 않습니다. 이는 당연하게 들릴 수도 있지만 처음에는 혼란스러울 수 있습니다.

그러나 이것이 TCP 패킷에 어떻게 적용되는지 알기는 어렵습니다.

어쩌면 tcpdump인터페이스에 다르게 바인딩해야 할까요?

답변1

트래픽은 인터페이스를 통해 흐릅니다 lo.

IP가 상자에 추가되면 해당 주소에 대한 경로가 "로컬" 테이블에 추가됩니다. 이 테이블의 모든 경로는 루프백 인터페이스를 통해 트래픽을 라우팅합니다.

다음 명령을 사용하여 "로컬" 테이블의 내용을 볼 수 있습니다.

ip route show table local

내 시스템에서는 다음과 같습니다.

local 10.230.134.38 dev tun0  proto kernel  scope host  src 10.230.134.38 
broadcast 10.230.134.38 dev tun0  proto kernel  scope link  src 10.230.134.38 
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 172.17.0.0 dev docker0  proto kernel  scope link  src 172.17.42.1 
local 172.17.42.1 dev docker0  proto kernel  scope host  src 172.17.42.1 
broadcast 172.17.255.255 dev docker0  proto kernel  scope link  src 172.17.42.1 
broadcast 192.168.0.0 dev enp6s0  proto kernel  scope link  src 192.168.0.20 
local 192.168.0.20 dev enp6s0  proto kernel  scope host  src 192.168.0.20 
broadcast 192.168.0.255 dev enp6s0  proto kernel  scope link  src 192.168.0.20 

따라서 기본적으로 트래픽을 10.230.134.38, 127.0.0.0/8,127.0.0.1(추가의), 172.17.42.1또는 192.168.0.20, IP가 실제로 다른 인터페이스에 있더라도 트래픽은 루프백 인터페이스를 통해 라우팅됩니다.

답변2

tcpdump호스트의 모든 인터페이스와 함께 사용할 수 있습니다 ( tcpdump -i any ...).

답변3

네임스페이스를 사용하세요. (IMO, 네임스페이스는 ip 명령이 실제로 테이블에 가져오는 가장 좋은 것입니다.)

예를 들어, 내 장치에 클라이언트-서버 시스템이 설정되어 있습니다.

ip netns add client-ns
ip l add server type veth peer name client netns client-ns
ip l set server up
ip netns exec client-ns ip l set client up
ip netns exec client-ns ping <IPv6 Address of Server>

Ofc IPv4와 통신하려면 IPv4 주소를 추가해야 합니다.

ip a add 10.0.0.1/24 dev server
ip netns exec client-ns ip a add 10.0.0.2/24 dev client

관련 정보