대상이 있는 서브넷의 모든 패킷을 원 DROP
하지만 특정 대상( )에 대한 액세스만 허용하고 싶습니다 .192.168.112.0/24
192.168.112.0/24
192.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.253
192.168.112.0/24
-I FORWARD -s 192.168.112.253 -d 192.168.112.0/24 -j ACCEPT
이 두 규칙은 포함된 규칙 앞(즉 뒤) ACCEPT
에 배치되어야 합니다. 즉, "허용 목록"에 추가하려는 트래픽이 해당 규칙에 의해 처리됩니다. 따라서 먼저 일치하면 규칙이 적용되지 않습니다.-I
DROP
192.168.112.0/24
192.168.112.253
ACCEPT
그러나 두 규칙 자체의 순서는 ACCEPT
서로 "겹치지" 않으므로 중요하지 않습니다.
그런데 여기서 취하는 접근 방식에는 두 가지 주의 사항이 있습니다. 첫째, 보시다시피 ACCEPT
각 트래픽 "쌍"에는 두 개의 ( ) 규칙이 필요합니다. 둘째 , 192.168.112.253
.192.168.112.0/24
일반적으로 모든 응답 트래픽을 허용하는 다음과 같은 "상태 저장" 규칙이 있습니다.
-I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
(정확히 말하면 ESTABLISHED
연결을 시작하는 첫 번째 트래픽을 제외하고 양방향 트래픽은 다음과 같은 상태를 갖습니다. RELATED
포트 번호 쌍이 교환될 뿐만 아니라 원래 트래픽과 다른 식별된 특정 응답 트래픽에 사용됩니다. 의미 ,
" 또는"이 포함되어 있으면 트래픽이 동시에 두 상태에 있지 않더라도 "AFAIK" 괄호 안의 정보를 고려하세요.