iptables는 명시적으로 추가된 모든 NAT 규칙에 대해 암시적으로 자동으로 역방향/역방향 규칙을 추가합니까?
일반적으로 DROP 정책을 가정하면 필터 테이블의 모든 INPUT 규칙에 대해 관련되거나 설정된 트래픽을 허용하는 해당 OUTPUT 규칙이 있습니다(그 반대의 경우도 마찬가지). 예를 들어, iptables 방화벽을 통해 인바운드 SSH를 활성화하려면 들어오는 연결을 허용하는 INPUT 규칙이 있어야 합니다.
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
그러나 반환 트래픽을 허용하는 해당 OUTPUT 규칙도 있습니다.
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
필터 테이블에는 이러한 명시적인 역방향 트래픽 규칙이 필요하지만 NAT 테이블에는 그렇지 않은 것 같습니다.
다양한 비공식 참고자료에서 다음 발췌문을 살펴보세요.
특정 이벤트로 인해 처리 중에 테이블 체인이 건너뛰게 됩니다. 예를 들어 연결의 첫 번째 패킷만 NAT 규칙에 대해 평가됩니다. 첫 번째 패킷에 대한 모든 NAT 결정은 추가 평가 없이 연결의 모든 후속 패킷에 적용됩니다. NAT 연결에 대한 응답에는 올바른 라우팅을 위해 역방향 NAT 규칙이 자동으로 적용됩니다.
그러나 netfilter(즉, iptables의 "엔진" 역할을 하는 패킷 필터링/수정 프레임워크)는 충분히 똑똑합니다. 들어오는 [NAT] 패킷이 수신될 때마다 netfilter의 conntrack 테이블과 비교됩니다. Netfilter는 패킷이 기존 발신 연결(ACK 플래그 세트, IP:포트 일치, TCP 시퀀스 번호 일치 등)에 대한 응답인 경우 자동으로 DNAT를 수행합니다. 추가 규칙은 필요하지 않습니다.
다행히도 netfilter 프레임워크는 자동으로 모든 규칙에 역규칙을 추가하므로 명시적인 규칙만 설정하면 됩니다. 일반적으로 두 규칙 중 하나에 대한 결정은 불확실성이 낮은 규칙을 채택하여 이루어집니다. 예를 들어, "로컬 서브넷의 모든 패킷의 보낸 사람 주소를 바꿉니다"라는 규칙은 "클라이언트가 서버에 무언가를 보낸 경우 서버 응답의 수신자를 다른 것으로 바꿉니다."보다 훨씬 쉽습니다. 경험상 가장 먼저 실행되는 규칙은 커널에 명시적으로 설정된 규칙입니다.
내가 읽고공식 넷필터 문서그러나 나는 어디에서도 이 행동에 대한 언급을 찾지 못했습니다. 위의 진술을 확인하는 공식 참고 자료가 있습니까?
답변1
iptables는 명시적으로 추가된 모든 NAT 규칙에 대해 암시적으로 자동으로 역방향/역방향 규칙을 추가합니까?
완전한 것은 아니고
처음 두 문장은 정확합니다. 세 번째 문장은 시스템 작동 방식을 이해하지 못하는 사람의 혼란스러운 횡설수설입니다.
iptables nat(iptables 필터링과 달리)는 연결에서 작동합니다. 연결의 첫 번째 패킷은 nat 테이블을 통과하고 이에 따라 변환됩니다. 동일한 연결에 속하는 후속 패킷은 NAT 테이블을 거치지 않고 단순히 첫 번째 패킷이 변환될 때 설정된 규칙에 따라 변환됩니다.
iptables 매뉴얼 페이지https://linux.die.net/man/8/iptables문서에는 "연결의 첫 번째 패킷"에 대해 nat 테이블이 쿼리되고 DNAT 및 SNAT 대상의 매뉴얼 페이지 부분에 "(이 연결의 모든 향후 패킷도 손상됨)"라고 나와 있습니다.
불행하게도 이보다 더 깊이 있는 공식 문서는 본 적이 없습니다. iptables에 대한 참고 자료는 Freezetux iptables 튜토리얼이지만 공식적인 것은 아닌 것 같습니다.
답변2
질문에 대한 답변은 이미 제공되었지만 제가 찾은 "공식" 문서를 참조해 달라고 요청하셨습니다(직접 답변을 찾고 있습니다).
~에서공식 문서(2.1. 네트워크 주소 변환이란 무엇입니까?)
이러한 링크 중 하나가 NAT를 수행하는 경우 패킷이 통과할 때 패킷의 소스 또는 대상이 변경됩니다. 상상할 수 있듯이 이는 시스템이 작동하도록 설계된 방식이 아니므로 NAT는 항상 짜증납니다.일반적으로 NAT를 수행하는 링크는 패킷이 어떻게 손상되었는지 기억하고 응답 패킷이 반대 방향으로 오면 응답 패킷이 역 손상되므로 모든 것이 잘 작동합니다.