tcpdump를 사용하면 많은 SYN 패킷이 표시되고 소스 IP는 localhost입니다.
어떤 프로세스가 연결을 시도하는지 찾고 싶습니다.
연결은 ESTABLISHED 상태에 도달하지 않으며 무작위 포트 스캔으로 나타납니다.
답변1
최근 Linux에서 동일한 상황이 발생했습니다(범인은 adb
). 내 접근 방식은 감사 시스템을 사용하여 connect()
시스템 호출을 기록하는 것입니다.
sudo auditctl -a exit,always -F arch=b64 -S connect -k who-connects
모든 시스템 호출을 기록하도록 감사 시스템에 지시합니다 connect()
(여기에는 64비트 변형이 있습니다. 32비트 및 64비트 응용 프로그램이 모두 포함된 다중 아키텍처 시스템을 사용하는 경우 32비트 변형에 대해 다른 시스템 호출을 추가할 수 있습니다)
나중에 실행:
sudo ausearch -i -k who-connects
무엇이 연결되는지 확인하세요.
소켓 API를 사용하지 않고도 TCP 연결을 설정할 수 있습니다. 예를 들어, 사용자 공간에서 TCP 스택을 구현하고 하위 수준 API를 사용하여 패킷을 전송하면 이는 덜 일반적입니다(특히 루프백 인터페이스에서).
답변2
SystemTap이 설치되어 있다고 가정
probe begin {
printf("ok\n");
}
probe syscall.connect {
# connect however may fail or flail around in a EINPROGRESS state;
# this log only indicates that a connect was attempted
if (uaddr_af == "AF_INET" || uaddr_af == "AF_INET6")
printf("%s[%d]: %s\n", execname(), pid(), argstr);
}
probe syscall.connect.return {
printf(" -> %s[%d]: %s\n", execname(), pid(), retstr);
}
다른 이름으로 저장은 다음을 사용하여 실행할 때 whomakeconnect.stp
호출을 표시합니다 .connect
stap
root
# stap-prep
... fix anything reported, it requires debug kernels ...
# stap whomakeconnect.stp
답변3
netstat 명령을 사용할 수 있습니다. 패킷의 상태를 보여줍니다. 하지만 출력은 전송할 때만 나타나기 때문에 캡쳐해야 합니다. TCP 청취 소켓과 다릅니다. 그렇기 때문에 watch 명령을 사용하여 이를 잡을 수 있습니다. 연결이 ipv4를 통해 이루어진 것 같습니다.
watch -n 0.1 'netstat -4pn | grep -F "SYN_SENT"'
네스타 깃발
p 플래그: 프로세스 ID/이름
n 플래그: 숫자 출력(DNS 확인 없음)
4 플래그: ipv4 소켓 표시
watch 명령을 사용하면 netstat 명령이 0.1초 간격으로 반복적으로 실행됩니다.