iptable의 conntrack 모듈은 언제 패킷 상태를 추적합니까?

Aug 15 2020

먼저 상태를 저장해야합니다. 내가 사용했던 오래된 BSD 방화벽을 사용하면 IPFW라는 이름이 붙은 것 같고, "이탈 패킷의 상태를 추적"하는 규칙을 적용하는 데 사용되었으며 이는 인터페이스의 아웃 바운드 방향에 배치되었습니다. 그런 다음, 아웃 바운드 방향에 대한 규칙에 의해 생성 된 상태와 비교하여 인바운드 방향에 대한 또 다른 규칙을 확인했습니다. 그래서 두 가지 규칙이있었습니다. (1) 상태 테이블을 채우는 것은 아웃 바운드 방향이고, (2) 상태 테이블을 조회하는 것은 인바운드 방향이었습니다.

그러나 connntrack을 사용하면 다음 규칙과 같이 INPUT 체인에 적용됩니다.

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

이것은 실제로 그 진술이 무엇을하고 있는지 궁금합니다.

  • 상태 테이블에 정보를 넣어 해당 규칙과 일치하는 패킷 추적을 시작한다는 말입니까?
  • 아니면 이미 상태 정보가 있고이를 기반으로하는 인바운드 메시지에 대해 조치를 취할 것이라는 말입니까? (예 : 이전에 승인 된 연결에 속한 경우 승인 하시겠습니까?). 그러나이 경우 상태 테이블은 어디에 채워 졌습니까? 어떤 규칙을 사용합니까? 아니면 규칙이없고 암시 적입니까?

답변

5 A.B Aug 15 2020 at 21:43

Netfilter 및 conntrack 소개 프레젠테이션

먼저 Netfilter 및 일반 네트워킹의 패킷 흐름에 대한 필수 회로도 :

Netfilter는 네트워크 스택의 나머지 부분에 자신을 삽입하는 패킷 필터링 프레임 워크입니다 ( "라우팅 결정"및 기타 흰색 모서리가 둥근 상자 부분으로 표시됨). Netfilter는 다른 서브 시스템과 "클라이언트"를위한 후크와 API를 제공합니다. 이러한 부분에는 conntrack (연결 추적기) 및 iptables (또는 nftables )가 있습니다. Netfilter와 conntrack 의 구분 은 매우 모호합니다. conntrack 을 Netfilter의 통합 부분으로 간주 할 수 있습니다 .

패킷이 통과하는 다양한 단계를 설명하는 회로도에서 특정 지점 (raw / PREROUTING과 mangle / PREROUTING 사이 또는 raw / OUTPUT과 mangle / OUTPUT 사이)에서 패킷이 conntrack을 통과 함을 알 수 있습니다.

이 시점에서 conntrack 은 자체 조회 테이블 (커널 메모리에 보관 된 미니 조회 데이터베이스)에서 검색합니다.

  • 이 패킷의 특성을 찾을 수없는 경우 (그리고 원시 테이블에서 UNTRACKED로 선언되지 않은 경우), 새로운 conntrack 양방향 튜플 항목 (프로토콜, 특정 제품군 및 프로토콜 정보 : 초기 소스 및 포트, 초기 대상 및 포트, 응답 소스 및 포트, 응답 대상 및 포트 (NAT 또는 ICMP에 대한 에코 응답 일치 에코 요청과 같은 일부 이상한 프로토콜이 관련되지 않는 한 마지막 두 개는 일반적으로 반대 임)) 상태를 NEW로 설명하는 흐름을 설명합니다.
  • (어떤 방향 으로든) 이전 항목과 일치하고이 흐름의 상태와 호환되는 경우 흐름 상태가 변경 될 수 있습니다 (예 : 이전에 없었던 경우 NEW에서 ESTABLISHED로 변경).
  • 특정 이유로 패킷이 특성을 가지고 있음에도 불구하고 기존 흐름과 일치 할 수없는 경우 (예 : 재전송이 이미 성공적으로 시작된 후 수신 된 지연 TCP 패킷이 시퀀스 및 SACK 값과 관련하여 범위를 벗어남) 패킷은 INVALID 태그가 지정됩니다.
  • RELATED와 같은 몇 가지 다른 경우가 있습니다. 이것은 흐름 자체의 일부가 아니라 다른 기존 (즉 : 데이터베이스에있는) 흐름과 연관 될 수있는 새로운 흐름과 관련된 패킷에 관한 것입니다. 두 가지 예는 패킷 (예 : UDP 포트에 연결할 수 없음)을 수신하거나 conntrack 하위 시스템에 nf_conntrack_ftp대한 플러그인 인 커널 모듈과 같은 특수 프로토콜 도우미 가 패킷이 연결된 개별 데이터 흐름의 일부임을 감지 할 때 생성되는 ICMP 오류입니다. FTP 명령 PASV / EPSV 또는 PORT / EPRT를 사용하여 명령 흐름 (포트 21)에서 수행됩니다.

질문에 답하기

