2016-09-11 6 views
0

Linux 3.9 커널 이상에서 실행되는 특정 소켓에서 연결을 수신하는 응용 프로그램 X가 있습니다. 이 소켓, 소스 IP 등에 연결 시도 횟수를 추적하는 무관 한 응용 프로그램 Y를 작성하려고합니다.관련없는 프로세스간에 소켓 공유 (수신 대기)

Q ++ 라이브러리를 통해 (이상적으로는 Qt 라이브러리를 통해) 소켓을 이미 공유/모니터 할 수 있습니까? 관련이없는 프로세스에서 사용 중입니까? 소켓을 공유하기위한 포크를 제안하는 몇 가지 StackOverflow 질문을 발견했지만,이 경우 불가능합니다.

+1

당신은'tcpdump'를 사용할 수 있습니다 : http://superuser.com/questions/604998/monitor-tcp-traffic-on-specific-port –

+0

하나의 방법은 (어떤 특별한 OS- 레벨 기능)는 Y가 X를 대신하여 연결을 허용하고 X의 프록시 역할을하는 것입니다 (X의 포트에 연결하고 트래픽을 앞뒤로 전달 함으로서). 하지만 Y는 다른 포트에서 연결을 수락해야합니다. X를 직접 조작하는 것이 더 쉬울 수도 있습니다. –

답변

1

파일 디스크립터를 교차 프로세스 dup (2)처럼 동작하는 다른 프로세스로 전송할 수 있습니다. 자세한 내용은 Can I open a socket and pass it to another process in Linux을 참조하십시오. 그러나이를 명시 적으로 수행해야합니다. 즉, 한 프로세스가 파일 설명자를 보내고 다른 프로세스가 파일 설명자를 수신합니다. 따라서 "비 관련"프로세스가 협력해야합니다.

그러나 청취 소켓은 모니터링에 사용할 수 없습니다. 소켓은 연결 만 수락 할 수 있지만 소켓이 포크, 스레딩 또는 파일 설명자 전달과 공유 되더라도 다른 프로세스가 동일한 소켓에서 연결을 수락했는지 여부를 확인할 수 없습니다.

올바른 사용 권한과 OS가 있으면 ptrace (2) 또는 유사한 인터페이스를 사용하여 syscall 수준에서 응용 프로그램의 동작을 모니터링 할 수 있습니다. 애플리케이션에서 수락을 사용하는지 반환하는지 확인할 수 있습니다. 또는 주석에 제안 된 것처럼 패킷 캡처 (tcpdump, 원시 소켓)를 사용하여 트래픽을 감시하고 일부 (알 수없는) 프로세스가 연결을 수락 했음에 틀림없는 성공적인 TCP 핸드 셰이크에서 제외 할 수 있습니다.

+0

프로세스 X는 다른 회사에서 작성한 것이며 내부적으로 액세스 할 수 없습니다. – TSG

+0

@Telium : ptrace 및 패킷 캡처를 제공합니다. 또는 libc 호출을 받아들이려고 시도 할 수 있습니다. –