使用Linux iptables,是否可以记录启动出站连接的进程/命令名称?


27

我想跟踪在Linux桌面上启动出站连接的过程。我能想到的最好的办法是:

iptables -A OUTPUT -m state --state NEW -j LOG --log-uid

这将记录启动连接的uid / gid,但不会记录进程/命令名称甚至pid。如果我能得到pid,我可能会编写一个脚本,该脚本会在写入日志时提取进程名称,但是看来这甚至是不可能的。

理想情况下,我还要记录也接受传入连接的进程。

有什么想法在Linux机器上使用iptables [或其他工具]怎么可能?


我相信(不是完全确定)在serverfault上已经回答了这个问题,请查找它。
niXar

就个人而言,我将使用sysdig来完成这项工作。
查尔斯·达菲

Answers:


7

您可以编写一个程序来监视/ proc / net / tcp,其输出如下所示:

obi-wan ~ # cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847458 1 e6060560 300 0 0 2 -1
   1: 00000000:04D2 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847477 1 f2e64da0 300 0 0 2 -1
   2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7109 1 f2e65ac0 300 0 0 2 -1
   3: 0100007F:177A 00000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 4864457 1 d2726540 300 0 0 2 -1
   4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847462 1 e60609c0 300 0 0 2 -1
   5: 6B00A8C0:0016 30F4B5CA:C3AB 01 00000044:00000000 01:00000031 00000000     0        0 4982752 3 f2e64940 55 4 0 2 -1
   6: 0100007F:B143 0100007F:BC5E 01 00000000:00000000 00:00000000 00000000  1000        0 2130283 1 d59cce40 21 4 1 2 -1
   7: 0100007F:BC5E 0100007F:B143 01 00000000:00000000 00:00000000 00000000  1000        0 2130285 1 d59cd2a0 21 4 0 2 -1
   8: 6B00A8C0:0016 3276C35B:8E11 01 00000000:00000000 02:000ADAB1 00000000     0        0 4982629 2 d2727260 40 4 8 2 2
   9: 6B00A8C0:0016 6500A8C0:DD5D 01 00000538:00000000 01:00000029 00000000     0        0 4864416 5 e6061b40 42 12 27 3 -1

然后,您可以将打开的端口与inode关联,通过对每个进程列出的文件描述符进行readlink,可以将它们与进程和文件描述符相关联:

obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]

此处看到inode 4847458对应于上面列表中的第一个tcp套接字。netstat -tapn的输出为我验证了这一点(并记得0x50 == 80):

obi-wan ~ # netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     28850/cherokee-work

当监视程序注意到/ proc / net / tcp中的更改时,请解析数据并确定更改是否是新打开的套接字。然后,您可以枚举/ proc中列出的每个进程的所有文件描述符,对每个进程进行readlink来找到匹配的inode。一旦找到,便拥有了自己的pid,您可以从中获得所需的其他任何信息,特别是如果您具有流程记帐的话。

如果您不需要即时通知,则您的监控程序可以使用慢速轮询(可能为50ms或100ms,甚至1000ms)。


2
感谢您提供选择!但是,每次都要求轮询和查询每个打开的文件描述符并不是很可靠,而且效率很低。我仍然希望有人能找到更好的解决方案,或者阐明为什么这不再是iptables的一部分,以及为什么--cmd-owner被认为是不可修复的。
nealmcb 2012年

除非内核更改/ proc的布局,或者除非netstat和readlink或ps更改(不太可能),否则我会说这非常可靠。您关心哪种效率问题?如果要进行瞬时处理,则必须编写一个内核模块以与iptables一起使用。
本·柯林斯

如果我记录拒绝的连接,则套接字会立即被内核破坏,因此我几乎没有机会在/ proc中看到它。也许只是将REJECT更改为DROP以使连接超时...
Marki555

在这种情况下,由于时间窗口太小而无济于事,但是就解析/ proc的脆弱性而言,也可以只使用“ lsof -F -i”并获得网络的漂亮抽象转储。数据。也可以对其进行过滤(例如,仅在特定端口上),并且已经为您完成了所有文件名/ pid /用户映射。
dannysauer

9

您需要所有者匹配模块,该模块仅适用于OUTPUT链(甚至可能是PREROUTING ...?)。阅读文档,但它会像这样工作:

iptables --append OUTPUT -m owner --cmd-owner "$app" \
--jump LOG --log-level DEBUG --log-prefix "OUTPUT $app packet died: "

1
iptables log命令可以这样设置和插值变量吗?它似乎对我不起作用。同样,看起来--cmd-owner选项已在内核> = 2.6.15中删除。这是不幸的,因为它似乎是一个有用的选项。

4
是的--cmd-owner被删除:“
无法修复的

1
感谢您的信息,@ guettli。在permalink.gmane.org/上有更多详细信息,它引用了更多的变更日志:“ [NETFILTER]:删除ipt {,6} owner中的tasklist_lock滥用;删除cmd / sid / pid匹配项,因为它不可修复并损坏了。锁定对tasklist_lock的更改的方式。” 但我仍然希望有更多背景知识或更好的选择。
nealmcb 2012年

5

与iptables或日志记录无关;但是这是一个类似“ top”的界面,它轮询/ proc /目录并显示每个程序/ pid的带宽:

http://sourceforge.net/projects/nethogs

“ NetHogs是一个小的'net top'工具。它没有像大多数工具一样按协议或每个子网划分流量,而是按进程对带宽进行分组。NetHogs不依赖于加载特殊的内核模块。”


我发现nethogs给出的统计数据不可靠,但是2以上(+ netatop)的效果很好。
东武

1

当我正在寻找一个类似的问题,试图限制Skype的速度时,我发现

$ netstat -p | grep <mycmdname>

这是将端口号链接到pid / cmd的好方法,因为iptables中不再直接支持pid-owner / cmd-owner;然后,您需要解析结果,然后根据端口添加iptables规则;自然地,之后/系统关闭/重新启动时,您将需要一些清除代码;在清理时将端口号保存到文件中以供参考

实际上,对端口号问题的一个很好的答案是

$ sudo netstat -p | grep "tcp.*<mycmdname>" | sed -r "s/.*<MYCOMPUTER>:([0-9]+).*/\1/"`

您可能需要根据需要调整grep tcp元素

那么出于我的目的,最简单的方法是根据端口号添加tc u32过滤器,根据端口号添加iptables条目

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.