programing

프로세스가 소유한 소켓을 결정하는 Linux API

newstyles 2023. 9. 21. 20:09

프로세스가 소유한 소켓을 결정하는 Linux API

어떤 프로세스가 어떤 IP 소켓을 소유하고 있는지 알 수 있는 Linux 라이브러리가 있습니까?제 생각에 저는 그 프로그램과 같은 것을 찾고 있는 것 같습니다.lsof -i. 궁극적으로, 저는 다음과 같은 방법을 통해 본 패킷의 상관 관계를 파악하고자 합니다.libpcap공정에 적용할 수 있습니다.

업데이트: 몇 명의 사람들이 그들이 사용할 것을 제안했습니다./proc/<pid>/net/tcp그리고.udp, 하지만 제 시스템에서는 모든 프로세스에 동일한 데이터가 표시되므로 도움이 되지 않습니다.

예를 들어 /proc/*/fd에서 열린 fds를 먼저 살펴봐야 할 것 같습니다.

4 -> socket:[11147]

그런 다음 /proc/net/tcp(또는 /proc/net/udp)에서 참조된 소켓(아이노드 기준)을 찾습니다.

12: B382595D:8B40 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000  1000        0 11065 1 ffff88008bd35480 69 4 12 4 -1

프로세스가 소유한 소켓을 결정하려면 그냥 사용할 수 있습니다.netstat. 다음은 출력(단축)이 있는 예입니다.netstat당신이 원하는 대로 할 수 있는 옵션들이 있습니다.

$ sudo netstat -apeen
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp        0      0 127.0.0.1:8118          0.0.0.0:*               LISTEN      138        744850      13248/privoxy   
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      117        9612        2019/postgres   
udp        0      0 127.0.0.1:51960         127.0.0.1:51960         ESTABLISHED 117        7957        2019/postgres   
udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          7740        1989/dhclient   
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     7937     2019/postgres       /var/run/postgresql/.s.PGSQL.5432
unix  2      [ ACC ]     STREAM     LISTENING     958058   8080/emacs          /tmp/emacs1000/server
unix  2      [ ACC ]     STREAM     LISTENING     6969     1625/Xorg           /tmp/.X11-unix/X0
unix  2      [ ]         DGRAM                    9325     1989/dhclient       
unix  3      [ ]         STREAM     CONNECTED     7720     1625/Xorg           @/tmp/.X11-unix/X0

netstat를 root으로 실행해야 합니다. 그렇지 않으면 다음 메시지가 나타납니다.

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)

에 대한 설명.-apeennetstat manage의 옵션:

-a, --all
    Show both listening and non-listening sockets. With the
    --interfaces option, show interfaces that are not up

-p, --program
    Show the PID and name of the program to which each socket
    belongs.

-e, --extend
    Display additional information. Use this option twice for
    maximum detail.

--numeric , -n
    Show numerical addresses instead of trying to determine symbolic host, port or user names.

--numeric-hosts
    shows numerical host addresses but does not affect the resolution of port or user names.

--numeric-ports
    shows numerical port numbers but does not affect the resolution of host or user names.

--numeric-users
    shows numerical user IDs but does not affect the resolution of host or port names.

/procfile system 은 네트워킹 정보를 포함하여 각 프로세스에 대한 세부 정보를 제공합니다.열린 소켓 정보가 에 나열되어 있습니다./proc/net/tcp. IPv6 소켓은 에 별도로 나열되어 있습니다.tcp6파일. 소켓 정보는 로컬 및 원격 포트와 소켓 아이노드 번호와 같은 정보를 포함하며, 이는 프로세스에 다시 매핑될 수 있습니다./proc/{pid}/fd/*정보.

잘 모르신다면./proc파일 시스템, 그것은 기본적으로 커널이 모든 종류의 유용한 정보를 사용자 공간에 게시할 수 있게 해주는 가상 파일 시스템입니다.일반적으로 파일은 구문 분석하기 쉬운 간단한 구조의 텍스트 파일입니다.

예를 들어, Ubuntu 시스템에서 사용한netcat테스트를 위해, 그리고 실행.nc -l -p 8321포트 8321에서 청취합니다.지금 보니까.tcp소켓 정보:

$ cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:2081 00000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 26442 1 de0c8e40 300 0 0 2 -1                             
   1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7019 1 de0c84c0 300 0 0 2 -1                              

첫 번째 줄은 8321번 지점(0x2081)의 모든 주소에서 수신 중임을 나타냅니다.아이노드 번호는 26442로 일치하는 pid in을 조회하는데 사용할 수 있습니다./proc/{pid}/fd/*, 파일 핸들 번호에서 장치로 연결되는 여러 개의 심볼 링크로 구성됩니다.그래서 만약 우리가 PID를 찾아보면,netcat, 그리고 그것을 확인합니다.fd매핑:

$ ls -l /proc/7266/fd
total 0
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 0 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 1 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 2 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 3 -> socket:[26442]

그리고 우리는 이 과정에서 파일 디스크립터 3이 예상대로 inode 26442의 소켓에 매핑되는 것을 볼 수 있습니다.

따라서 분명히 소켓의 완전한 맵을 구축하려면 먼저 모든 소켓을 열거해야 합니다./proc/**/fd/* 링크를 ,고,시킵니다의 를 일치시킵니다./proc/net/tcp엔드포인트 정보를 가지고 있습니다.

이 입니다.lsof구조) )lsof/dialects/linux/dsocket.c실행을 위하여).

/proc/<pid>/net입니다에 합니다./proc/net즉, 사용자와 동일한 네트워크 네임스페이스에 있는 모든 프로세스에 대해 "글로벌" 정보입니다.

당신은 무엇을 할 수 있습니다.lsof그리고.fuser인 두 를 통해 되는 것입니다./proc/<pid>/fd/*그리고./proc/net/*일치하는 inode를 찾습니다.빠른 시연:

#!/bin/sh
pgrep "$@" | while read pid; do
    for fd in /proc/$pid/fd/*; do
        name=$(readlink $fd)
        case $name in
            socket:\[*\])
                ino=${name#*:}
                for proto in tcp:10 tcp6:10 udp:10 udp6:10 unix:7; do
                    [[ ! -e /proc/net/${proto%:*} ]] ||
                    awk "
                        \$${proto##*:} == ${ino:1:${#ino}-2} {
                            print \"${proto%:*}:\", \$0
                            exit 1
                        }
                    " /proc/net/${proto%:*} || break
                done
                ;;
        esac
    done
done

, , , udplite, in)로할 수 (ax25, ipx, 패킷, raw, raw6, udplite, udp6lite in)./proc/net/ 또는 작성합니다too)합니다.

프로파일 시스템에서 읽을 수 있습니다.하려는 '은 일'다에서 수 있습니다./proc/<pid>/net(namely tcp, udp, unix)

다음은 프로파일 시스템을 사용하는 몇 가지 예입니다.

strace를 사용하여 수많은 파일을 실행하여 /procit의 어떤 파일에서 데이터를 가져오는지 확인할 수 있습니다.

정보원으로 갈 겁니다

http://ubuntuforums.org/showthread.php?t=1346778

언급URL : https://stackoverflow.com/questions/1980355/linux-api-to-determine-sockets-owned-by-a-process