2011-12-06 1 views
4

저는 (Macromedia) 아키텍처에 반응하기 위해 두 개의 닫힌 소스 프로세스 (라우터 펌웨어) 사이에서 IPC를 모니터링해야하는 임베디드 플랫폼 (mipsel 아키텍처, Linux 2.6 커널)을 사용하고 있습니다. 특정 이벤트 (DSL 재 연결 때문에 동적 IP 변경). 지금까지 strace을 통해 IP 주소가 변경 될 때마다 DSL 데몬은 특정 파일 이름에 바인드 된 UNIX 도메인 소켓에 특수 메시지를 씁니다. 메시지는 다른 디먼에 의해 소비됩니다.WatchGuard UNIX 도메인 소켓 모니터링, 특정 컨텐츠에 대한 이벤트 트리거

다음은 필자의 요구 사항입니다. 특정 UNIX 도메인 소켓을 통한 데이터 흐름을 모니터링하고 특정 메시지가 감지되면 이벤트 (셸 스크립트 호출)를 트리거하려고합니다. inotify로 파일 이름을 모니터하려고했지만 소켓 파일에서는 작동하지 않습니다. 나는 strace를 항상 실행할 수 있고 출력을 필터링하고 필터링 된 로그 파일의 변화에 ​​반응 할 수 있지만 strace가 시스템 속도를 저하시키기 때문에 너무 무거울 수 있습니다. 나는 또한 cron을 통해 IP 주소 변경을 폴링 할 수 있다는 것을 알고 있지만 폴링 솔루션이 아닌 워치 독이 필요하다. UNIX 도메인 소켓을 특별히 모니터하고 미리 정의 된 방향으로 흐르는 특정 메시지에 반응 할 수있는 도구가 있는지 알아 보는 데 관심이 있습니다. inotifywait과 비슷한 것을 상상해 봅니다. 즉, 특정 이벤트를 기다린 다음 종료하여 이벤트에 반응하고 같은 유형의 다음 이벤트를 기다리면서 다시 도구를 시작하는 루프를 만들 수 있습니다.

그렇게 할 수있는 기존의 Linux 도구가 있습니까? 아니면 내 플랫폼 (uClibc, glibc가 아닌)에서 컴파일 할 수있는 독립 실행 형 바이너리를위한 간단한 C 코드가 있습니까? 저는 C 전문가는 아니지만 makefile을 실행할 수 있습니다. 셸에서 바이너리를 사용하는 것은 문제가되지 않습니다. 셸 프로그래밍에 대해 충분히 알고 있습니다.

+0

