我尝试设置 iptables,将子网 10.10.255.* 中的机器 (box1) 的端口 (161) 转发到端口 162 再转发到 box2,这应该由位于不同子网 (公共子网) 中的 box3 进行查询。这是一个示意图:
box1 box2 box3
[10.1.255.245] ---- (eth0)-(eth1) ---- [public_ip]
| |--------- 161 -----|
|-----------161---(iptables)---- 162 -----|
所以基本上我想通过端口 162 查询 box3 上的 snmp。在 box2 上我添加了以下规则:
iptables -t nat -A PREROUTING -p udp -i eth1 --dport 162 -j DNAT --to-destination 10.1.255.245:161
iptables -A FORWARD -p udp -d 10.1.255.245 --dport 161 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
遗憾的是 box3 无法查询 snmp...这些是来自 box2 的 iptables:
# Generated by iptables-save v1.4.7 on Tue Mar 14 10:41:21 2017
*filter
:INPUT ACCEPT [60:9648]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [421336:836276554]
-A INPUT -p udp -m udp --dport 161 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 372 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --sport 1024:65535 --dport 372 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m udp --dport 8649 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m tcp --dport 40000 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i eth1 -p tcp -m tcp --dport 0:1023 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i eth1 -p udp -m udp --dport 0:1023 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
-A FORWARD -d 10.1.255.245/32 -p udp -m udp --dport 161 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Tue Mar 14 10:41:21 2017
# Generated by iptables-save v1.4.7 on Tue Mar 14 10:41:21 2017
*nat
:PREROUTING ACCEPT [397:45293]
:POSTROUTING ACCEPT [8465:1184160]
:OUTPUT ACCEPT [8465:1184160]
-A PREROUTING -i eth1 -p udp -m udp --dport 162 -j DNAT --to-destination 10.1.255.245:161
-A POSTROUTING -o eth1 -j MASQUERADE
COMMIT
# Completed on Tue Mar 14 10:41:21 2017
方框 1 上的路线:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
255.255.255.255 * 255.255.255.255 UH 0 0 0 eth0
box2 box2.local 255.255.255.255 UGH 0 0 0 eth0
224.0.0.0 * 255.255.255.0 U 0 0 0 eth0
10.1.0.0 * 255.255.0.0 U 0 0 0 eth0
link-local * 255.255.0.0 U 1002 0 0 eth0
link-local * 255.255.0.0 U 1003 0 0 eth1
192.168.0.0 * 255.255.0.0 U 0 0 0 eth1
default storage1 0.0.0.0 UG 0 0 0 eth1
盒子 2 上的端口 161 的 tcpdump:
2017-03-14 11:25:00.677570 IP box3.57060 > box2.162: C=servers GetNextRequest(28) .1.3.6.1.2.1.1.1.0
盒子 2 上的端口 162 的 tcpdump:
2017-03-14 11:23:03.325818 IP box3.42352 > box1.161: C=servers GetNextRequest(28) .1.3.6.1.2.1.1.1.0
- 我尝试通过 161 从 box2 到 box1 进行 snmpwalk,成功了
- 盒子 2 上的 /proc/sys/net/ipv4/ip_forward = 1
我错过了什么?
答案1
您需要激活ip 转发在box2上,box2需要作为box1通向公网的网关。
如果问题仍然存在,请在 box2 上共享 tcpdump,您可以通过运行以下命令获取:
tcpdump -i any -s1500 'udp port 161,162' -w file_name.pcap