각 연결 시도의 PID를 기록합니다.

각 연결 시도의 PID를 기록합니다.

netstat설정된 연결의 PID를 사용하거나 찾는 것은 쉽습니다 lsof. 그러나 60초마다 데이터베이스에 대한 연결을 생성하고 최대 연결 시도 실패 제한으로 잠그는 프로세스가 있습니다. 데이터베이스의 연결 실패 제한을 극도로 높게 늘릴 수도 있고, 연결이 이루어진 원인을 추적할 수도 있었는데, 저는 후자를 선택했습니다.

tcpdump/wireshark를 기반으로 연결이 설정된 다음 서버가 응답하기 전에 연결 서버가 즉시 연결을 닫는다는 것을 알 수 있습니다. 내가 모르는 것은 이유입니다.

첫 번째 단계는 연결을 연 PID를 찾는 것입니다. 불행하게도 이것은 말처럼 쉽지 않은 것 같습니다. 문제는 연결이 TIME_WAIT 상태에 들어가면 더 이상 PID와 연결되지 않는다는 것입니다. 연결 시간이 10분의 1초 미만이므로 이 정보를 기록할 수 있는 방법이 있습니까?

netstat매초마다 폴링할 수 있는 것 같지만 lsof제가 다루고 있는 연결 시도에 비해 속도가 충분히 빠르지 않습니다. 이 정보를 로그에 덤프하기 위해 연결할 수 있는 후크가 있습니까? 아니면 루프와 일부 코딩을 통해 무차별 대입을 수행하는 유일한 옵션입니까?

CentOS 6을 사용하고 있습니다.

답변1

사용을 고려해보세요시스템 클릭. 이는 소켓 열기와 같은 커널 내 이벤트를 추적할 수 있도록 즉석에서 커널을 패치할 수 있는 동적 계측 엔진입니다. RedHat에서 적극적으로 개발했기 때문에 CentOS에서 지원됩니다.

설치

CentOS 6에 SystemTap을 설치하려면:

  1. 디버그 정보 저장소를 활성화합니다.

    sed -i 's/^enabled=0/enabled=1/' /etc/yum.repos.d/CentOS-Debuginfo.repo
    
  2. 시스템 탭 설치:

    yum install systemtap
    
  3. 커널의 debuginfo 패키지를 설치합니다. 수동으로 수행할 수도 있지만 자동으로 수행하는 도구가 있습니다.

    stap-prep
    

SystemTap에는 TCP 연결을 위한 Tapset 프로브가 없지만 커널 기능에 직접 바인딩할 수 있습니다! 소켓 수준에서도 이 작업을 수행할 수 있습니다.

즉, 다음과 같은 파일을 만듭니다 conn.stp.

probe kernel.function("tcp_v4_connect") {
    printf("connect [%s:%d] -> %s:%d\n", execname(), pid(),
            ip_ntop(@cast($uaddr, "struct sockaddr_in")->sin_addr->s_addr),
            ntohs(@cast($uaddr, "struct sockaddr_in")->sin_port));
}

그러면 다음과 같은 결과가 출력됩니다.

# stap conn.stp
connect [nc:2552] -> 192.168.24.18:50000
connect [nc:2554] -> 192.168.24.18:50000
connect [nc:2556] -> 192.168.24.18:50000

그러나 연결 해제 이벤트를 추적하는 것은 더 까다로워 보입니다.

관련 정보