관련 : [? 내가 tcpdump와 같은 로컬 유닉스 도메인 소켓을 모니터링 할 수 있습니다 (https://superuser.com/q/484671/87805) – kenorb

답변

5

은 내가이 주제를 다루는 이후 잠시왔다 실제로 내 아는 사람, 데니스 브라 센코는 비지 박스의 메인테이너가 몇 달 전에 나에게 솔루션으로 제안 무엇을 테스트 주위에하지 않았다 . StackOverflow에서 내 계정을 확인하고 다시 질문을 보았으므로 그의 통찰력을 나에게 알려주십시오.

난 당신이 유닉스 도메인 청취 소켓 (예를 들어, /tmp/some.socket을 열어 실행중인 서버 응용 프로그램이 있다고 가정 : 내가 제안 할 수

하나 비교적 쉽게 해킹이 다음을 수행하는 것입니다 : 아마 누군가 도움이됩니다), 클라이언트 프로그램이 연결되어 서버와 통신합니다.

  • /tmp/some.socket 이름을 변경 ->/tmp/some.socket1
  • 이 새로운 소켓/tmp를/일부를 만들 수 있습니다.소켓의 쌍 (그렇게하는 코드를 결과 이상 - 소켓
  • 펌프 데이터 (> 서버 클라이언트 <) 원래 서버 프로세스에 /tmp/some.socket1 또 다른 연결을 열고, 그러한 모든 연결을위한 새로운 클라이언트 연결
  • 을 위해 수신 대기 telnetd 서버가하는 것과 매우 비슷합니다.) 어느 쪽에서도 EOF가 나올 때까지.

데이터를 펌핑하는 동안 데이터를보고, 저장하고, 필요에 따라 수정할 수도 있습니다.

단점은이 스니퍼 프로그램을 원래 서버 프로그램을 다시 시작할 때마다 다시 시작해야한다는 것입니다.

이것은 와 비슷합니다. Celada도 대답했습니다. 그에게 감사드립니다! Denys의 대답은 조금 더 구체적이었습니다.

내가 다시 질문 :이 때문에 다시 시작 필요성, 그래, 해키 소리

만 가능. C 프로그래머가 아니기 때문에 패스 스루 및 프로토콜 링을 수행 할 수있는 명령 줄 도구 또는 이벤트 기반 트리거가 작동하는지 알고 있으면 계속 궁금해합니다. 나는 에있는 우리 프로젝트에서 한 사람을 가지고있다. 그 사람은 조금 C 바이너리를 해킹 할 수 있었지만 그는 이 그것을 좋아하는지 확신 할 수 없다. 예비 팹이 있다면, 나는 그것을 선호 할 것입니다. BusyBox 애플릿 (조합)을 사용해도 될까요?

데니스 다시 대답

당신은 CONFIG_FEATURE_UNIX_LOCAL=y와 비지 박스를 구축 할 필요가있다.

실행 인터셉트 서버 다음

script.sh는 "원래 서버"에 대한 간단한 통과 연결 이다
busybox tcpsvd -vvvE local:/tmp/socket 0 ./script.sh 

:

#!/bin/sh 
busybox nc -o /tmp/hexdump.$$ local:/tmp/socket1 0 

예로서, I 헥사 로깅 추가 파일 (-o FILE 옵션).

busybox tcpsvd -vvvE local:/tmp/socket1 0 sh -c 'echo PID:$$' 

및 "서버를 차단"에 연결하여 : 에뮬레이트 "원래 서버"를 실행하여

는 테스트를

echo Hello world | busybox nc local:/tmp/socket 0 

당신은 "PID : 19094"을 참조한다 메시지를하고 있습니다 새로운 /tmp/hexdump.19093 파일 을 덤프 된 데이터와 함께 사용하십시오. 두 tcpsvd 프로세스는 모두 인 로그를 인쇄해야합니다 (이들은 -vvv 상세 표시로 실행됩니다).

복잡한 처리가 필요한 경우 script.sh 에 nc 호출을 사용자 지정 프로그램으로 바꿉니다.

+0

Docker의 Alpine 컨테이너 내부에 유닉스 소켓을위한 솔루션을 찾는 데 5 시간을 소비하기 전에'local :'제안을 보았 으면합니다. – Yaron

0

유닉스 소켓 트래픽을 깨끗이 스니핑하게 해주는 것은 없다고 생각합니다. 다음은 몇 가지 옵션은 다음과 같습니다 보낸 사람 프로세스가 당신이 듣고있는 다른 소켓에 연결하는

  • 가 정렬합니다. 또한 원래 소켓을 클라이언트로 연결하십시오. 데이터를 받으면 알리고 싶은 데이터를 확인하고 모든 것을 원래 소켓으로 전달하십시오.
  • netlink 소켓 (RTM_NEWADDR, RTM_NEWLINK 등 ...)을 사용하여 시스템에서 IP 주소 변경 사항을 모니터링하십시오.
  • ip monitor을 외부 프로세스로 실행하고 추가 된 &에 대한 메시지를 표준 출력에 기록 할 때 조치를 취합니다.
+0

감사합니다, 내가 첫 번째 제안처럼 생각합니다. 나는 내 질문에 대답하는 사람의 말을 인용하고있는 내 대답 (지금 막 게시 됨)에서 그렇게하는 방법에 대해 자세히 설명했다. – kriegaex