iptables, 서브넷 규칙은 IP 규칙보다 우선합니다.

iptables, 서브넷 규칙은 IP 규칙보다 우선합니다.

대상이 있는 서브넷의 모든 패킷을 원 DROP하지만 특정 대상( )에 대한 액세스만 허용하고 싶습니다 .192.168.112.0/24192.168.112.0/24192.168.112.253

저는 다음 규칙을 사용하고 있습니다. 첫 번째( DROP) 규칙은 예상대로 작동하여 모든 패킷을 삭제하지만 두 번째( ACCEPT) 규칙은 특정 대상에 대한 패킷이 통과하는 것을 허용하지 않습니다.

iptables -I FORWARD -s 192.168.112.0/24 -d 192.168.112.0/24 -j DROP
iptables -I FORWARD -s 192.168.112.0/24 -d 192.168.112.253 -j ACCEPT

여기에 이미지 설명을 입력하세요.

ACCEPT첫 번째 규칙( )이 무시되는 이유가 있나요 ?

답변1

문제를 재현할 수 없습니다.

여기 주인이 있어요 172.17.0.2/16. 처음에는 192.168.1.0/24네트워크의 모든 호스트에 도달할 수 있습니다.

/ # ping -c1 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: seq=0 ttl=63 time=0.350 ms

--- 192.168.1.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.350/0.350/0.350 ms
/ # ping -c1 192.168.1.6
PING 192.168.1.6 (192.168.1.6): 56 data bytes
64 bytes from 192.168.1.6: seq=0 ttl=63 time=6.690 ms

--- 192.168.1.6 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 6.690/6.690/6.690 ms

중간 라우터에 다음 규칙을 추가하는 경우:

iptables -I FORWARD -s 172.17.0.0/16 -d 192.168.1.0/24 -j DROP

192.168.1.0/24그러면 이 호스트는 더 이상 네트워크의 어떤 호스트 에도 연결할 수 없습니다 .

/ # ping -c1 192.118.1.1
PING 192.118.1.1 (192.118.1.1): 51 data bytes

--- 192.118.1.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

하지만 적절한 규칙을 추가하면 다음과 같습니다 ACCEPT.

iptables -I FORWARD -s 172.17.0.0/16 -d 192.168.1.1 -j ACCEPT

그런 다음 다음과의 연결을 복원했습니다 192.168.1.1.

/ # ping -c1 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: seq=0 ttl=63 time=0.484 ms

--- 192.168.1.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.484/0.484/0.484 ms

네트워크의 다른 호스트에 대한 연결이 192.168.1.0/24계속 차단되는 경우:

/ # ping -c1 192.168.1.6
PING 192.168.1.6 (192.168.1.6): 56 data bytes

--- 192.168.1.6 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

이 두 가지 규칙을 추가하면 FORWARD체인은 다음과 같습니다.

# iptables -S FORWARD
-P FORWARD ACCEPT
-A FORWARD -s 172.17.0.0/16 -d 192.168.1.1/32 -j ACCEPT
-A FORWARD -s 172.17.0.0/16 -d 192.168.1.0/24 -j DROP

답변2

ACCEPT당신이 놓친 가장 중요한 점은 다음에서 응답을 허용하는 규칙도 필요하다는 것입니다 .192.168.112.253192.168.112.0/24

-I FORWARD -s 192.168.112.253 -d 192.168.112.0/24 -j ACCEPT

이 두 규칙은 포함된 규칙 앞(즉 뒤) ACCEPT에 배치되어야 합니다. 즉, "허용 목록"에 추가하려는 트래픽이 해당 규칙에 의해 처리됩니다. 따라서 먼저 일치하면 규칙이 적용되지 않습니다.-IDROP192.168.112.0/24192.168.112.253ACCEPT

그러나 두 규칙 자체의 순서는 ACCEPT서로 "겹치지" 않으므로 중요하지 않습니다.

그런데 여기서 취하는 접근 방식에는 두 가지 주의 사항이 있습니다. 첫째, 보시다시피 ACCEPT각 트래픽 "쌍"에는 두 개의 ( ) 규칙이 필요합니다. 둘째 , 192.168.112.253.192.168.112.0/24

일반적으로 모든 응답 트래픽을 허용하는 다음과 같은 "상태 저장" 규칙이 있습니다.

-I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

(정확히 말하면 ESTABLISHED연결을 시작하는 첫 번째 트래픽을 제외하고 양방향 트래픽은 다음과 같은 상태를 갖습니다. RELATED포트 번호 쌍이 교환될 뿐만 아니라 원래 트래픽과 다른 식별된 특정 응답 트래픽에 사용됩니다. 의미 ," 또는"이 포함되어 있으면 트래픽이 동시에 두 상태에 있지 않더라도 "AFAIK" 괄호 안의 정보를 고려하세요.

관련 정보