![iptable의 conntrack 모듈은 언제 패킷 상태를 추적합니까?](https://rvso.com/image/756248/iptable%EC%9D%98%20conntrack%20%EB%AA%A8%EB%93%88%EC%9D%80%20%EC%96%B8%EC%A0%9C%20%ED%8C%A8%ED%82%B7%20%EC%83%81%ED%83%9C%EB%A5%BC%20%EC%B6%94%EC%A0%81%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
먼저 상태를 저장해야 합니다. 내가 사용했던 일부 오래된 BSD 방화벽에는 IPFW라는 이름이 붙은 것 같습니다. 나는 "떠나는 패킷의 상태를 추적"하는 규칙을 두곤 했으며 이는 인터페이스의 아웃바운드 방향에 배치되었습니다. 그런 다음 아웃바운드 방향에 대한 규칙에 의해 생성된 상태와 비교하여 이를 확인하는 인바운드 방향에 대한 또 다른 규칙입니다. 따라서 이전에는 두 가지 규칙이 있었습니다. (1) 상태 테이블을 채우는 것은 아웃바운드 방향이었고 (2) 상태 테이블을 조회하는 것은 인바운드 방향이었습니다.
하지만 connntrack을 사용하면 다음 규칙과 같이 INPUT 체인에 적용되는 것을 볼 수 있습니다.
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
이 말은 실제로 무엇을 하고 있는지 궁금합니다.
- 상태 테이블에 정보를 넣어서 해당 규칙과 일치하는 패킷 추적을 시작한다는 뜻인가요?
- 아니면 이미 상태 정보가 있고 이를 기반으로 인바운드 메시지에 대해 조치를 취한다는 뜻입니까? (예: 이전에 승인된 연결에 속했다면 승인합니까?) 하지만 이 경우 상태 테이블은 어디에 채워졌습니까? 어떤 규칙이 있나요? 아니면 규칙이 없고 암시적인가요?
답변1
Netfilter 및 conntrack 소개 프레젠테이션
먼저 Netfilter 및 일반 네트워킹의 패킷 흐름에 대한 필수 회로도:
Netfilter는 네트워크 스택의 나머지 부분("라우팅 결정" 및 기타 흰색 둥근 모서리 상자 부분으로 표시됨)에 삽입되는 패킷 필터링 프레임워크입니다. Netfilter는 다른 하위 시스템과 "클라이언트"에 대한 후크와 API를 제공합니다. 이 부분들 중에는콘트랙(연결 추적기) 및iptables(또는nftables). Netfilter와콘트랙꽤 모호합니다. 그냥 고려해보시면 됩니다콘트랙Netfilter의 통합된 부분으로.
패킷이 통과하는 다양한 단계를 설명하는 도식에서 어떤 지점(raw/PREROUTING과 mangle/PREROUTING 사이 또는 raw/OUTPUT과 mangle/OUTPUT 사이)에서 패킷이 통과하는 것을 볼 수 있습니다.콘트랙.
이 지점에서,콘트랙자체 조회 테이블(커널 메모리에 보관된 미니 조회 데이터베이스)에서 검색합니다.
- 이 패킷의 특성을 찾을 수 없는 경우(및 원시 테이블에서 UNTRACKED로 선언되지 않은 경우) 새로운 conntrack 양방향튜플항목(프로토콜, 특정 제품군 및 프로토콜 정보: 초기 소스 및 포트, 초기 대상 및 포트, 응답 소스 및 포트, 응답 대상 및 포트(마지막 두 개는 NAT 또는 에코와 같은 일부 이상한 프로토콜이 포함되지 않는 한 일반적으로 반대임) ICMP에 대한 에코 요청과 일치하는 응답)) 흐름을 설명하는 응답은 NEW 상태로 생성됩니다.
- (어떤 방향으로든) 이전 항목과 일치하고 이 흐름의 상태와 호환되는 경우 흐름 상태가 변경될 수 있습니다(예: 이전의 경우가 아닌 경우 NEW에서 ESTABLISHED로 변경).
- 특정 이유 때문에 패킷이 특성을 가지고 있음에도 불구하고 기존 흐름과 일치할 수 없는 경우(예: 재전송이 이미 성공적으로 시작된 후 수신된 늦은 TCP 패킷으로 인해 시퀀스 및 SACK 값과 관련하여 범위를 벗어남) 패킷에는 INVALID 태그가 지정됩니다.
- RELATED와 같은 몇 가지 다른 경우가 있습니다. 이는 흐름 자체의 일부가 아니라 다른 기존(예: 데이터베이스에 있는) 흐름과 연관될 수 있는 새로운 흐름과 관련된 패킷에 관한 것입니다. 두 가지 예는 패킷 수신으로 인해 생성된 ICMP 오류(예: UDP 포트에 연결할 수 없음) 또는 커널 모듈과 같은 특수 프로토콜 도우미가
nf_conntrack_ftp
플러그인인 경우입니다.콘트랙하위 시스템은 패킷이 명령 흐름(포트 21)에서 수행된 FTP 명령 PASV/EPSV 또는 PORT/EPRT와 연결된 별도의 데이터 흐름의 일부인지 감지합니다.
질문에 답하기
이 모든 내용을 바탕으로 두 개의 글머리 기호에 대한 답변은 다음과 같습니다.
메인 네트워크 네임스페이스에서콘트랙해당 모듈(가능한 관련 프로토콜별 하위 모듈 포함)이 로드되자마자 연결 추적을 시작합니다. 초기가 아닌 네트워크 네임스페이스(컨테이너...)의 경우 다른 하위 시스템이 이를 참조해야 합니다(예: OP's)iptables의 conntrack 모듈을 사용하거나
conntrack
나중에 설명하는 명령을 한 번 사용하세요). 이것이 기본값이며 패킷은 특별히 UNTRACKED로 표시되어야 합니다.~ 전에그만큼콘트랙하위 시스템에서는 이 패킷이 추적되지 않는 것으로 확인합니다. Linux에서는 추적이 필요하지 않은 경우가 몇 가지 있지만 상태 저장 방화벽과 상태 저장/동적 NAT는 더 이상 사용할 수 없습니다(처음에는 UNTRACKED를 사용해야 할 수도 있는 Steless NAT는 여전히 사용할 수 있음). 완료되었지만 완료되지 않았습니다.iptables.TC또는nftables할 수 있다). 피하려면콘트랙일부 패킷을 처리하는 중입니다.iptables규칙을 사용할 수 있습니다(예: 포트 80/tcp):iptables -t raw -A PREROUTING -p tcp --dport 80 -j CT --notrack iptables -t raw -A OUTPUT -p tcp --sport 80 -j CT --notrack
패킷이 필터/INPUT을 통과하여 다음 규칙에 도달하면:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
그만큼iptables의 특정 커널 모듈이
xt_conntrack
쿼리합니다.콘트랙하위 시스템(다양한 관련 커널 모듈에 의해 처리됨nf_conntrack*
)을 검색하고 조회 데이터베이스에서 이 패킷의 상태에 대해 묻습니다. 대답이RELATED
또는ESTABLISHED
이면 패킷이 일치하고 ACCEPT 판정으로 진행됩니다. 사실 결과는 이미캐시됨패킷조회가 처음 수행되었을 때(보통콘트랙) 그래서 이것은 저렴한 "조회"입니다. 따라서 이는 이전에 이미 승인된 흐름을 처리하는 일반적인 규칙입니다. 이러한 흐름은 명시-m conntrack --ctstate NEW
적으로 언급하는 규칙이나 단순히 언급하지 않고 배치된 규칙 에서 처음에 허용될 수 있습니다.~ 후에이 일반 규칙(그러나 그렇게 하기 전에 일반적으로 삭제되어야 하는 INVALID 상태를 염두에 두십시오).글머리 기호 추가: 들어오는 패킷과 나가는 패킷의 처리는 PREROUTING과 OUTPUT 사이에서 상당히 대칭적입니다(비록 대칭으로 보이지 않더라도).콘트랙PREROUTING과 OUTPUT의 인터페이스(그리고 몇 가지 다른 장소에서도NAT함께 일하고 있다콘트랙, NEW 순회 상태의 첫 번째 패킷은 제외iptables의 nat 테이블). 이는 IPFW에 대해 작성한 설명과 약간 다를 수 있습니다. 애플리케이션을 실행하는 서버가 나가는 흐름도 제한하는 경우 동일한 일반이 필요할 가능성이 높습니다.iptables필터/OUTPUT 및 필터/INPUT 모두에서 규칙을 적용하여 이미 허용된 들어오는 트래픽의 나가는 응답 패킷이 통과하도록 허용합니다.
추가 정보
상호작용을 위한 전용 도구가 있습니다.콘트랙하위 시스템의 조회 테이블conntrack 도구.
conntrack
: 처리된 조회 테이블의 내용을 쿼리, 삭제 또는 업데이트합니다.콘트랙.몇 가지 예.
다음을 사용하여 추적된 모든 항목(추가 필터 없이는 커질 수 있음)을 나열할 수 있습니다.
conntrack -L
시스템이 NAT를 수행하는 경우(예: 개인 LAN 앞의 라우터 또는 VM 및 컨테이너 실행) 를 사용하거나
--any-nat
또는--src-nat
resp--dst-nat
만 표시할 수 있습니다. 모든 NAT, 모든 소스 NAT(가장) 또는 모든 대상 NAT(일반적으로 전달된 포트의 경우):실시간 모니터링콘트랙이벤트:
conntrack -E
conntrackd
: 두 가지 주요 목적이 (conntrack) 흐름 계산 및 통계인 데몬, 또는고가용성 상태 저장 방화벽 클러스터상태 동기화.
답변2
연결 추적은 Netfilter의 별도 기능이며 IPTables로 구성되지 않습니다.
그림에는 conntrack
INPUT 경로에 두 단계가 있고 OUTPUT 경로에 한 단계가 있습니다. 이러한 단계에서는 개별 패킷을 연결 추적 테이블에서 추적된 기존 연결과 연결하거나 테이블에 새 연결 추적 항목을 만듭니다.
Conntrack 기능은 Linux 커널 모듈이며 기본 구성의 커널에 포함되는 경우가 많습니다.
Conntrack 작업은 sysctl 값을 조정하여 조정할 수 있습니다 net.netfilter.nf_conntrack
.
두 번째 대안은 무슨 일이 일어나는가입니다. 상태 정보는 Conntrack 기능에 의해 기록되며 IPTables 규칙은 단순히 Conntrack 테이블에서 정보를 참조합니다.