转储没有tcpdump的tcp连接


17

在centos机器上,我想转储tcp连接-我想查看服务器是否尝试将请求发送到某个IP。通常,tcpdump可以解决问题-但未安装tcpdump,并且不能选择安装软件(由于公司政策)。恐怕netstat不会显示单个请求。

所以我想知道我还有其他选择。我在服务器上确实具有root用户访问权限。


您在服务器上具有root用户访问权限吗?
user9517 2014年

是的,我确实具有root用户访问权限。
艾萨克2014年

11
您还应该努力解决公司政策。当它阻止您执行工作时,该策略将被破坏。
迈克尔·汉普顿

1
好吧,变更控制基本上是FDA的要求-因此,我这一生都不会改变:)
Isaac 2014年

Answers:


15

当然可以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。


您将如何修改它以同时捕获tcp syn数据包?因为如果目标不可达,则不会显示尝试但失败的连接。
以撒2014年

3
这个脚本不是新软件吗(因此不要安装在系统中)?
六。

@Vi具有这种逻辑,您可以说任何shell脚本都是“新软件”。这取决于您定义“软件”的方式。
Matthew Ife 2014年

1
-1对不起,这是一个糟糕的解决方案。它不仅用机枪杀死了一只鸡(编写程序来完成已经存在的解决方案),而且它是一个无限循环-不必要地消耗CPU资源(在python进程上运行strace ...但要坚持下去) (Control-C键!),它将无法正确解决用户的问题:它将对传入和传出的TCP连接都响应“ GOT TARGET”(用户要求“尝试发送请求...”)。最后,如果成功,它将以1退出(指示外壳失败)。
Mike

1
非常酷,但是您仍然需要提升的权限。我得到了socket.error: (1, 'Operation not permitted')
Grant Bowman

17

我真的会尝试获得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

1
这就是我所希望的答案。不幸的是,也未安装strace:/
Isaac

我将尝试lsof
Isaac

1
我想原始的发帖人喜欢回复,但是奇怪的是它并没有真正回答他的问题(“ ... tcp连接-我想看看服务器是否尝试将请求发送到某个IP ...)。为您提供特定进程的网络连接信息...也许他想要吗?对于像我这样来这里寻求从一台机器到另一台机器的TCP连接信息的人来说,这可能没有用。不同的Shell命令示例,使您可以收集有关网络连接的信息
Mike S

15

iptables具有调试功能,也可以用于流量分析。

解决方案在下面的URL中描述。

iptables中的调试规则

还值得阅读以下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)

8

如果您需要特定的软件来做您的工作,而又不允许这样做,那么您要么没有做一个很好的商业案例,要么没有将您的想法卖给合适的人…… 或者您无法控制此系统。 。

如果我被要求做某事并且需要在这种情况下所需的调试/故障排除信息类型,那么我将使用正确的工具。这是可能的tcpdumptshark。是的,这些都是软件,但我认为它们是更重要的实用程序。实际上,它们是可以临时安装或加载到系统上的实用程序,并且可以在不发生意外的情况下将其删除(可移动媒体是否是一个选项?... 提示

但关键是,要解决该用例,对公司政策的一种变通的解决方法可能要花费更多的精力。


我完全同意使用正确的工具完成正确的工作。实际上,我可以安装软件,但是我们必须使用变更控制,因此该过程需要几天的时间-我现在需要转储,因此无法选择安装。我只是想知道是否忽略了一些尚未考虑的选项。
艾萨克

:(关于变更管理。有什么办法可以玩一场政治游戏,并从中受益的人/党派快速追踪变更管理过程?
ewwhite 2014年

1
恐怕不是-但是由于需要变更管理和tcpdump的客户,他将不得不接受事实。我一直希望我能让他开心。
以撒2014年

3
@ewwhite:任何良好的变更管理策略都应具有豁免特定变更或特定类别变更完成整个流程的能力。如果这一个没有....
斯科特包

2
您不能在tcpdump其他地方编译静态链接,然后将其复制到/ tmp并从那里运行吗?

5

凯尔(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但是,与不同,它不会记录数据包的完整内容,而只会记录数据包头的内容。


我本人在想iptables,但也没有安装:/。无论如何,不​​错的解决方案。
艾萨克

3

由于您的服务器正在连接到某个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

无需提升内核特权即可进行监视的好方法。
格兰特·鲍曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.