用iptablesdebuggingnetstat“失败的连接尝试”

http://farm4.static.flickr.com/3305/4588110530_a60c934289_o.png

这张图是munin收集netstat -s输出。

我想确定连接来自哪里。 wireshark转储没有什么明显的。

我已经用iptables做了很多事情,这已经有一段时间了。 我怎么去logging这些?

谢谢

-s

确定连接来自哪里….这里是一个loggingSSHstream量的例子。 格式在你的内核日志中看起来像这样

 MONTH DAY TIME SERVERNAME kernel: [IPTABLES] : IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=REMOTEIP DST=SERVERIP LEN=00 TOS=0x00 PREC=0x00 TTL=# ID=# DF PROTO=TCP SPT=# DPT=22 WINDOW=# RES=0x00 SYN URGP=0 OPT (#) 

这里我们创build一个名为MyLOG的新链

 # iptables -N MyLOG 

以防万一,以防万一

 # iptables -F MyLOG 

在tcp端口上创build日志loggingfunction22将日志设置为alert,并在日志行的开始部分容易看到“[IPTABLES]”string。

 # iptables -A MyLOG -i eth0 -p tcp --dport 22 -j LOG --log-level alert --log-tcp-options --log-ip-options --log-prefix '[IPTABLES] : ' 

将MyLOG链连接到input链

 # iptables -A INPUT -i eth0 -j MyLOG 

这应该发送日志到你的内核日志(虽然一些linux的风格可能会改变结果)。 你可以通过拖拽内核日志来testing日志logging。

 # tail -f /var/log/kern.log 

如果你在控制台,并注意到屏幕上飞溅的大量数据,你可以尝试设置控制台日志输出

 dmesg -n 1 

如果你想获得“统计”,你可以运行

 # iptables -nvxL 

输出将显示从创build链时发送的数据包和字节的数量。

 Chain MyLOG (1 references) pkts bytes target prot opt in out source destination 61 4416 LOG tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 

我在这里有一个脚本http://www.hilands.com/code-shell-fw.html ,我用它来logging某些端口活动,并收集serverstats serverstats(可从berlios下载)的数据,设置NAT'ing,端口 -转发,尝试中断端口扫描,并使用tcp-reject而不是drop。

Serverstats可能很难弄清楚。 它是一组使用RRDTool的PHP脚本。 它使用一个shell脚本触发iptables输出。 我的乱码声明告诉我你需要修改configuration数组,使其运行

 'ssh-traffic' => array( 'used' => true, 'chains' => array('MyLOG'), 'graphs' => array( 'combined_bps' => array('used' => true, 'title' => 'Combined (bps)'), 'single_bps' => array('used' => true, 'title' => '%s (bps)'), 'combined_count' => array('used' => true, 'title' => 'Combined (count)'), 'single_count' => array('used' => true, 'title' => '%s (count)') ) ), 

谢谢你们的答复。

我的目标是理解为什么图中的尖峰是正常的和周期性的,然后使它们停止。 这些进来缓慢滴(一次5个左右)。 我知道tcp连接由于某种原因失败了,但是由于它们的规律性,显然有一些事情正在进行。 我怀疑某个地方有一个cron作业,一个负载平衡器configuration错误,或者一个监视设备作为罪魁祸首。

我已经决定采取UTSL的方法,这里是我到目前为止:

netstat -s从/ proc / net / snmp获取统计信息。

大。 因此,每次发生连接尝试失败时,内核都会更新SNMP计数器。

什么样的id要完成,是每次有一个失败的连接,不仅要更新此计数器,而且还logging“从IP $ foo at $ timestamp失败的连接尝试”

那么……什么资格作为失败的连接尝试?

下载内核源码 greps的 结论是,我正在寻找的计数器是TCP_MIB_ATTEMPTFAILS

通过2.6.18源代码树,我发现两个地方,这是引用:

./net/ipv4/tcp_minisocks.c:

 453 struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb, 454 struct request_sock *req, 455 struct request_sock **prev) 456 { 592 if (flg & (TCP_FLAG_RST|TCP_FLAG_SYN)) { 593 TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); 594 goto embryonic_reset; 595 } 640 } 

…和include / net / tcp.h

 915 static inline void tcp_done(struct sock *sk) 916 { 917 if(sk->sk_state == TCP_SYN_SENT || sk->sk_state == TCP_SYN_RECV) 918 TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); 919 920 tcp_set_state(sk, TCP_CLOSE); 921 tcp_clear_xmit_timers(sk); 922 923 sk->sk_shutdown = SHUTDOWN_MASK; 924 925 if (!sock_flag(sk, SOCK_DEAD)) 926 sk->sk_state_change(sk); 927 else 928 inet_csk_destroy_sock(sk); 929 } 

我有点惊讶,这些是产生计数器更新的唯一两个条件,但无论如何。

第一块看起来很明显。 “如果您看到一个同时设置了RST和SYN标记的TCP数据包,请更新TCP_MIB_ATTEMPTFAILS计数器并重置连接”。

为了抓住这些,我放入了下面的iptables规则

 iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j LOG iptables -A OUTPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j LOG 

等待 ……没事。 =(

第二个模块有点神秘,但我猜测并假设这意味着“如果套接字处于特定状态,则更新TCP_MIB_ATTEMPTFAILS计数器”

这,我不知道如何testing这个。

我现在的问题是:1)我是否以某种方式误解了这张图? 2)我在正确的轨道上? 3)没有编写一个内核模块(我没有足够的熟练程度),我怎样才能完成我的日志目标?

谢谢

-s

我不确定iptables是你想要的,有可能是一个工具保持活动,并轮询相同的系统调用netstat使用,或者你可以写一个。

iptables响应数据包,以处理它们。 你所看到的基本上是所有活动套接字的分配表。

现在,根据这些实际是什么,你可能会捕获这些连接上的数据包。

如果你有很多sockets的状态不是很好,很长一段时间,不断增长的越来越高,我更关心netstat -anp,iirc的输出,它告诉你程序。 也许有人在泄漏sockets。

这是我的高度推定。 如何详细说明你想看到那个图中的变化。

我评论自己,但没有出现,所以我只是编辑 – 另一篇文章绝对是一个明确的指示,如何使用iptableslogging,你应该能够看到wireshark的stream量。 这听起来像你问的是套接字,而不是数据包。 难以追踪的套接字通常不会获取/发送数据包,有时也会导致资源浪费。