Por que posso alcançar o endereço IP de uma interface diferente?

4

Eu estou pensando sobre isso, e não consigo encontrar uma explicação na internet. Eu tenho um gateway Linux que tem várias interfaces:

eth0: external ip
eth1: 172.16.1.1/24
eth2: 172.16.2.1/24
ip_forward is enabled.

IPtables é configurado para tráfego NAT de eth1 -> eth0 e eth2 -> eth0 . Mas configurado para não FORWARD tráfego entre eth1 <-> eth2 .

A minha pergunta é: Por que é possível que um computador na sub-rede 172.16.2.0/24 execute o ping 172.16.1.1 (endereço IP da interface eth1)?

nat

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>

filtro

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           
    
por Daniel A 12.01.2013 / 14:45

2 respostas

5

My question is: Why is it possible for a computer on the 172.16.2.0/24 subnet to ping 172.16.1.1 (ip address of eth1 interface)?

Porque você permitiu, e o Linux faz isso por padrão.

O Linux usa o que é chamado de modelo host fraco. Isso significa que quando receber um pacote vindo de eth2 , ele considerará o pacote como sendo para ele se o endereço de destino for um endereço IP de qualquer de suas interfaces, não apenas eth2 . Mesmo se o encaminhamento estiver desativado.

Para que o pacote entre no gancho PREROUTING, o kernel então verá que o endereço de destino é o mesmo, então continue com o gancho INPUT e aceite todo o ICMP de eth2 , então o pacote é aceito.

    
por 12.01.2013 / 17:31
2

Você pode pingar a sub-rede 172.16.2.0/24 de / para 172.16.1.1 enquanto seu firewall não inclui regras baseadas em ip e você permite all tráfego de eth1 e eth2 a eth0 (não baseada em ip, incluindo esses pacotes de redirecionamento e de retorno)

Uma boa maneira é explicitamente Descartar todos os pacotes relacionados ao IP de sub-rede local:

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

Por exemplo, onde eth2 está vinculado a seu dmz e eth1 a localnet .

com isso, você pode acessar 172.16.2.1/24 de 172.16.1.1/24 , mas não da outra maneira!

    
por 12.01.2013 / 17:19