http://farm4.static.flickr.com/3305/4588110530_a60c934289_o.png
我想确定连接来自哪里。 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量。 这听起来像你问的是套接字,而不是数据包。 难以追踪的套接字通常不会获取/发送数据包,有时也会导致资源浪费。