tcpkill:只有在建立连接后才能建立连接

tcpkill:只有在建立连接后才能建立连接

问题描述:

为了测试目的,我需要将Post请求发送到启用Google Developer Tools的Postman的Google Cloud HTTP负载均衡器(跟踪网络活动)。tcpkill:只有在建立连接后才能建立连接

每个请求都应该使用不同的连接。

所以,我想用tcpkill工具:

$ tcpkill -9 "dst XXX.XXX.XXX.XXX and dst port 443"

但是,最终,这将导致关闭每个连接将被建立之前。所以,邮差得到连接错误。

所以,问题是:如何才能完成连接,只有它是ESTABLISHED和POST请求被发送到服务器?

在此先感谢,同志们。

+0

为什么你想杀死连接?如果你真的想这样做,那么你可以先使用netstat,lsof,ss等检查ESTABLISHED或其他一些状态的连接,然后只杀掉那些连接。 –

+0

@LucianoAfranllie事情是,我只是想让tcpkill在终端中保持运行,以便立即终止连接,但是如果我在tcpkill启动后发出请求,连接将根本无法到达服务器。 –

你不能用tcpkill做到这一点,因为这个程序需要通信来终止连接,并且不支持使用连接状态的过滤器。所以,如果你在连接建立之前运行tcpkill,它们将在连接之前被杀死;如果你在建立连接后运行tcpkill,如果没有流量,它们将不会被终止,因为tcpkill需要一个有效的序列号来发送RST。

你可以尝试killcx与SS或netstat的滤波建立的连接,这样的事情:

#!/bin/bash 

dst=$1 
port=$2 

peer_addrs=$(ss -t state established dst ${dst} dport = :${port} | 
tail -n +2 | awk '{print $4}' | cut -d : -f 1) 
for addr in ${peer_addrs}; do 
    echo "killing ${addr}:${port}" 
    killcx ${addr}:${port}" & 
    sleep 2 
    killall -9 killcx 
done 

您需要在循环中使用手表或类似的定期运行该脚本,当然,此次荣获” t在连接建立之后立即终止连接,但在周期发现连接后稍晚一点。

+0

tcpkill支持tcpdump这样的TCP标志:tcpkill tcp tcpflags&tcp-syn tcp-ack!= 0“'。也许,我可以使用这样的方式来防止连接被破坏,而这些连接只会被建立。另外,tcpkill会对已建立的连接执行所谓的“kill”,因为它将RST标志发送给它(AFAIK)。 –

+0

使用tcpdump表达式可以做的最好的方法就是观察SYN/ACK数据包,而不是实际建立连接的最后一个ACK,因为它与任何其他ACK没有区别。关于你的最后一条评论,tcpkill只能在该连接上看到一些流量后才能终止已建立的连接,它需要流量才能获得RST的有效序列号。 –

+0

我想,我会写一个expect的脚本,它会在具有ESTABLISHED状态的netstat命令输出中循环等待一个字符串,并且会通过src端口终止该连接。 LGTM。 –