为什么我可以访问不同接口的 IP 地址?

为什么我可以访问不同接口的 IP 地址?

我想知道这个问题,但我似乎无法在互联网上找到解释。我有一个有多个接口的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 eth2eth0(非基于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链接到您的位置DMZeth1本地网

这样,您就可以访问172.16.2.1/24 172.16.1.1/24,但不是以其他方式!

相关内容