Linux에서 어떤 프로세스가 UDP 트래픽을 발생시키는 지 식별하려면 어떻게해야합니까?


39

내 컴퓨터가 계속 udp dns 트래픽 요청을하고 있습니다. 내가 알아야 할 것은이 트래픽을 생성하는 프로세스의 PID입니다.

TCP 연결의 일반적인 방법은 netstat / lsof를 사용하고 pid와 관련된 프로세스를 얻는 것입니다.

UDP는 연결이 stateles이므로 netastat / lsof를 호출하면 UDP 소켓이 열려 있고 트래픽을 보내는 경우에만 볼 수 있습니다.

나는 함께 시도 lsof -i UDP와 함께 nestat -anpue,하지만 난 호출 할 필요가 있기 때문에 그 요청을하고있다 느릅 나무 프로세스를 찾을 수 없습니다 lsof를 / NETSTAT하는 UDP 트래픽이 발송에 실패 정확하게 할 때, 나는 lsof를 / NETSTAT 전 / UDP 데이터 그램이 발송에 실패 후 IS를 호출하는 경우 열린 UDP 소켓을 볼 수 없습니다.

3/4 udp 패킷이 전송 될 때 netstat / lsof를 호출하는 것은 불가능합니다.

악명 높은 프로세스를 어떻게 식별 할 수 있습니까? 패킷의 내용에서 전송 된 PID를 식별하기 위해 트래픽을 이미 검사했지만 트래픽의 접촉에서 PID를 식별 할 수는 없습니다.

누구든지 나를 도울 수 있습니까?

이 기계의 루트입니다. FEDORA 12 Linux noise.company.lan 2.6.32.16-141.fc12.x86_64 # 1 SMP 수 7 월 7 일 04:49:59 UTC 2010 x86_64 x86_64 x86_64 GNU / Linux

답변:


48

리눅스 감사가 도움이 될 수 있습니다. 최소한 데이터 그램 네트워크 연결을 만드는 사용자와 프로세스를 찾습니다. UDP 패킷은 데이터 그램입니다.

먼저, auditd플랫폼에 프레임 워크를 설치하고 auditctl -l규칙이 정의되어 있지 않은 경우에도 무언가 를 리턴 하는지 확인하십시오 .

그런 다음 규칙을 추가하여 시스템 호출을보고 socket()나중에 쉽게 찾을 수 있도록 태그를 지정하십시오 ( -k). 나는 당신이 64 비트 아키텍처에 있다고 가정해야하지만 그렇지 않은 경우 b32대신 대신 할 수 있습니다 b64.

auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

이를 구축하려면 매뉴얼 페이지와 헤더 파일을 선택해야하지만 캡처하는 것은 기본적으로이 시스템 호출입니다. socket(PF_INET, SOCK_DGRAM|X, Y)세 번째 매개 변수는 지정되지 않지만 자주 0입니다. PF_INET2이고, SOCK_DGRAM2 TCP 연결을 사용하는 것입니다 SOCK_STREAM설정할 것이다 a1=1. ( SOCK_DGRAM두 번째 매개 변수에서 SOCK_NONBLOCKor 와 OR을 사용 SOCK_CLOEXEC하여 &=비교할 수 있습니다.) -k SOCKET나중에 감사 추적을 검색 할 때 사용하려는 키워드입니다. 그것은 무엇이든 될 수 있지만 간단하게 유지하고 싶습니다.

잠시 후 감사 추적을 검토하십시오. 선택적으로, 네트에서 호스트를 핑 (ping)하여 몇 개의 패킷을 강제로 만들 수 있습니다. 이로 인해 DNS 조회가 발생하고 UDP를 사용하여 감사 경보를 차단해야합니다.

ausearch -i -ts today -k SOCKET

그리고 아래 섹션과 유사한 출력이 나타납니다. 중요한 부분을 강조하기 위해 약어로 사용하고 있습니다

type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET

위 출력에서 ping명령으로 인해 소켓이 열린 것을 알 수 있습니다. 그때 실행할 수 있습니다 strace -p 14510여전히 실행중인 경우, 과정에. ppid(상위 프로세스 ID)도 경우에 나열된는 스크립트가 스폰 문제 아이 많은 그.

이제 UDP 트래픽이 많으면 충분하지 않으며 OProfile 또는 SystemTap 을 사용해야합니다 . 두 가지 모두 현재 내 전문 지식을 벗어납니다.

이것은 일반적인 경우에 범위를 좁히는 데 도움이됩니다.

작업이 완료되면, 당신이 그것을 만드는 데 사용 된 동일한 회선을 사용하여 감사 규칙을 제거 만 교체 -a와 함께 -d.

auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

나는 그것을 시도 할 것이지만 정답이라고 생각합니다.
boos

이것은 적어도 나에게 iptables에 의해 삭제되는 트래픽을 포착하지 않습니다.
2rs2ts

