我想知道这个问题,但我似乎无法在互联网上找到解释。我有一个有多个接口的linux网关:
eth0: external ip
eth1: 172.16.1.1/24
eth2: 172.16.2.1/24
ip_forward is enabled.
IPtables 配置为来自eth1 -> eth0
和 的NAT 流量eth2 -> eth0
。但配置为不转发之间的流量eth1 <-> eth2
。
我的问题是:为什么172.16.2.0/24子网中的计算机可以ping通172.16.1.1(eth1接口的ip地址)?
纳特
Chain PREROUTING (policy ACCEPT 647K packets, 52M bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 17582 packets, 1160K bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 14951 packets, 1214K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 187 packets, 42984 bytes)
pkts bytes target prot opt in out source destination
333K 25M SNAT all -- * eth0 0.0.0.0/0 0.0.0.0/0 to:<external ip>
筛选
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- eth2 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- eth0 * <some trusted ip> 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT udp -- eth1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT udp -- eth2 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT icmp -- eth1 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT icmp -- eth2 * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ULOG all -- eth1 eth0 0.0.0.0/0 0.0.0.0/0 state NEW ULOG copy_range 0 nlgroup 1 prefix "NEW: " queue_threshold 1
0 0 ULOG all -- eth2 eth0 0.0.0.0/0 0.0.0.0/0 state NEW ULOG copy_range 0 nlgroup 1 prefix "NEW: " queue_threshold 1
0 0 ACCEPT all -- eth1 eth0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- eth2 eth0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- eth0 eth1 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT all -- eth0 eth2 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
答案1
我的问题是:为什么172.16.2.0/24子网中的计算机可以ping通172.16.1.1(eth1接口的ip地址)?
因为你允许它,Linux 默认会这样做。
Linux 使用所谓的弱主机模型。这意味着当它收到来自 的数据包时eth2
,如果目标地址是 IP 地址,它将认为该数据包是给他的。任何它的接口,而不仅仅是eth2
的。即使转发被禁用。
这样数据包就会进入 PREROUTING 钩子,然后内核会看到目标地址是它的,因此继续执行 INPUT 钩子,并且您接受来自 的所有 ICMP eth2
,因此数据包被接受。
答案2
您可以ping 172.16.2.0/24 子网从到172.16.1.1虽然您的防火墙不包含基于 ip 的规则并且您允许全部来自双方的流量eth1
和 eth2
到eth0
(非基于IP,包括此类重定向和返回数据包)
一个好的方法是明确降低所有与本地子网ip相关的数据包:
iptables -I FORWARD -i eth0 -d 192.168.0.0/16 -j DROP
iptables -I FORWARD -i eth0 -d 172.16.0.0/12 -j DROP
iptables -I FORWARD -i eth0 -d 10.0.0.0/8 -j DROP
iptables -A FORWARD -i eth1 -s 172.16.1.1/24 -o eth0 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.1/24 -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2 -s 172.16.2.1/24 -o eth0 -j ACCEPT
iptables -A FORWARD -o eth2 -d 172.16.2.1/24 -i eth0 -j ACCEPT
例如,eth2
链接到您的位置DMZ并eth1
本地网。
这样,您就可以访问172.16.2.1/24
从 172.16.1.1/24
,但不是以其他方式!