iptables 转发端口和转换

iptables 转发端口和转换

我尝试设置 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

相关内容