1
systemtap 방법과 비교하여 단순성 +1 (보다 분석적이지만 커널 개발 패키지가
필요함

23

netstat를 사용할 수 있지만 올바른 플래그가 필요하며 데이터를 전송하는 프로세스가 아직 활성 상태 인 경우에만 작동합니다. 잠깐 동안 생겨났다가 UDP 트래픽을 보낸 다음 사라진 흔적을 찾을 수 없습니다. 또한 로컬 루트 권한이 필요합니다. 그것은 말했다 :

다음은 로컬 호스트에서 ncat을 시작하여 존재하지 않는 시스템 10.11.12.13의 포트 2345로 UDP 트래픽을 보내는 것입니다.

[madhatta@risby]$ ncat -u 10.11.12.13 2345 < /dev/urandom

다음은 트래픽이 진행되고 있음을 증명하는 tcpdump 출력입니다.

[root@risby ~]# tcpdump -n -n port 2345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:41:32.391750 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.399723 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.401817 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.407051 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.413492 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.417417 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192

다음은 netstat를 -a 플래그 (포트 세부 사항 참조) 및 -p 플래그와 함께 사용하여 프로세스 ID 세부 사항을 표시 하는 유용한 비트 입니다. 루트 권한이 필요한 -p 플래그입니다.

[root@risby ~]# netstat -apn|grep -w 2345
udp        0      0 192.168.3.11:57550          10.11.12.13:2345            ESTABLISHED 9152/ncat     

보시다시피, pid 9152는 지정된 원격 호스트의 포트 2345에 대한 연결이 열려있는 것으로 표시됩니다. Netstat도 유용하게 ps를 통해 프로세스를 실행하고 프로세스 이름이임을 알려줍니다 ncat.

잘만되면 그것은 약간의 사용이다.


정말 잘 했어요! : thumbup :
ThorstenS

2
그래도 캐치가 있습니다. DNS 조회를 수행하고 해당 프로세스가 빠르게 종료되는 하위 프로세스를 생성하는 쉘 스크립트로 인해 문제가 발생하면 소스 포트 (57550 이상)는 항상 변경됩니다. 이 경우 기술이 작동하지 않으므로보다 과감한 조치를 취해야합니다. 또한 grep -w 57550여러 프로세스에서 동일한 서버에 대한 DNS 조회를 수행 할 수 있으므로 netstat에서 수행해야 합니다. 당신의 방법은 그들을 구별하지 않을 것입니다.
zerolagtime

1
나는 당신의 이의 제기, zerolagtime에 동의합니다 (그러나 어쨌든 당신의 친절한 말에 감사드립니다, ThorstenS!).
MadHatter는 Monica

17

나는 정확히 같은 문제가 있었고 불행히도 auditd나를 위해 많은 것을하지 않았다.

나는 구글 DNS 주소를 향해 내 일부 서버의 트래픽을했다, 8.8.8.8하고 8.8.4.4. 이제 내 네트워크 관리자는 약한 OCD를 가지고 있으며 인턴 DNS 캐시가 있기 때문에 불필요한 트래픽을 모두 정리하고 싶었습니다. 그는 캐시 서버를 제외한 모든 사람에 대해 나가는 포트 53을 비활성화하려고했습니다.

따라서에 실패한 후에 auditctl파헤칩니다 systemtap. 다음 스크립트를 생각해 냈습니다.

# cat >> udp_detect_domain.stp <<EOF
probe udp.sendmsg {
  if ( dport == 53 && daddr == "8.8.8.8" ) {
    printf ("PID %5d (%s) sent UDP to %15s 53\n", pid(), execname(), daddr)
  }
}
EOF

그런 다음 간단히 실행하십시오.

stap -v udp_detect_domain.stp

이것은 내가 얻은 결과입니다.

PID  3501 (python) sent UDP to  8.8.8.8 53
PID  3501 (python) sent UDP to  8.8.8.8 53
PID  3506 (python) sent UDP to  8.8.8.8 53

그게 다야! resolv.conf해당 PID를 변경 한 후에 는 변경 사항이 적용되지 않았습니다.


도움이 되었기를 바랍니다 :)


5

다음은 stap verson 1.8 이상에서 사용 가능한 netfilter 프로브를 사용하는 시스템 탭 옵션입니다. 도 참조하십시오 man probe::netfilter.ip.local_out.

# stap -e 'probe netfilter.ip.local_out {
  if (dport == 53) # or parametrize
      printf("%s[%d] %s:%d\n", execname(), pid(), daddr, dport)
}'
ping[24738] 192.168.1.10:53
ping[24738] 192.168.1.10:53
^C

4

tcpdump 또는 wireshark와 같은 네트워크 스니퍼를 사용하여 DNS 요청을 봅니다. 질의의 내용은 어떤 프로그램이 그것들을 발행하고 있는지에 대한 아이디어를 줄 수 있습니다.


내가 방금 본 트래픽에 대한 정보가 없습니다.
boos

정보가 없습니까? 빈 패킷? 내가 의미하는 것은, updates.java.sun.com 또는 rss.cnn.com을 해결하려고 시도하는 경우 유용하게 무언가를 유추 할 수 있다는 것입니다.
RedGrittyBrick

dns는 내부 프록시를 검색합니다. 지금은 느릅 나무 과정은 찾았지만, 공예 해결 일반적인 문제에 대한 살아 STIL 질문
야유를

lsof -i | awk '/ UDP /'
c4f4t0r

3

autitctl을 사용할 때 nscd는 DNS 쿼리를 수행 할 때 소켓 시스템 호출에서 약간 다른 매개 변수를 사용합니다.

socket(AF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP)

따라서 위에서 언급 한 것 외에도 이러한 쿼리를 포착하기 위해 원하는 경우 동일한 이름으로 추가 필터를 추가 할 수 있습니다.

auditctl -a exit,always -F arch=b64 -F a0=2  -F a1=2050 -S socket -k SOCKET

여기서 2050은 SOCK_DGRAM (2) 및 SOCK_NONBLOCK (2048) 의 비트 단위 OR입니다 .

그런 다음 검색에서 동일한 키를 가진 두 필터를 모두 찾습니다 SOCKET.

ausearch -i -ts today -k SOCKET

내가 찾은 소켓 상수의 16 진수 값 : https://golang.org/pkg/syscall/#pkg-constants

의견을 말할 평판이 없기 때문에 이것을 추가했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.