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


93

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

답변:


21

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

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

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


6
간단한 연결에 대해이 가능하지만, 나는 모든 과거를 돌진하는 등 DNS, HTTP를 추적 할 필요가 그래서 그냥 사용하는 간단한 방법이없는 netstat바쁜 컴퓨터에 간단한 네트워크 캡처 필터.
Kees Cook

좋아, HTTP 및 DNS 공용 포트는 많은 응용 프로그램에서 사용되지만 해당 개인 포트는 고유합니다. 그렇다면 개인 포트로 필터링을 시도하지 않으시겠습니까?
OpenNingia

빠른 요청은 보이지 않습니다 netstat. 오래 지속되는 연결 만 잡을 수 있습니다. :(
Kees Cook

프로세스가 런타임에 동적 포트를 사용하는 경우 정적 포트 필터를 사용할 수 없을 경우
Unix Janitor

슬프게도 네트워크 스니핑 도구는 네트워크 스택의 가장 낮은 수준에서 작동하여 모든 것을 잡으려고 노력하며 OS에서 실행되는 프로세스를 완전히 알지 못합니다. 특정 통화의 출처를 찾는 것은 극히 어렵습니다. 패킷 스니퍼는 결국 포트 번호를 통해 프로세스 ID를 알아낼 수는 있지만 어떤 프로세스가 DNS 조회를 수행했는지는 완전히 독립적이므로 (호출을 트리거 한 커널 네트 스택 일 수 있음) 알 수 없습니다. 그러나 다른 프로세스를 필터링하고 중지하면 목표를 달성 할 수 있어야합니다.
호이겐스

135

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

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를 첨부합니다.

2
이것은 루트 액세스 나 특수 권한 없이도 사용할 수 있기 때문에 유용합니다 (어쨌든 일부 Linux 배포에서는 Ubuntu에서 특수 권한이 ​​필요할 수 있음).
Robin Green

1
이미 실행 된 프로세스에 대해 실행될 수 있으며 거의 ​​모든 Linux 상자에서 사용할 수 있기 때문에이 기능도 유용합니다.
zakmck

53

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

커널이 허용하는 경우 단일 프로세스의 네트워크 트래픽 캡처는 격리 된 네트워크 네임 스페이스에서 해당 프로세스를 실행하고 해당 네임 스페이스에서 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 인터페이스를 모니터링해야합니다.


4
좋은 생각이지만 "제한"에주의하십시오. 이것은 별도의 네임 스페이스이므로 루프백 주소 또는 UNIX 도메인 소켓을 사용하여 기본 네임 스페이스의 로컬 프로세스와 통신 할 수 없습니다. 후자는 D- 버스를 통한 통신에 영향을 미칩니다.
Lekensteyn

@Lekensteyn 여전히 네트워크 네임 스페이스에서 유닉스 도메인 소켓을 사용할 수 있습니다. 파일 시스템이 분리되어 있지 않습니다.
randunel

1
@randunel 더 정확해야합니다. 내가 말하고자하는 것은 "abstract socket namespace"(파일 시스템을 사용하지 않는)의 Unix 도메인 소켓은 네트워크 네임 스페이스 사이에서 직접 액세스 할 수 없다는 것입니다. 해결 방법으로 와 같은 프록시를 사용할socat있습니다 .
Lekensteyn

에 대한 --to-source인수로 어떤 IP 주소를 사용 iptables하십니까? -o옵션에 전달한 인터페이스 의 IP 주소, 구성한 IP 주소 또는 ??? 나는 필요로하지 않는다 가장 무도회 버전 시도 --to-source, 여기에 설명을 , 그리고 그 일을!
ntc2

3
이 모든 것은 루트 액세스가 필요한 것 같습니다.
simplegamer

15
netstat -taucp | grep <pid or process name>

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


8
이것은 해당 순간에 존재하는 연결을 표시하지만 트래픽 자체의 로그는 제공하지 않습니다.
Kees Cook

1
Kees Cook 의견이 확실하지 않습니다. 간단한 netstat는 순간 연결에 대한 정보를 표시하지만 -c 플래그를 사용하면 매 초마다 해당 상태의 스냅 샷을 얻습니다 ( 'man netstat'참조). 트래픽이 모두없는 것은 아니지만 연결의 고유 한 스냅 샷이 아닐 수도 있습니다.
tremendows

3
글쎄요 이 것 없는 프로세스의 모든 네트워크 트래픽을 캡처합니다.
Reinier Post

내부 방화벽에 의해 차단 된 포트 번호를 파악하는 데 유용했습니다. 내가 실행중인 명령에 의해 전송 된 TCP SYN (대상 주소 및 포트 번호와 함께)을 보여줍니다.
Anthony Geoghegan

11

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

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

http://freshmeat.net/projects/fixsrcip

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

http://freshmeat.net/projects/force_bind

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


대부분의 응용 프로그램은 소스 IP 지정을 지원하지 않지만 CLONE_NEWNS가 아닌 CLONE_NEWNET의 컨테이너를 사용하여 실제로 가능할 수 있습니다.
Kees Cook

또는 네트워크 네임 스페이스를 만들고 그 안에서 앱을 실행할 수 있습니다. www.evolware.org/?p=293
Flint

9

비슷한 문제가 발생했으며 여기에 설명 된대로 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

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

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


6

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

여기 참조 : nsntrace github repo


멋지지만 그것을 사용하고 사용하는 방법에 대한 자세한 내용을 포함시키는 것이 좋을 것 같습니다.)
Zanna

