我试图确定应用程序与数据库的连接是应用程序内部的连接还是由于网络事件造成的。这似乎是 netfilter 在系统范围内可见的东西。为此,我想使用-j LOG
withiptables
来记录系统上发生的所有 TCP 重置和超时。但我不知道该使用什么来匹配标准。
我觉得答案conntrack
在某些时候会涉及到该模块,但我几乎找不到任何东西。数据库服务器是MS-SQL,J2EE应用程序在RHEL 5.10 VM上运行。后者是我尝试执行登录的机器。
编辑:
我发现这篇博文其中显示了如何使用--tcp-flags
选项来记录 TCP 重置(除其他外) iptables
。因此,突出的问题是弄清楚如何记录没有显式 RST 但由于连接被视为陈旧/超时而关闭的连接。
答案1
在 IRC 上询问了一下后,似乎普遍的期望是,如果一个节点感觉连接异常终止了任何原因(包括达到内部派生的超时),预计在关闭其一侧的连接之前向远程节点发送 RST 数据包。因此,这两个问题似乎都得到了相同解决方案的回答:通过 log TCP 重置--tcp-flags
。
在我的 RHEL 5.10 系统上执行此操作的基本命令(也应该适用于基于 Debian 的发行版)是:
root@xxxxxxvlt01 ~ $ iptables -A OUTPUT -m tcp -p tcp --tcp-flags RST RST -j LOG
root@xxxxxxvlt01 ~ $ iptables -A OUTPUT -m tcp -p tcp --tcp-flags FIN FIN -j LOG
如果没有匹配标准,我可能最终会匹配相当多的数据包,因此我创建了一个专门针对我要处理的系统的新规则:
root@xxxxxxvlt01 ~ $ iptables -A OUTPUT -d xxx.xxx.64.248/32 -m tcp -p tcp --tcp-flags RST RST -j LOG
root@xxxxxxvlt01 ~ $ iptables -A OUTPUT -d xxx.xxx.64.248/32 -m tcp -p tcp --tcp-flags FIN FIN -j LOG
root@xxxxxxvlt01 ~ $ iptables -nvL
Chain INPUT (policy ACCEPT 767K packets, 108M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 448K packets, 68M bytes)
pkts bytes target prot opt in out source destination
0 0 LOG tcp -- * * 0.0.0.0/0 xxx.xxx.64.248 tcp flags:0x04/0x04 LOG flags 0 level 4
0 0 LOG tcp -- * * 0.0.0.0/0 xxx.xxx.64.248 tcp flags:0x01/0x01 LOG flags 0 level 4
root@xxxxxxvlt01 ~ $
这要好得多。由于我对超时后 RST 内容的确认是由 IRC 上的某人提供的,因此我将保留此未答复/未答复,以防有人可以证明我错了。一周后,除非有人反驳我,否则我会接受我自己的回答。