이 모든 내용은 두 가지 총알에 대한 답변입니다.

  • 메인 네트워크 네임 스페이스에서 conntrack 은 모듈 (가능한 관련 프로토콜 별 하위 모듈 포함) 이로드 되는 즉시 연결 추적을 시작합니다. 비 초기 네트워크 네임 스페이스 (컨테이너 ...)의 경우 다른 서브 시스템이이를 참조해야합니다 (예 : OP의 iptables 의 conntrack 모듈 또는 conntrack나중에 설명 하는 명령을 한 번 사용 ). 이것은 기본이고 패킷은 특히 비 추적으로 표시해야합니다 전에 작성한 conntrack 추적 할 수 없습니다에 서브 시스템이 패킷을 본다. Linux에서는 추적이 필요하지 않은 경우가 거의 없지만 물론 상태 저장 방화벽과 상태 저장 / 동적 NAT는 더 이상 사용할 수 없습니다 (처음에는 UNTRACKED를 사용해야 할 수도있는 steless NAT는 여전히 가능합니다.) 다, 그러나와 의 iptables . TC 또는 nftables 수 있습니다.) conntrack 이 일부 패킷을 처리 하지 않도록하려면 다음 과 같은 종류의 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
    
  • 패킷이 filter / INPUT을 통과하고이 규칙에 도달하면 :

     iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    

    의 iptables 의 특정 커널 모듈은 xt_conntrack쿼리 작성한 conntrack (다양한 관련 커널 모듈에 의해 처리 서브 시스템 nf_conntrack*) 및 검색 데이터베이스에서이 패킷의 상태에 대해 묻습니다. 대답이 RELATED이거나 ESTABLISHED패킷이 일치하면 ACCEPT 판정으로 진행됩니다. 실제로 결과는 처음 조회가 수행되었을 때 (일반적으로 conntrack에 의해 ) 패킷에 이미 캐시되어 있으므로 저렴한 "조회"입니다. 따라서 이것은 이전에 이미 승인 된 흐름을 처리하는 일반적인 규칙입니다. 이러한 흐름은 처음에는 명시 적으로 언급 된 규칙 또는 단순히 언급하지 않고이 일반 규칙 뒤에 배치 되는 규칙에서 수락 될 수 있습니다 (하지만 일반적으로이를 수행하기 전에 DROP되어야하는 INVALID 상태를 기억하십시오).-m conntrack --ctstate NEW

  • 총알 추가 : 들어오는 패킷과 나가는 패킷의 처리는 PREROUTING과 OUTPUT 사이에서 상당히 대칭 적입니다 (대칭 적으로 보이지 않더라도) : PREROUTING과 OUTPUT의 conntrack 인터페이스 (그리고 NATiptables 의 nat 테이블을 통과하는 NEW 상태의 첫 번째 패킷을 제외하고 conntrack 과 함께 작동 합니다. 이것은 IPFW에 대해 작성한 설명과 약간 다를 수 있습니다. 응용 프로그램을 실행하는 서버가 나가는 흐름을 제한하는 경우 이미 허용 된 들어오는 트래픽의 나가는 응답 패킷이 통과 할 수 있도록 필터 / OUTPUT 및 필터 / INPUT 모두에서 동일한 일반 iptables 규칙 이 필요할 가능성이 큽니다 .


추가 정보

와 상호 작용하는 전용 도구가 있습니다 작성한 conntrack 에서 서브 시스템의 룩업 테이블을 작성한 conntrack-도구 .

  • conntrack: conntrack에서 처리하는 조회 테이블의 내용을 쿼리, 삭제 또는 업데이트합니다 .

    몇 가지 예.

    다음을 사용하여 모든 추적 항목 (추가 필터없이 클 수 있음)을 나열 할 수 있습니다.

    conntrack -L
    

    시스템 (사설 LAN의 앞에 예를 들면 라우터 또는 VM 및 컨테이너를 실행) NAT를하고있는 경우 사용할 수 있습니다 --any-nat, --src-nat또는 --dst-nat만 표시 RESP에. 모든 NAT, 모든 소스 NAT (가장) 또는 모든 대상 NAT (일반적으로 전달 된 포트 용) :

    conntrack 이벤트 의 실시간 모니터링 :

    conntrack -E
    
  • conntrackd: 두 가지 주요 목적이 (conntrack) 흐름 회계 및 통계 또는 고 가용성 상태 저장 방화벽 클러스터 상태 동기화 인 데몬입니다 .

2 TeroKilkanen Aug 15 2020 at 20:46

연결 추적은 Netfilter의 별도 기능이며 IPTables로 구성되지 않습니다.

그림 conntrack에서 INPUT 경로 에는 두 단계가 있고 OUTPUT 경로에는 한 단계가 있습니다. 이러한 단계는 개별 패킷을 연결 추적 테이블에서 추적 된 기존 연결과 연결하거나 테이블에 새 연결 추적 항목을 만듭니다.

Conntrack 기능은 Linux 커널 모듈이며 종종 기본 구성의 커널에 포함됩니다.

Conntrack 작동은 net.netfilter.nf_conntracksysctl 값을 조정하여 조정할 수 있습니다 .

두 번째 대안은 일어나는 일입니다. 상태 정보는 Conntrack 함수에 의해 기록되며 IPTables 규칙은 정보를 위해 Conntrack 테이블을 참조합니다.