다른 인터페이스에서 IP 주소에 액세스할 수 있는 이유는 무엇입니까?

다른 인터페이스에서 IP 주소에 액세스할 수 있는 이유는 무엇입니까?

이 문제에 대해 궁금하지만 인터넷에서 설명을 찾을 수 없는 것 같습니다. 여러 인터페이스를 갖춘 Linux 게이트웨이가 있습니다.

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

eth1 -> eth0IPtables는 에서 들어오고 나가는 NAT 트래픽 에 대해 구성됩니다 eth2 -> eth0. 그러나 그들 사이에 트래픽을 전달하지 않도록 구성되었습니다 eth1 <-> eth2.

내 질문은: 왜 172.16.2.0/24 서브넷의 컴퓨터가 172.16.1.1(eth1 인터페이스의 IP 주소)을 ping할 수 있습니까?

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 서브넷의 컴퓨터가 172.16.1.1(eth1 인터페이스의 IP 주소)을 ping할 수 있습니까?

Linux에서는 허용하기 때문에 기본적으로 이 작업을 수행합니다.

Linux는 소위 약한 호스트 모델을 사용합니다. 즉, 에서 패킷을 수신할 때 eth2대상 주소가 IP 주소이면 해당 패킷이 자신을 위한 것으로 간주한다는 의미입니다.어느. eth2​전달이 비활성화된 경우에도 마찬가지입니다.

이런 식으로 패킷은 PREROUTING 후크로 들어가고 커널은 대상 주소가 자신의 주소임을 확인하고 INPUT 후크로 진행하며 모든 ICMP를 수락하므로 eth2패킷이 수락됩니다.

답변2

당신은 할 수핑 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, 그렇지 않으면 그렇지 않습니다!

관련 정보