TCP 연결을 시작하는 로컬 프로세스 찾기

TCP 연결을 시작하는 로컬 프로세스 찾기

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);
}

as 로 저장하면 as 로 실행될 때 호출이 whomakeconnect.stp표시됩니다 .connectstaproot

# stap-prep
... fix anything reported, it requires debug kernels ...
# stap whomakeconnect.stp

답변3

netstat cammand를 사용할 수 있습니다. 패킷의 상태를 보여줍니다. 하지만 출력은 보내는 시간에만 보이는 것이므로 출력을 잡아야 합니다. 이는 TCP 청취 소켓과 다릅니다. 그렇기 때문에 watch 명령을 사용하여 이를 잡을 수 있습니다. 연결이 ipv4를 통해 이루어졌다고 가정합니다.

watch -n 0.1 'netstat -4pn | grep -F "SYN_SENT"'

네스타트 플래그

p 플래그: 프로세스 ID/이름

n 플래그: 숫자 출력(DNS 해상도 없음)

4 플래그: ipv4 소켓 표시

watch 명령은 netstat 명령이 0.1초 간격으로 반복적으로 실행되도록 합니다.

관련 정보