防止netcat中的TCP SYN重试(用于端口敲门)

4
我正在尝试编写一个针对简单端口敲击设置的Linux客户端脚本。我的服务器已经配置了iptables,要求在打开访问之前需要一定序列的TCP SYN连接到某些特定的端口。我能够成功地使用telnet或手动调用netcat(运行命令后立即按Ctrl-C)进行敲门,但无法构建自动化的敲门脚本。
我的自动化端口敲门脚本尝试只使用"nc -w 1 x.x.x.x 1234"命令,它会连接到x.x.x.x的1234端口,并在一秒后超时。然而,问题似乎是内核(?)执行自动SYN重试。大多数情况下,在nc尝试连接时,一秒钟内发送了多个SYN,这一点我使用tcpdump进行了检查。
因此,有没有人知道如何防止SYN重试并使netcat每次连接/敲门尝试仅发送一个SYN?也欢迎提供其他可以完成此任务的解决方案。
5个回答

3

是的,我确认你也可以使用nc命令!

$ nc -z example.net 1000 2000 3000; ssh example.net

这个魔法来自于(-z: 零I/O模式)...


2

你可以使用nmap进行端口敲门(SYN)。只需执行:

for p in 1000 2000 3000; do 
  nmap -Pn --max-retries 0 -p $p example.net;     
done

0

尝试以下操作(以 root 用户身份):

echo 1 >  /proc/sys/net/ipv4/tcp_syn_retries

或者这样:

int sc = 1;
setsockopt(sock, IPPROTO_TCP, TCP_SYNCNT, &sc, sizeof(sc));

0
虽然David Villa的回答已经很好了,但我有一点小更新要提供。
我的netcat(OpenBSD,版本5.10)需要我添加“-w 1”标志来指定超时时间。如果没有这个标志,默认情况下根本没有超时,所以我们只会不断地敲击第一个指定的端口。
这可能是由于我的特定防火墙设置(UFW,拒绝所有)没有发送FIN数据包之类的原因,所以其他人可能需要或者不需要进行这个更改。
(另外,我知道我对这个讨论非常晚了,但既然它在谷歌上是一个突出的结果,希望这个回答仍然有帮助!)

-1

你无法阻止TCP/IP协议栈执行其明确设计的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接