단일 프로세스의 네트워크 트래픽을 어떻게 캡처 할 수 있습니까? 싶지만 바쁜

단일 프로세스로 처리되는 네트워크 트래픽을 조사하고 싶지만 바쁜 시스템 (많은 다른 트래픽이 동시에 발생)을 처리하기 때문에 간단한 네트워크 캡처가 작동하지 않습니다. 단일 특정 프로세스의 네트워킹 트래픽 을 격리 tcpdump하거나 wireshark캡처하는 방법이 있습니까? (사용 netstat이 충분하지 않습니다.)



답변

실제로 Wireshark 필터를 사용하는 방법이 있습니다. 그러나 네트워크 이름이 아니기 때문에 프로세스 이름 또는 PID로 직접 필터링 할 수 없습니다.

먼저 프로세스에서 사용하는 프로토콜과 포트를 파악해야합니다 ( 이전 설명 의 netstat 명령이 잘 작동 함).

그런 다음 Wireshark를 사용하여 방금 검색 한 포트로 인바운드 (또는 아웃 바운드) 포트를 필터링하십시오. 프로세스의 들어오는 트래픽과 나가는 트래픽을 분리해야합니다.


답변

새 프로세스를 시작하고 모니터링하려면

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

알려진 PID로 기존 프로세스를 모니터링하려면

strace -p $PID -f -e trace=network -s 10000
  • -f “새로운 프로세스를 따르십시오”
  • -e 필터를 정의
  • -s 문자열의 한계를 32 이상으로 설정
  • -p 프로세스 ID를 첨부합니다.

답변

이 스레드가 약간 오래되었다는 것을 알고 있지만 이것이 일부 사용자에게 도움이 될 수 있다고 생각합니다.

커널이 허용하는 경우 단일 프로세스의 네트워크 트래픽 캡처는 격리 된 네트워크 네임 스페이스에서 해당 프로세스를 실행하고 해당 네임 스페이스에서 wireshark (또는 다른 표준 네트워킹 도구)를 사용하여 매우 쉽게 수행 할 수 있습니다.

설정이 약간 복잡해 보일 수 있지만 일단 이해하고 익숙해지면 작업이 훨씬 쉬워집니다.

그렇게하기 위해 :

  • 테스트 네트워크 네임 스페이스를 만듭니다.

    ip netns add test
    
  • 한 쌍의 가상 네트워크 인터페이스 (veth-a 및 veth-b)를 만듭니다.

    ip link add veth-a type veth peer name veth-b
    
  • veth-a 인터페이스의 활성 네임 스페이스를 변경하십시오.

    ip link set veth-a netns test
    
  • 가상 인터페이스의 IP 주소를 구성하십시오.

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • 테스트 네임 스페이스에서 라우팅을 구성하십시오.

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • ip_forward를 활성화하고 생성 한 네임 스페이스에서 들어오는 트래픽을 전달하는 NAT 규칙을 설정하십시오 (네트워크 인터페이스 및 SNAT ip 주소를 조정해야 함).

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (원하는 경우 MASQUERADE 규칙을 사용할 수도 있습니다)

  • 마지막으로, 새로운 네임 스페이스에서 분석하려는 프로세스와 wireshark도 실행할 수 있습니다.

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    veth-a 인터페이스를 모니터링해야합니다.


답변

netstat -taucp | grep <pid or process name>

사용중인 포트를 포함하여 응용 프로그램이 연결을 보여줍니다.


답변

아이디어 : 다른 IP 주소에 응용 프로그램을 바인딩 할 수 있습니까? 그렇다면 일반적인 용의자 ( tcpdump 등)를 사용할 수 있습니다

다른 IP 주소에 바인딩 할 수없는 응용 프로그램 도구 :

http://freshmeat.net/projects/fixsrcip

fixsrcip발신 TCP 및 UDP 클라이언트 소켓 ( IPv4 )을 멀티 홈 호스트의 특정 소스 IP 주소에 바인딩하는 도구입니다.

http://freshmeat.net/projects/force_bind

force_bind특정 IP 및 / 또는 포트에서 강제로 바인딩 할 수 있습니다. IPv4 및 IPv6 모두에서 작동 합니다 .


답변

비슷한 문제가 발생했으며 여기에 설명 된대로 NFLOG 를 사용하여 ioerror 의이 답변을 기반으로 정렬 할 수있었습니다 .

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30
# dumpcap -i nflog:30 -w uid-1000.pcap

그런 다음 다른 작업을 수행하지 않는 사용자 계정에서 문제의 프로세스를 실행할 수 있습니다. 단, 단일 프로세스에서 트래픽을 격리하고 캡처했습니다.

누군가를 돕기 위해 다시 게시하고 싶었습니다.


답변

나는 felahdab에 의해 위의 큰 답변에 설명 된 것을 수행하는 C 응용 프로그램을 작성했습니다!

여기 참조 : nsntrace github repo