내 컴퓨터로 나가는 모든 요청/연결을 어떻게 모니터링합니까?

내 컴퓨터로 나가는 모든 요청/연결을 어떻게 모니터링합니까?

내 컴퓨터가 서버이므로 내 서버에 대한 연결을 무시하고 싶습니다(예: 누군가가 내 웹사이트를 방문할 때). 보고 싶어요오직내 서버가 다른 장소에 연결/요청합니다.

내 생각엔 어때?오직나가는 연결?

편집: 저는 이런 종류의 일을 처음 접했습니다. 내가 원하는 것은 내 웹 애플리케이션의 데이터 외에 내 서버에서 전송되는 것이 있는지 확인하는 것뿐입니다. 예를 들어, 누군가 내 웹사이트를 방문하면 분명히 내 서버가 클라이언트의 브라우저로 데이터를 보낼 것입니다. 하지만 웹 앱 프레임워크 어딘가에 내가 모르는 다른 곳으로 통계를 보내는 코드도 있다고 가정해 보겠습니다. 내 서버가 데이터를 전송하는 위치(있는 경우)를 확인하고 싶습니다. 그럴 가능성은 거의 없지만 작성하지 않은 php 또는 nodejs 프레임워크를 사용하기로 결정했다고 가정해 보겠습니다. 어떤 유형의 데이터를 어딘가로 보낼 가능성이 있습니다. 그렇다면, 그것이 내가 보고 싶은 것입니다.

답변1

사용 netstat. 예를 들어

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

모든 UDP( u), TCP( t) 및 RAW( w) 나가는 연결(OR 사용 안 함 l)을 숫자로 나열하고(장시간 실행되는 DNS 쿼리를 방지하기 위해) 관련 프로그램( )을 포함합니다.anp

c출력을 최신 상태로 유지하려면 옵션을 추가하는 것이 좋습니다 .

답변2

iftop, ntop, iptraf및 물론 매우 유용한 내장 도구 (지원되는 옵션은 OS에 따라 다름) 를 포함한 많은 도구를 시도했지만 netstat -tupln내 사용 사례에 가장 실용적인 것은nethogs- 연결을 집계합니다.원래 응용 프로그램으로, 모든 소음 중에서 가장 작습니다.

다음을 통해 설치할 수 있습니다.

sudo apt-get install nethogs

루트로 실행:

sudo nethogs

목표가 애플리케이션에서 시작된 모든 TCP 연결을 확인하는 것이라면 다음을 사용할 수 있습니다.

sudo tcpdump -i lo -A | grep Host:

고쳐 쓰다:새로 추가됨:밴드— 블록의 새로운 어린이는 nethogsRust로 작성되고 Linux, MacOS 및 Windows에서 실행되는 것과 같습니다.

답변3

모든 연결 시도를 기록하려는 경우 가장 간단한 방법은 iptables LOGLinux의 대상(또는 시스템의 이에 상응하는 방화벽 로깅 기능)일 것입니다.

연결 기간 및 양방향으로 교환되는 데이터 양과 같은 추가 정보가 필요한 경우 conntrackd(Linux에서)가 최선의 선택일 수 있습니다.

그러나 위의 두 로그 트래픽은 netfilter를 통과하는 트래픽만 기록합니다. 이는 일반적으로 모든 트래픽이지만 사용자 공간(예: 가상 머신 또는 원시 소켓을 사용하는 모든 항목)의 IP 스택에서 생성되거나 브리지된 트래픽을 고려하지 않습니다. 교통.

보다 일반적인 솔루션의 경우 인터페이스에서 스니핑된 트래픽을 기반으로 argus, bro-ids, 등의 다양한 정보를 기록 sancp하거나 로그할 수 있습니다.ntop

답변4

내 생각에 당신이 원하는 것은 수신 포트 목록을 얻은 다음 다른 TCP 연결에서 제거하는 것입니다. 그러면 이것이 모두 나가는 연결이 될 것입니다. ss(소켓 상태) 명령은 "로컬 주소: 포트" 및 "피어 주소: 포트" 열을 출력합니다. "피어 주소: 포트" 열 대신 "로컬 주소: 포트" 열에서 수신 대기 포트를 제거해야 합니다. , 그렇지 않으면 일부 나가는 연결을 놓칠 수 있습니다. 따라서 이를 달성하기 위해 \s{2}+":$port" 문자열을 사용하여 "LocalAddress:Port" 열 뒤에 있는 공백을 일치시킵니다. 열 뒤에는 "Peer Address: port"에 공백이 있는 두 개 이상의 공백이 있습니다. 개행 문자(grrr... 개행 문자, IMO만 있어야 하며 대신 \s+이를 사용할 수 있습니다 \s{2}+.) 일반적으로 ss의 필터 기능을 사용하려고 할 수 있습니다 ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. 예를 들어, 해당 문자열은 길이에 제한이 있는 것 같습니다. 청취 포트가 많아 내 시스템에 폭탄이 터졌습니다. 그래서 grep으로 같은 작업을 시도했습니다. 나는 다음이 효과가 있을 것이라고 믿습니다:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

사용 중인 ss 버전에 따라 이전 버전(예: ss 유틸리티, iproute2-ss111117)의 출력 형식이 다르므로 awk에서 $4 대신 $3를 사용해야 할 수도 있습니다. 또한 그것은 나에게 약간 반직관적인 다른 출력을 제공한다는 ss -tln점에 유의하십시오. ss -tn state listeningYMMV.

호스트의 IP를 알 필요가 없고 ss -tn state established dst :*훌륭하게 작동하는 좀 더 우아한 솔루션을 찾았습니다. 위의 명령줄을 수정했습니다.

관련 정보