Linux-Schnittstelle zum Abrufen verbundener IPs

Linux-Schnittstelle zum Abrufen verbundener IPs

Gibt es eine Schnittstelle, um die aktuell verbundenen IPs und ihren Status in Linux abzurufen? Ich kenne ssund netstat, möchte aber /proc/oder eine andere „offizielle“ Kernelschnittstelle verwenden, die diese bereits hat (falls vorhanden). Wenn sie nicht vorhanden ist, wo fange ich an, diese Informationen zu erhalten? Im Grunde brauche ich eine Schnittstelle, die diese Informationen hat, damit ich sie programmgesteuert abrufen kann.

Antwort1

Ansonsten fallen mir aktuell keine weiteren Tools ein, die ich empfehlen würde ss.netstat

So erhalten Sie diese Informationen:

Wenn Sie man netstat, können Sie im Abschnitt FILESeinige aufgelistete Dateien sehen, die Netstat zum Sammeln seiner Informationen verwendet.

Darunter sind /proc/net/tcpund /proc/net/udp.

Wenn Sie dies tun, cat /proc/net/tcpkönnen Sie verschiedene Informationen zu TCP-Verbindungen auf Ihrem System sehen.

Eine Beispielausgabe wäre

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_addresshier ist die IP, die du suchst. Ich weiß nicht viel darüber, aber ich denke, sie stgibt dir Informationen über den aktuellen Status. 0Asollte bedeuten LISTEN, 01bedeutet ESTABLISHED.

Das Dekodieren eines „ local_addressoder“ rem_addressist ziemlich einfach, 8700A8C0:8F76zum Beispiel:

Format: hex(rev_ip):hex(port)

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

=> 192.168.0.135, Port 36726

Weitere Informationen zum /proc/netVerzeichnis finden Sie unterHier.

Weitere Informationen zu den dargestellten Daten finden SieHier.

Ein verwandter SO-Thread ist auchHier.

Antwort2

Wenn Sie es ausführen, strace lsof -i 2>&1 | grep openerhalten Sie einige Hinweise zur lsof -iFunktionsweise:

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

Beachten Sie, dass einige der Dateien auf meinem System nicht vorhanden sind. Einige dieser Dateien sind in dokumentiert man proc, aber ihre Ausgabe scheint nicht allzu schwer zu verstehen zu sein.

Danach lsof -iwird buchstäblich die gesamte Prozesstabelle in aufsteigender Reihenfolge durchgegangen, um nach offenen Deskriptoren zu suchen:

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

Antwort3

Alternativ können Sie, wenn Sie verwenden iptablesund ip_conntrackin Ihren Kernel kompiliert oder als Modul geladen haben, die iptablesAnsicht aller Verbindungszustände über /proc/net/ip_conntrackoder das neuere Userspace-Interface-Tool abrufenconntrack

$ 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

Hierzu gehören auch Informationen zu Verbindungen, die über Ihren Computer geleitet werden, nicht nur zu lokalen Verbindungen.

verwandte Informationen