![启用 IPTables 后无法建立出站 SNMP 连接](https://linux22.com/image/551082/%E5%90%AF%E7%94%A8%20IPTables%20%E5%90%8E%E6%97%A0%E6%B3%95%E5%BB%BA%E7%AB%8B%E5%87%BA%E7%AB%99%20SNMP%20%E8%BF%9E%E6%8E%A5.png)
我有一组配置了 Windows SNMP 代理的 Windows 服务器。每台服务器都有四个 IP 地址,SNMP 会监听所有 IP 地址。
我的监控服务器(Centos 5.5 32 位,net-snmp 5.3.2.2)有些奇怪。如果我关闭了iptables
它,那么在这些服务器中的任何 IP 地址上执行 snmp 查询都没有问题。
如果我打开 IPtables,那么我只能查询每个服务器上似乎只有一个特定的 IP 地址。只是snmpget
超时了Timeout: No Response from x.x.x.x
。
关于我被允许连接哪些 IP 地址,这种行为没有任何模式。但每台机器只有一个 IP 地址。
这是我的 iptables 配置:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -s 172.16.3.0/24 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -i lo -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s 172.16.3.0/24 -m state --state NEW -m tcp -p tcp --dport 5668 -j ACCEPT
-A RH-Firewall-1-INPUT -i lo -m state --state NEW -m tcp -p tcp --dport 5668 -j ACCEPT
-A RH-Firewall-1-INPUT -s 172.16.3.0/24 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -i lo -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -s 172.16.3.0/24 -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -i lo -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -s 172.16.3.0/24 -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -i lo -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
我可以毫无困难地连接到任何其他服务器,例如用于wget
抓取 RPM。
我确实尝试将其添加为最后的手段,但也没有成功:
-A OUTPUT -p udp -s 0/0 --sport 1024:65535 -d 0/0 --dport 161:162 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p udp -s 0/0 --sport 161:162 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
这是的输出iptables -L
:
链输入(策略接受) 目标 保护 优化 源 目标 RH-Firewall-1-INPUT 全部 -- 任何地方 任何地方 接受 udp -- 任何地方 udp spts:snmp:snmptrap dpts:1024:65535 状态已建立 链转发(策略接受) 目标 保护 优化 源 目标 RH-Firewall-1-INPUT 全部 -- 任何地方 任何地方 链输出(策略接受) 目标 保护 优化 源 目标 接受 udp -- 任何地方 udp spts:1024:65535 dpts:snmp:snmptrap 状态 NEW,ESTABLISHED 链 RH-Firewall-1-INPUT(2 个引用) 目标 保护 优化 源 目标 接受所有 -- 任何地方 任何地方 接受 icmp -- 任何地方 任何地方 icmp 任何 接受 udp -- 任何地方 224.0.0.251 udp dpt:mdns 接受所有 -- 任何地方任何地方状态 RELATED,ESTABLISHED 接受 tcp -- 172.16.3.0/24 任意位置状态新 tcp dpt:ssh 接受 tcp -- 任何地方任何地方状态新 tcp dpt:ssh 接受 tcp -- 172.16.3.0/24 任意位置状态新 tcp dpt:5668 接受 udp -- 172.16.3.0/24 任意位置状态新 udp dpt:5668 接受 tcp -- 任何地方任何地方状态新 tcp dpt:5668 接受 udp -- 任何地方任何地方状态新 udp dpt:5668 接受 tcp -- 172.16.3.0/24 任意位置状态新 tcp dpt:http 接受 tcp -- 任何地方任何地方状态新 tcp dpt:http 接受 tcp -- 172.16.3.0/24 任意位置状态新 tcp dpt:https 接受 tcp -- 任何地方任何地方状态新 tcp dpt:https 接受 tcp -- 172.16.3.0/24 任意位置状态新 tcp dpt:mysql 接受 tcp -- 任何地方任何地方状态新 tcp dpt:mysql 拒绝所有 - 任何地方任何地方拒绝 - 使用 icmp-host-prohibited
答案1
你必须把
ACCEPT udp -- anywhere anywhere udp spts:snmp:snmptrap dpts:1024:65535 state ESTABLISHED
之前RH-Firewall-1-INPUT
因为规则的原因,在行尾RH-Firewall-1-INPUT
有一行,所以从上到下读取。REJECT
iptables
Chain INPUT (policy ACCEPT)
target prot opt source destination
1 RH-Firewall-1-INPUT all -- anywhere anywhere
2 ACCEPT udp -- anywhere anywhere udp spts:snmp:snmptrap dpts:1024:65535 state ESTABLISHED
如果您想使用命令行添加,您可以使用:
iptables -I OUTPUT 1 -p udp -s 0/0 --sport 1024:65535 -d 0/0 --dport 161:162 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I INPUT 1 -p udp -s 0/0 --sport 161:162 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
它应该是这样的:
Chain INPUT (policy ACCEPT)
target prot opt source destination
1 ACCEPT udp -- anywhere anywhere udp spts:snmp:snmptrap dpts:1024:65535 state ESTABLISHED
2 RH-Firewall-1-INPUT all -- anywhere anywhere