OpenBSD >= 4.7을 사용하는 PF의 NAT 및 소스 IP 필터링

OpenBSD >= 4.7을 사용하는 PF의 NAT 및 소스 IP 필터링

방금 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 

이러한 규칙은 약간 다르게 평가됩니다. 차단 라인이 일치하면 빠른 옵션으로 인해 패킷이 차단되고 나머지 규칙 세트는 무시됩니다.

관련 정보