Linux 인터페이스가 연결된 IP를 얻습니다.

Linux 인터페이스가 연결된 IP를 얻습니다.

현재 연결된 IP와 그 상태를 가져올 수 있는 인터페이스가 Linux에 있습니까? ss및 에 대해 알고 있지만 이미 해당 기능이 있는 다른 "공식" 커널 인터페이스(있는 경우)를 netstat사용하고 싶습니다 . /proc/존재하지 않는 경우 이 정보를 어디서 얻기 시작합니까? 기본적으로 프로그래밍 방식으로 검색할 수 있도록 이 정보가 포함된 인터페이스가 필요합니다.

답변1

또한 ss현재 netstat추천할 만한 다른 도구가 없습니다.

이를 얻는 방법에 대한 정보:

이렇게 하면 man netstat리소스 섹션에서 FILESnetstat가 정보를 수집하는 데 사용하는 나열된 파일 중 일부를 볼 수 있습니다.

그 중에는 /proc/net/tcp및 가 있습니다 /proc/net/udp.

cat /proc/net/tcp시스템의 TCP 연결에 대한 다양한 정보를 볼 수 있는 경우 .

예제 출력은 다음과 같습니다.

sl local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
0: 0101007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 11190 1 0000000000000 000 100 0 0 10 0
1: 8700A8C0:91FC 0F02000A:15B3 01 00000000:00000000 02:00000AF6 00000000  1000        0 5565254 2 00000000000 00000 46 4 13 10 -1

rem_address이것이 당신이 찾고 있는 IP입니다. 제가 잘 알지는 못하지만, st현재 상황에 대해 몇 가지 정보를 드릴 수 있을 것 같습니다. 0A이어야 한다 는 을 LISTEN의미 01한다 ESTABLISHED.

예를 들어 디코딩은 local_address매우 rem_address쉽습니다 .8700A8C0:8F76

Format: hex(rev_ip):hex(port)

87 -> 135
00 -> 0
A8 -> 168
C0 -> 192
:8F76 -> 36726

=> 192.168.0.135, Port 36726

이 디렉토리에 대한 자세한 내용 /proc/net여기.

제공된 데이터에 대한 자세한 내용은여기.

관련 SO 스레드는 다음과 같습니다.여기.

답변2

실행하면 이것이 어떻게 작동하는지에 대한 strace lsof -i 2>&1 | grep open몇 가지 단서를 얻을 수 있습니다 .lsof -i

open("/proc/1/fdinfo/7", O_RDONLY)      = 5
open("/proc/net/ax25", O_RDONLY)        = -1 ENOENT (No such file or directory)
open("/proc/net/ipx", O_RDONLY)         = -1 ENOENT (No such file or directory)
open("/proc/net/raw", O_RDONLY)         = 5
open("/proc/net/netlink", O_RDONLY)     = 5
open("/proc/net/packet", O_RDONLY)      = 5
open("/proc/net/unix", O_RDONLY)        = 5

일부 파일은 내 시스템에 존재하지 않습니다. 이러한 파일 중 일부는 로그인되어 있지만 man proc해당 출력을 이해하기 어렵지는 않습니다.

그런 다음 lsof -i전체 프로세스 테이블을 오름차순으로 그대로 탐색하여 열린 설명자를 찾습니다.

open("/proc/2/stat", O_RDONLY)          = 4
openat(AT_FDCWD, "/proc/2/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/3/stat", O_RDONLY)          = 4
openat(AT_FDCWD, "/proc/3/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/5/stat", O_RDONLY)          = 4
openat(AT_FDCWD, "/proc/5/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/7/stat", O_RDONLY)          = 4
openat(AT_FDCWD, "/proc/7/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/8/stat", O_RDONLY)          = 4
[...]
openat(AT_FDCWD, "/proc/101/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/112/stat", O_RDONLY)        = 4
openat(AT_FDCWD, "/proc/112/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/143/stat", O_RDONLY)        = 4
openat(AT_FDCWD, "/proc/143/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/143/fdinfo/3", O_RDONLY)    = 5
open("/proc/143/fdinfo/4", O_RDONLY)    = 5
open("/proc/143/fdinfo/5", O_RDONLY)    = 5
open("/proc/143/fdinfo/11", O_RDONLY)   = 5
open("/proc/143/fdinfo/12", O_RDONLY)   = 5
open("/proc/143/fdinfo/13", O_RDONLY)   = 5

답변3

또 다른 옵션은 커널을 사용 iptables하고 컴파일하거나 모듈로 로드하는 경우 ip_conntrack최신 사용자 공간 인터페이스 도구에서 iptables모든 연결 상태를 보는 것입니다./proc/net/ip_conntrackconntrack

$ sudo cat /proc/net/ip_conntrack
icmp     1 23 src=10.1.1.14 dst=10.1.1.1 type=8 code=0 id=10017 src=10.1.1.1 dst=10.1.1.14 type=0 code=0 id=10017 mark=0 use=2
unknown  2 597 src=10.1.1.10 dst=224.0.0.1 [UNREPLIED] src=224.0.0.1 dst=10.1.1.10 mark=0 use=2
udp      17 17 src=10.1.1.181 dst=10.1.1.255 sport=17500 dport=17500 [UNREPLIED] src=10.1.1.255 dst=10.1.1.181 sport=17500 dport=17500 mark=0 use=2
tcp      6 431999 ESTABLISHED src=10.1.1.14 dst=10.1.1.2 sport=22 dport=49218 src=10.1.1.2 dst=10.1.1.14 sport=49218 dport=22 [ASSURED] mark=0 use=2
icmp     1 28 src=10.1.1.14 dst=8.8.8.8 type=8 code=0 id=13601 src=8.8.8.8 dst=10.1.1.14 type=0 code=0 id=13601 mark=0 use=2

여기에는 로컬 연결뿐만 아니라 컴퓨터를 통해 라우팅된 연결에 대한 정보도 포함됩니다.

관련 정보