在centos机器上,我想转储tcp连接-我想查看服务器是否尝试将请求发送到某个IP。通常,tcpdump可以解决问题-但未安装tcpdump,并且不能选择安装软件(由于公司政策)。恐怕netstat不会显示单个请求。
所以我想知道我还有其他选择。我在服务器上确实具有root用户访问权限。
在centos机器上,我想转储tcp连接-我想查看服务器是否尝试将请求发送到某个IP。通常,tcpdump可以解决问题-但未安装tcpdump,并且不能选择安装软件(由于公司政策)。恐怕netstat不会显示单个请求。
所以我想知道我还有其他选择。我在服务器上确实具有root用户访问权限。
Answers:
当然可以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)
如果IP地址返回匹配项,它将以“ GOT TARGET”退出。由于TCP必须在握手过程中发回某些内容,因此这应该捕获来自特定目标地址的任何内容。不管协议是TCP还是UDP(我也不会检查)。
不要忘记更改TARGET和INTERFACE。
socket.error: (1, 'Operation not permitted')
我真的会尝试获得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
iptables具有调试功能,也可以用于流量分析。
解决方案在下面的URL中描述。
还值得阅读以下URL,以将跟踪输出的日志设置为您选择的文件。
http://backreference.org/2010/06/11/iptables-debugging/
我不认为此解决方案等于tcpdump,但是可以使用最少的Centos安装来完成。您需要注意不要用日志填充磁盘,因为tcpdump的磁盘使用效率更高。不需要时关闭日志记录。
您可以将以下内容用作脚本中的基本模板。
# Logging
log(){
SOURCE=a.b.c.d (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
或tshark
。是的,这些都是软件,但我认为它们是更重要的实用程序。实际上,它们是可以临时安装或加载到系统上的实用程序,并且可以在不发生意外的情况下将其删除(可移动媒体是否是一个选项?... 提示)
但关键是,要解决该用例,对公司政策的一种变通的解决方法可能要花费更多的精力。
tcpdump
其他地方编译静态链接,然后将其复制到/ tmp并从那里运行吗?
凯尔(Kyle)提供了一些不错的选择。还有一种方法是使用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
这本质上是一个会计规则。它没有明确允许或拒绝流量,因此使用OUTPUT链的默认策略(默认为ACCEPT)。但是,任何匹配的数据包都会增加该规则的计数器。
您还可以选择使用以下-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 ...
日志将进入内核日志记录工具,因此它应显示在Red Hat派生类的/ var / log / messages中和Debian派生类的/var/log/kern.log中。dmesg
如图所示,它也将在的输出中可见。tcpdump
但是,与不同,它不会记录数据包的完整内容,而只会记录数据包头的内容。
由于您的服务器正在连接到某个IP,因此我想它将连接到您也知道的端口?
无论如何,netstat
还是ss
专为您想要的而设计。您可以使用以下任一命令执行相同的操作:
netstat -n -t | awk '{print $5}' | grep A.B.C.D:n
ss -n -t | awk '{print $5}' | grep A.B.C.D:n
其中,A.B.C.D
代表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 A.B.C.D:n && \
echo "CONNECTION MADE" && \
exit 0
sleep 1
done