감사! 사용법과 예제가있는 README.md 파일이 들어있는 github repo에 대한 링크를 제공하고 지침을 다운로드했습니다!
조나스 다니엘 손

5

이것은 더러운 해킹이지만 주어진 UID에 대해 iptables가있는 전환 또는 로그 대상을 제안합니다. 예 :

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

해당 로그 대상에 대해 '--log-tcp-sequence', '--log-tcp-options', '--log-ip-options', '--log-uid'와 같은 것을 살펴볼 가치가 있습니다. . 비록 그것이 다른 많은 데이터를 포함하는 pcap을 게시하는 데 도움이 될 것이라고 생각합니다.

NFLOG 대상은 패킷에 플래그를 지정하려는 경우 특정 태그가 지정된 패킷이 netlink 소켓을 통해 선택한 프로세스로 전송되는 경우 유용 할 수 있습니다. 이것이 wireshark와 특정 사용자로 실행중인 특정 응용 프로그램으로 무언가를 해킹하는 데 유용한 지 궁금합니다.


그러나 이것은 나가는 경우에만 작동합니다. 들어오는 것은 어떻습니까?
resultsway

5

당신은 tracedump 시도 할 수 있습니다 - http://mutrics.iitis.pl/tracedump

정확히 원하는 것을 수행합니다. 프로세스 ID 또는 실행할 프로그램을 제공 할 수 있습니다.


1
좋은 프로젝트이지만 ... "Tracedump는 현재 32 비트 Linux 호스트에서만 실행됩니다"는 불행히도 나를 위해 죽입니다.
gertvdijk

4

strace 아래에서 관심있는 프로세스를 실행하십시오 .

strace ping www.askubuntu.com

프로세스가 수행하는 작업에 대한 매우 자세한 정보를 제공합니다. 프로세스는 사전 정의 된 필터를 사용하여 어디에서나 원하는 포트를 열 수 있으므로 놓칠 수 있습니다.

또 다른 방법은 네트워크에서 제거 된 가상 머신 또는 테스트 머신을 사용하여 프로세스를 별도로 분리하는 것입니다. 그런 다음 Wireshark 를 사용 하여 해당 시스템에서 모든 것을 잡을 수 있습니다 . 캡처 한 트래픽이 관련성이있을 것입니다.


"-e trace = network"를 추가하면 실제로 네트워크에 기록되는 데이터가 손실되어 일부 출력이 제거됩니다. "개구 된 소켓 수"또는 이와 유사한 것만 신경 쓰면 작업이 더 쉬워집니다.
dannysauer

3

바탕 IO 오류로 대답 나는 당신이 사용할 수있는 의심 iptables --uid-owner트래픽에 마커를 설정 한 다음 해당 마커 만 트래픽을 캡처 Wireshark를 요청할 수 있습니다. DSCP (차동 서비스 마커), 흐름 ID 또는 qos 마커를 사용할 수 있습니다.

또는 실제로이를 사용하여 해당 패킷을 다른 인터페이스로 보낸 다음 해당 인터페이스에서만 캡처 할 수 있습니다.



-1

아마도 iptables와 ulog가 작동 할 수 있습니까? 정확한 레시피는 없지만 iptables가 프로세스와 일치 할 수 있다고 생각 하면 일단 일치하면 ulog를 사용할 수 있습니다.


3
불행히도 iptables -m owner --pid-owner $PIDLinux 2.6.14에서 제거되었습니다 : ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook

-1

netstat 실행 및 텍스트 파일에 로깅을 반복하는 셸 스크립트를 만들 수 있다고 생각합니다. (매우 거친 단계)와 같은 것 :

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

나는 프로그래머가 아니므로 이것을 조정할 수 없습니다. 그러나 여기서 누군가는 내가 그만 둔 곳에서 시작하여 당신을 위해 작동하는 스크립트를 만들 수 있습니다.


충분하지. 문제는 확인 시점에 활성 상태가 아닌 모든 네트워크 트래픽 을 캡처 하는 것입니다.
Reinier Post
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.