linux接口获取连接的IP

linux接口获取连接的IP

Linux 中是否有一个接口可以获取当前连接的 IP 及其状态?我知道ssnetstat,但我想使用/proc/或其他一些已经拥有它们的“官方”内核接口(如果存在)。如果它不存在,我从哪里开始获取此信息?基本上,我需要一个包含此信息的界面,以便我可以以编程方式检索它。

答案1

此外ssnetstat我目前不知道我会推荐任何其他工具。

有关如何获取此信息:

如果您这样做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应该是LISTEN01意味着ESTABLISHED

解码local_addressorrem_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

这还包括通过您的计算机路由的连接的信息,而不仅仅是本地连接。

相关内容