가상 인터페이스에서 트래픽을 어떻게 캡처합니까?


12

디버깅 목적으로 Linux 가상 인터페이스에서 트래픽을 캡처하고 싶습니다. 내가 실험 한 veth, tun그리고 dummy유형 인터페이스; 세 가지 모두에서 나는 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 주소를 핑 (ping)하고 있기 때문에 운영 체제는 패킷을 "전선으로"전송할 필요가없고 커널 자체가 이러한 핑에 응답한다고 결정합니다. 생각해 보면 다른 인터페이스의 IP 주소 (예 : eth0)를 핑 (ping)하면 정확히 어떤 일이 발생합니다. 패킷이 전송되지 않습니다. 이것은 분명하게 들릴지 모르지만 처음에는 혼란의 원인이 될 수 있습니다 (나에게있어서).

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

어쩌면 tcpdump다른 방식 인터페이스에 바인딩해야 하는가?


왜 TCP 패킷에서 발생하는지 알기가 어렵습니다. 핑과 마찬가지로 커널에서 처리됩니다. 같은 일이 일어나고 있습니다.
derobert

@derobert 핑의 경우 커널이 응답 할 수 있습니다. 데이터 패킷의 경우 응용 프로그램이 응답 할 수 있도록 인터페이스를 "오버"해야한다고 생각했습니다.
solidsnack

1
응용 프로그램은 읽기, 쓰기 등을 사용하여 커널과 통신합니다. 많은 네트워크 응용 프로그램은 인터페이스가 존재한다는 것을 인식하지 않아도됩니다. 트래픽이 트래픽 중 하나를 통과하게하려면 커널은이를 로컬이 아닌 것으로 간주해야합니다. 예를 들어 OpenVPN 터널을 설정하면 tun0을 통과하는 트래픽을 캡처 할 수 있습니다. (물론, tun0은 앱이 커널과 대화하고 OpenVPN이 수행하는 사용자 인터페이스에서 네트워크 인터페이스를 구현하는 특별한 방법입니다.)
derobert

답변:


8

트래픽이 lo인터페이스를 통과하고 있습니다.

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

다음을 사용하여 'local'테이블의 내용을 볼 수 있습니다.

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가 다른 인터페이스에 정말에도 불구하고, 루프백 인터페이스를 통해 라우팅 얻을 것이다.


1

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


0

이는 두 번째 시스템을 호출하여 가능해야합니다 (해당 호스트의 VM 일 수도 있음).

테이블 체인 DNAT에서 사용 하고 커널이 제어하지 않는 인터페이스로 패킷을 리디렉션 할 수 있습니다 . 거기에 반영해야합니다.OUTGOINGnat

iptables -t nat -A OUTPUT -p tcp -d 99.99.99.1 --dport 2048 \
  -j DNAT --to-destination 1.2.3.4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.