tcpdump와 같은 로컬 유닉스 도메인 소켓을 모니터링 할 수 있습니까?


59

원래 연결을 방해하지 않고 유닉스 소켓에서 응답을 모니터링하고 처리를 위해 스크립트로 파이프하고 싶습니다.

tcp 연결을 위해 tcpdump를 사용 하여이 작업을 수행하는 방법을 알고 있지만 로컬 유닉스 소켓에 대한 솔루션을 찾지 못하는 것 같습니다.

이것이 가능합니까?


답변:


15

두 소켓 사이의 게이트웨이 역할을하는 앱을 만들고 흐르는 모든 데이터를 로깅하여 그렇게 주장하는 사람이 있습니다. 따라서 소켓을 탭 할 수는 없지만 서비스를 다시 시작 하고이 녀석 앱을 사용하도록 조정하면 모든 트래픽을 볼 수 있습니다.

게시물에 대한 링크는 다음과 같습니다. Unix Socket Sniffer

소켓에 연결된 프로세스 ID를 찾은 다음 lsof를 사용하여 소켓의 파일 설명자를 찾은 다음 strace를 사용하여 파일 설명자를 누르십시오.

클라이언트 / 서버가 소켓을 사용하는 것을 중단하고 재구성 할 수 있다면 항상 첫 번째 방법, 두 번째 방법을 권장하는 것이 까다 롭고 일부 응용 프로그램에서는 충돌을 일으킬 수있는 현재 프로세스를 탭해야합니다.

누군가가 anoter 방식으로 우리를 계몽하기를 바랍니다 :)

행운을 빕니다


예, socat을 사용하여 중개인 방법을 수행 할 수는 있지만 기존 설정을 다른 곳에서 수정하지 않고 더 직접적인 방법을 원합니다.
ck_

1
그런 다음 lsof와 strace는 내가 아는 유일한 방법입니다. 프로세스에서 strace를 분리 할 때 produciton을 주시하고 그 후에 모든 것이 계속 실행되는지 확인하십시오.
Valor

3
이 직접 할 수없는 이유를 좀 더 주위를 파고 후 나는에 대한 몇 가지 세부 사항과 비슷한 질문을 발견 이상에 유래 stackoverflow.com/questions/8394613/...
ck_

80

socat을 사용할 수 있습니다.

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

위에서 일어나는 일 : 먼저 원래 소켓을 sock.original로 옮깁니다. Socat은 원본 위치에 새로운 소켓 ( 'UNIX-LISTEN')을 생성하고 모든 것을 원본 ( 'UNIX-connect')으로 전달합니다. -v는 socat에게 출력을 STDERR로 인쇄하도록 지시합니다.


3
좀 더 설명을 하시겠습니까?
Kazark

4
원래 유닉스 소켓에 파일 시스템에 경로가 있으면 쉽습니다. 그러나 실제로 이동할 수없는 추상 네임 스페이스 유닉스 소켓이라면 어떻게 될까요?
Valerio Schiavoni 2016 년

6

소켓 양쪽의 프로세스 중 하나에서 strace를 사용해보십시오. 이는 쓰기 / 읽기 내용을 볼 수 있기 때문입니다. 나는 프로덕션 환경에서 socat이 없지만 strace가 있습니다.

유용한 목적을 위해, -s를 큰 것으로 설정하는 것은 필수입니다.


이것은 나를 위해 잘 작동했으며 쉽게 할 수 있습니다. strace -p <pid>실행중인 프로세스를 보는 데 사용 합니다.
매트 먼슨

빠른 명령 : strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.log그리고 테스트를 실행하십시오. 로그가 너무 큰지 천천히 확인하는 /tmp/php.log가 있습니다. 트래픽이 너무 많은 경우 이름이나 쿼리 문자열을 사용하여 로그에서 검색 할 수 있도록 요청하십시오
higuita

1
@higuita 오랜 시간이 걸렸다는 것을 알고 있지만 그 루프 대신 printf반복을 처리 할 수 있습니다 . printf " -p %s" $(pidof php5-fpm)각 pid 인수 앞에 접두사 -p를 쓰고 훨씬 더 실용적입니다.
JoL

1
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

그때:

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