iptables端口转发prerouting – 如何排除本地局域网?

我在Jessie Debian中使用了几个PREROUTING规则,按照以下规则从WAN向LAN端口转发

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8088 -j DNAT --to-destination 192.168.1.6:8088 ETH0 is public static IP ETH0:0 is Local lan ip 192.168.1.2 

这些是NAT相关的IPTABLES

 iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- !192.168.0.0/24 0.0.0.0/0 tcp dpt:8088 to:192.168.1.6:8088 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8091 to:192.168.1.7:80 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8092 to:192.168.1.1:80 DNAT tcp -- !192.168.0.0/24 0.0.0.0/0 tcp dpt:10554 to:192.168.2.10:554 DNAT udp -- !192.168.0.0/24 0.0.0.0/0 udp dpt:10554 to:192.168.2.10:554 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10080 to:192.168.2.1:8081 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10443 to:192.168.2.4:10443 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10052 to:192.168.2.1:8080 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:34567 to:192.168.2.10:34567 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10050 to:192.168.2.1:10050 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 SNAT tcp -- 0.0.0.0/0 192.168.2.10 tcp dpt:554 to:192.168.1.2 SNAT udp -- 0.0.0.0/0 192.168.2.10 udp dpt:554 to:192.168.1.2 SNAT tcp -- 0.0.0.0/0 192.168.2.1 tcp dpt:8081 to:192.168.1.2 SNAT tcp -- 0.0.0.0/0 192.168.2.4 tcp dpt:10443 to:192.168.1.2 SNAT tcp -- 0.0.0.0/0 192.168.2.1 tcp dpt:8080 to:192.168.1.2 SNAT tcp -- 0.0.0.0/0 192.168.2.10 tcp dpt:34567 to:192.168.1.2 SNAT tcp -- 0.0.0.0/0 192.168.2.1 tcp dpt:10050 to:192.168.1.2 

但是,从LAN访问该端口时也适用此规则。 因此,我可以input任何IP和端口8088到浏览器的URL,它会一直到达目的地。 例如我可以inputhttp://1.1.1.1:8088 ,它会工作。 这是不希望的行为。

我想从PREROUTING排除局域网。

我试过了 ! -s 192.168.0.0/24,但在发送“!” 为源参数不起作用

我尝试了另一种方法来在规则中使用目标参数“-d mydoman.com”,但是这仅适用于从/ etc / hosts删除mydoman.com行,因为mydoman.com链接到服务器本地networkingIP。 我也想保留这个logging。

有没有更好的方法来避免本地networking的预编程规则?

如果您打算从DNAT规则中排除192.168.1.8 ,则应使用192.168.0.0/23192.168.1.0/24作为! -s ! -s参数。 networking范围192.168.0.0/24完成在192.168.0.255

 $ ipcalc 192.168.0.0/24 Address: 192.168.0.0 11000000.10101000.00000000. 00000000 Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000 Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111 => Network: 192.168.0.0/24 11000000.10101000.00000000. 00000000 HostMin: 192.168.0.1 11000000.10101000.00000000. 00000001 HostMax: 192.168.0.254 11000000.10101000.00000000. 11111110 Broadcast: 192.168.0.255 11000000.10101000.00000000. 11111111 Hosts/Net: 254 

您可以通过接口来限制DNAT规则,而不是使用地址。 例如:

 iptables -t nat -A PREROUTING '!' -i eth0 -p tcp --dport 8088 \ -j DNAT --to-destination 192.168.1.6:8088 

要么:

 iptables -t nat -A PREROUTING -i ${your_wan_interface} -p tcp --dport 8088 \ -j DNAT --to-destination 192.168.1.6:8088 

使用RETURN目标也是一个可能的select:

 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j RETURN