Linux 플랫폼에는 네트워크 패킷을 모니터링하고 이러한 패킷이 메모리에서 처리되어 CPU로 전송되는 방식을 모니터링할 수 있는 명령이나 도구가 있습니까?
예를 들어, tcpdump를 사용하면 많은 Apache 요청을 캡처할 수 있지만 이러한 패킷을 특정 프로세스 ID에 할당하는 방법을 모르겠습니다.
답변1
서버 프로세스가 시작되면 일부 시스템 호출( socket()
및 listen()
)이 발행됩니다. 그런 다음 시스템은 포트를 열고 프로세스와 상호 작용할 소켓 파일 설명자를 만듭니다. 다음을 통해 볼 수 있습니다:
Apache 기본 프로세스 ID를 찾습니다.
root@frisbee:~# ps -ef | grep apache | grep root
root 27440 1 0 16:06 ? 00:00:00 /usr/sbin/apache2 -k start
/proc/$pid/fd
소켓 으로 이동하여 확인하세요.
root@frisbee:~# ls -l /proc/27440/fd | grep socket
lrwx------ 1 root root 64 apr 16 16:12 3 -> socket:[518486]
lrwx------ 1 root root 64 apr 16 16:12 4 -> socket:[518487]
여기에서 Apache가 두 개의 소켓을 열었음을 알 수 있습니다. 파일 설명자 3과 4는 Apache 프로세스 내에서 네트워크 연결을 통해 데이터를 읽고 쓸 수 있습니다.
다음 명령을 사용하여 소켓과 수신 포트 간의 매핑을 찾을 수 있습니다 lsof
.
root@frisbee:~# lsof | egrep 'IPv6.*(518486|518487)'
apache2 27440 root 4u IPv6 518487 0t0 TCP *:http (LISTEN)
apache2 27445 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
apache2 27446 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
apache2 27447 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
apache2 27448 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
apache2 27449 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
root
동일한 파일 설명자를 사용하는 여러 Apache 프로세스가 있습니다( 특권 포트이기 때문에 실행 중인 프로세스에 의해 열립니다 ). 이들은 아파치 작업자입니다.
포트와 프로세스 간의 링크를 확인하는 더 쉬운 방법은 다음 명령을 사용하는 것입니다 netstat
.
mtak@frisbee:~$ sudo netstat -tulpn | grep apache
tcp6 0 0 :::80 :::* LISTEN 4269/apache2