iptables规则疑问:为何特定IP无法访问TCP 80/443端口,但所有IP仍可访问UDP 10000端口
iptables规则疑问:为何特定IP无法访问TCP 80/443端口,但所有IP仍可访问UDP 10000端口
咱们来一步步拆解你的iptables规则,搞清楚这两个问题的原因:
一、为什么1.1.1.1无法访问TCP 80/443端口?
这完全是你配置的规则在起作用,逻辑很清晰:
- 你创建了一个名为
f2b的自定义链 - 紧接着给INPUT链加了规则:所有访问TCP 80、443端口的入站流量,都会被跳转到
f2b链处理 - 在
f2b链的第一条规则里,明确指定了来源IP为1.1.1.1的流量直接被REJECT,还会返回icmp-port-unreachable的提示 - 所以只要是1.1.1.1发起的80/443请求,都会被这条规则精准拦截,这完全符合你配置的预期哦
二、为什么所有人都能访问UDP 10000端口?
问题出在那条DROP规则的匹配条件上:
- 你的DROP规则是:
-A INPUT -d (my public facing ip)/32 -p udp -m udp --dport 10000 -j DROP,它的作用是丢弃所有目的地址为你的公网IP、目标端口是UDP 10000的入站流量 - 但这条规则没生效,大概率是因为你的机器处于NAT(网络地址转换)环境下——比如你的机器在路由器/防火墙后面,公网IP其实是路由器的IP,而你的机器用的是内网IP(比如192.168.x.x这类)
- 当外部用户访问你的公网IP的UDP 10000端口时,路由器会把数据包的目的地址转换成你的内网IP,再转发到你的机器
- 这时候到达你机器的数据包,目的地址是内网IP而非公网IP,所以这条
-d (my public facing ip)的规则根本匹配不到这些流量 - 又因为你的INPUT链默认策略是
ACCEPT,所以这些流量就直接被允许通过了,所有人都能访问到10000端口
解决建议
如果你想阻止所有人访问UDP 10000端口,把规则里的-d (my public facing ip)/32去掉即可,修改后的规则如下:
-A INPUT -p udp -m udp --dport 10000 -j DROP
这样不管数据包的目的地址是内网还是公网IP,只要是访问UDP 10000的入站流量都会被丢弃。如果确实需要仅针对公网IP的流量,那得确保你的机器直接使用该公网IP(没有经过NAT转发),否则这条规则就无法生效。
备注:内容来源于stack exchange,提问作者user9503
相关产品推荐
相关产品推荐

