방금 PF(The Book Of PF, No Starch)에 관한 책을 읽었는데 한 가지 질문에 답이 없었습니다.
match
두 개의 인터페이스 $int_if 및 $ext_if를 사용하는 게이트웨이 컴퓨터가 있고 NAT가 적용될 때 NAT를 사용하여 $int_if:net(예: 10.0.0.0/24)에서 $ext_if로 패킷을 변환하면 어떻게 됩니까? 필터링 규칙 전 또는 후?
예:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23
그게 효과가 있을까요? 아니면 패킷이 10.0.0.23에서 왔는지 확인하기 전에 10.0.0.23 NAT에서 $ext_if 주소로 패킷의 소스 IP를 가져오나요?
이 다이어그램이 질문에 대한 답변에는 도움이 되지 않을 것 같지만 여전히 흥미롭습니다.http://www.benzedrine.cx/pf_flow.png]
PF NAT FAQ를 읽으시면 [http://www.openbsd.org/faq/pf/nat.html], 특히 "NAT 구성" 섹션에서는 다음과 같은 문장을 보게 됩니다.
일치 규칙에 의해 패킷이 선택되면 해당 규칙의 매개변수(예: nat-to)가 기억되어 패킷과 일치하는 통과 규칙에 도달할 때 패킷에 적용됩니다. 이를 통해 단일 일치 규칙을 통해 전체 패킷 클래스를 처리할 수 있으며, 차단 및 통과 규칙을 사용하여 트래픽 허용 여부에 대한 구체적인 결정을 내릴 수 있습니다.
위 단락에서 내가 말한 것과 같지 않다고 생각하므로 패킷으로 무엇을 할지 결정이 내려질 때까지 소스 IP가 "기억"됩니다. 결정이 내려지면 NATting이 적용됩니다.
어떻게 생각하나요?
추신: 이것은 다소 이론적인 질문입니다. 조금 실용적이라면 다음과 같이 했을 것입니다.
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23
block
따라서 패킷이 $int_if에 들어갈 때 규칙이 이미 적용된 것입니다.
편집: 물론 또 다른 가능성은 NAT 전에 결정하는 것입니다.
pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
패킷이 .23에서 도착하면 먼저 첫 번째 규칙, 두 번째 규칙, 세 번째 "규칙"과 일치합니다. 하지만 두 번째 규칙이 최종 통과/차단 규칙이므로 패킷이 차단됩니다. 옳은?
답변1
예, 귀하가 묻는 질문은 매우 이론적이지만 매우 흥미로운 질문입니다.
이 match
규칙은 마지막 일치 규칙에 적용될 때 적용됩니다. match
언급했듯이 규칙은 "고정적"입니다. 주요 목적은 아웃바운드 트래픽에 대한 여러 규칙 끝에 nat-to를 넣지 않고도 NAT 규칙과 같은 항목을 한 번만 설정할 수 있는 것입니다.
귀하의 예에서는 패킷이 삭제됩니다. 코드를 보거나 Henning Brauer에게 드롭 케이스에서 NAT 검사를 완전히 건너뛸지 결정하도록 요청해야 하지만 그럴 것입니다.아니요NAT 처리를 수행합니다.
내 생각엔 너의 규칙이예PF 책에서 이를 다루고 있지만(두 번째 판이 있습니까?) 토너먼트 규칙에서는 이를 명확하게 밝히지 않은 것 같습니다.
답변2
내가 틀렸다면 정정하십시오. 나가는 모든 패킷을 10.0.0.0/24로 전달하고 싶지만 10.0.0.23을 차단하고 싶습니까? 그렇다면 규칙을 다음과 같이 변경하세요.
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop out quick on $ext_if from 10.0.0.23
pass out on $ext_if from 10.0.0.0/24
quick
방화벽이 계속해서 필터링하는 것을 방지하는 데 사용됩니다 ( break
일부 프로그래밍 언어와 유사).
http://www.openbsd.org/faq/pf/filter.html#quick
빠른 키워드
앞에서 언급한 것처럼 각 패킷은 필터 규칙 세트에 대해 위에서 아래로 평가됩니다. 패킷은 기본적으로 통과된 것으로 표시되고, 어떤 규칙으로도 변경될 수 있으며, 필터링 규칙이 끝나기 전에 여러 번 앞뒤로 변경될 수 있습니다. 마지막 일치 규칙은 "승리"입니다. 한 가지 예외가 있습니다. 필터 규칙의 빠른 옵션은 추가 규칙 처리를 취소하고 지정된 작업이 수행되도록 하는 효과가 있습니다. 몇 가지 예를 살펴보겠습니다.
잘못된:
block in on fxp0 proto tcp to port ssh pass in all
이 경우 블록 라인은 평가될 수 있지만 모든 것을 통과하는 라인이 뒤에 오기 때문에 아무런 효과가 없습니다.
더 나은 것 :
block in quick on fxp0 proto tcp to port ssh pass in all
이러한 규칙은 약간 다르게 평가됩니다. 차단 라인이 일치하면 빠른 옵션으로 인해 패킷이 차단되고 나머지 규칙 세트는 무시됩니다.