转储TCP连接没有tcpdump

在一个centos盒子上,我喜欢转储TCP连接 – 我想看看是否有服务器试图发送请求到某个IP。 通常tcpdump会做的 – 但tcpdump没有安装,安装软件不是一个选项(由于公司的政策)。 恐怕netstat不会显示我一个请求。

所以我想知道我有什么其他的select。 我在服务器上有root权限。

当然你有python

 from socket import * from struct import unpack import sys INTERFACE = "eth0" TARGET = "8.8.8.8" if __name__ == "__main__": sock = socket(AF_PACKET, SOCK_DGRAM, 0x0800) sock.bind((INTERFACE, 0x0800)) while True: data = sock.recvfrom(1500, 0)[0] ip = inet_ntop(AF_INET, data[12:16]) if ip == TARGET: print "GOT TARGET" sys.exit(1) 

这将退出与“GOT TARGET”提供IP地址回来匹配。 由于TCP在握手过程中必须返回一些东西,所以它应该捕获特定目标地址的任何内容。 它不关心协议是TCP还是UDP(我也不检查)。

不要忘记改变目标和接口。

Iptables具有debuggingfunction,也可用于stream量分析。

该解决scheme在下面的URL中描述。

在Iptables中debugging规则

还需要阅读以下URL以设置将跟踪输出logging到您select的文件。

http://backreference.org/2010/06/11/iptables-debugging/

我不认为这个解决scheme等于tcpdump,但可以使用最小安装的Centos来完成。 您需要小心,不要用日志填充磁盘,因为tcpdump在磁盘使用上效率更高。 不需要时closures日志logging。

您可以在脚本中使用以下内容作为基本模板。

 # Logging log(){ SOURCE=abcd (IP address) $IPT -A INPUT -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "In: " $IPT -A OUTPUT -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Out: " $IPT -A FORWARD -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Fw: " $IPT -t nat -A POSTROUTING -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Nat: " } #log (remove comment to enable) trace(){ iptables -t raw -A PREROUTING -p tcp -j TRACE iptables -t raw -A OUTPUT -p tcp -j TRACE } #trace (remove comment to enable) 

我真的试图得到tcpdump。 这就是说,有些替代方法可以查看IP是否存在某种连接:

strace的:

 [kbrandt@ny-kbrandt01: ~] strace -e trace=network nc 1.2.3.4 1234 ... socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress) 

lsof的:

 [kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 & [1] 11434 [kbrandt@ny-kbrandt01: ~] lsof -p 11434 .... nc 11434 kbrandt 3u IPv4 4543149 0t0 TCP 10.7.0.78:58886->1.2.3.4:search-agent (SYN_SENT) 

netstat的:

 [kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 & [1] 11486 [kbrandt@ny-kbrandt01: ~] sudo netstat -a -p | grep 11486 tcp 0 1 10.7.0.78:58891 1.2.3.4:search-agent SYN_SENT 11486/nc 

如果你需要特定的软件来做你的工作,而且不被允许,你要么没有做出一个好的商业案例,要么把你的想法卖给合适的人, 否则你不能控制这个系统。 。

如果我的任务是做一些事情,并且需要在这种情况下需要的debugging/故障排除信息的types,我会使用正确的工具。 这可能是tcpdumptshark 。 是的,这些都是软件,但我认为他们更重要的实用程序 。 事实上,它们是可以临时安装或加载到系统上的工具,并且不会发生事故(可移动介质是一个选项? 提示

但重要的是,对于公司政策来说,一个非常艰难的解决scheme可能比获得这个用例的批准需要更多的努力。

凯尔提供了一些很好的select。 还有一个是使用iptables

 [james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 ... [james@server ~]$ sudo iptables -L OUTPUT -n -v Chain OUTPUT (policy ACCEPT 105 packets, 35602 bytes) pkts bytes target prot opt in out source destination 87 33484 LOG all -- * * 0.0.0.0/0 1.2.3.4 LOG flags 0 level 4 

这基本上是一个会计规则。 它不明确允许或拒绝stream量,因此使用OUTPUT链的默认策略(默认为ACCEPT)。 但是,任何匹配的数据包都会增加规则的计数器。

您可以select性地logging有关数据包的详细信息以及-j LOG选项:

 [james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG ... [james@server ~]@ dmesg | grep 1.2.3.4 | tail -1 IN= OUT=eth0 SRC=192.168.1.1 DST=1.2.3.4 LEN=100 TOS=0x10 PREC=0x00 TTL=64 ... 

日志将转到内核日志logging工具,所以它应该显示在Red Hat衍生产品上的/ var / log / messages和Debian派生产品上的/var/log/kern.log中。 如图所示,它也可以在dmesg的输出中看到。 但是,与tcpdump不同的是,它不会logging数据包的完整内容,而只logging数据包头的内容。

由于你的服务器连接到一个特定的IP,我认为这将是一个你也知道的端口?

在任何情况下, netstatss都是为了做你想做的事情而devise的。 你可以用这两个命令来做同样的事情:

 netstat -n -t | awk '{print $5}' | grep ABCD:n ss -n -t | awk '{print $5}' | grep ABCD:n 

其中ABCD表示IPv4地址, n表示服务器在远程端连接的端口号。 例如:

 ss -n -t | awk '{print $5}' | grep 10.137.54.22:3389 

或者,如果你只是想知道连接是由:

 ss -n -t | awk '{print $5}' | grep -q 10.137.54.22:3389 && echo "CONNECTION MADE" 

如果您不知道您尝试连接的端口号,那么作业会更困难,因为TCP会在数据和ACK数据包的对话两端打开一个端口。 在这种情况下,你可以简单地grep的IP地址,以显示任何连接已经作出,无论是或来自。

最后,您可以循环使用这些内容作为您的监控工具:

 while true; do ss -n -t | awk '{print $5}' | grep -q ABCD:n && \ echo "CONNECTION MADE" && \ exit 0 sleep 1 done