我有一个应用程序在端口 7162 上侦听 SNMP 陷阱。陷阱到达端口 162,因此我在 iptables 中进行了以下重定向:
-A PREROUTING -p udp -m udp --dport 162 -j REDIRECT --to-ports 7162
我是否还需要明确允许使用以下方式传入到端口 162 的连接
-A INPUT -p udp -m state --state NEW -m udp --dport 162 -j ACCEPT
有时只需第一行就可以了,有时则不行,所以我想找出原因。
答案1
第一条规则就足够了 - 除非您以INPUT
某种方式限制对链中端口 7162 的访问。
事实上,你的 UDP 数据包甚至不应该通过INPUT
目标端口设置为 162 的链,至少根据下图:https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg
此外,您的INPUT
规则似乎太复杂了。UDP 是一种无状态协议,因此您要处理 netfilter 内部的某种状态。我甚至还没有找到有关这些状态与 UDP 一起使用时的含义的正确文档。
尝试使用程序监控两个端口tcpdump
以寻找线索(注意:如果你丢弃它只能看到端口 162 上的传入数据包,即使在环回上监听也不会显示重定向)。PREROUTING
链中的任何数据包,tcpdump 将不会看到它们
编辑:您没有尝试使用单台机器内的连接规则,对吗?PREROUTING
不会在仅限本地主机的连接上进行遍历。