iptables 端口转发预路由-如何排除本地 LAN?

iptables 端口转发预路由-如何排除本地 LAN?

我在 Jessie Debian 中使用了几条 PREROUTING 规则,按照以下规则将 WAN 端口转发到 LAN ip

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 访问该端口时也适用此规则。因此,我可以将任何 IP 和端口 8088 输入浏览器 URL,它始终会到达目的地。例如,我可以输入http://1.1.1.1:8088它会起作用。这不是所需的行为。

我想将 LAN 从 PREROUTING 中排除。

我试过 !-s 192.168.0.0/24 但在预路由中源参数“!”不起作用

我还尝试了另一种方法,即在规则中使用目标参数“-d mydoman.com”,但这只有在我从 /etc/hosts 中删除 mydoman.com 行时才有效,因为 mydoman.com 链接到服务器本地网络 IP。我也想保留该记录。

有没有更好的方法来避免本地网络的预路由规则?

答案1

如果您要从192.168.1.8DNAT 规则中排除,则应使用192.168.0.0/23192.168.1.0/24作为! -s参数。网络范围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 目标也是一个可能的选择:

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

相关内容