Linux设备5080端口仅拦截Telnet数据包的iptables规则配置咨询
精准拦截5080端口上的Telnet数据包解决方案
我明白你的困扰——直接用iptables -I INPUT 1 -p tcp --dport 5080 -j DROP确实会把所有发往5080的TCP流量都拦下来,而你只想针对Telnet这种应用层协议下手。别担心,我们可以通过匹配Telnet的应用层特征来实现精准拦截,下面是具体方法:
核心思路:利用iptables的string模块识别Telnet流量
Telnet作为明文协议,在连接建立阶段会发送特定的控制字符(属于Telnet协商流程的一部分),这些字符是其他TCP应用(比如HTTP、SSH)不会发送的,我们可以基于这个特征来过滤。
具体操作步骤
确保string模块已加载
先检查系统是否加载了xt_string模块,执行以下命令:lsmod | grep xt_string如果没有输出,手动加载模块:
modprobe xt_string添加精准拦截规则
执行这条iptables规则,它会匹配发往5080端口、带有Telnet协商特征的TCP流量并丢弃:iptables -I INPUT 1 -p tcp --dport 5080 -m string --algo bm --string "\xff\xfb\x01" -j DROP对这条规则的解释:
-m string:调用string匹配模块--algo bm:使用Boyer-Moore算法进行字符串匹配,效率较高--string "\xff\xfb\x01":匹配Telnet连接时常见的协商字符(IAC WILL ECHO,即客户端请求开启回显),这是Telnet会话初期必然会出现的特征
验证规则效果
你可以用Telnet客户端尝试连接5080端口,应该会被拦截;而其他TCP应用(比如用nc发送普通数据)则能正常通过5080端口。
补充说明
- 如果上述特征字符串不适用,你还可以尝试其他Telnet协商特征,比如
"\xff\xfb\x03"(IAC WILL SUPPRESS GO AHEAD),这类控制字符都是Telnet独有的。 - 如果你需要长期保留这条规则,记得把iptables规则保存下来(不同系统命令不同,比如
iptables-save > /etc/iptables/rules.v4)。
内容的提问来源于stack exchange,提问作者aswini visvanathan
相关产品推荐
相关产品推荐

