CentOS 8에서 잘못된 TCP 플래그 패킷 필터링

CentOS 8에서 잘못된 TCP 플래그 패킷 필터링

저는 CentOS 8을 사용하고 있으며 CentOS 6에서 iptables tcp-flags를 사용하여 했던 것처럼 잘못된 tcp 플래그 패킷을 제거하고 싶습니다.

다음은 CentOS 6에서 iptables tcp-flags를 사용하여 수행된 패킷 삭제의 예입니다.

-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP

CentOS 8의 방화벽 서비스는 기본 iptables/nftables에 대한 --직접 액세스를 제외하고 위와 같은 기능을 제공하지 않는다는 것을 알 수 있습니다. 나는 이것을하고 싶지 않습니다.

CentOS 8에서는 불량/가짜 패킷 손실이 관련이 없나요? 아니면 CentOS 8에서 방화벽을 사용하는 다른 구현이 있습니까?

답변1

긴 이야기 짧게: Netfilter가 올바르게 사용되는 모든 설정에서는 이러한 규칙을 사용하는 것이 중복됩니다.연결하다상태 저장 방화벽에 필요한 시설입니다. ~처럼방화벽그것을 사용하십시오. 이미 적용되었습니다.

이러한 규칙을 사용해야 하는 유일한 경우는 시스템이 상태 저장 방화벽을 전혀 사용하지 않는 경우입니다. 활성화되지 않았거나 사용되지 않습니다.연결하다전혀 없거나 일부 스트림이 다음으로 표시될 수 있습니다.추적되지 않은.

오늘날의 블로그와 규칙에서 이 중복 검사를 자주 볼 수 있는 가장 가능성 있는 이유는 이것이 기존의 유사한 규칙에서 상속되었기 때문이라고 생각합니다.IP 체인Linux 커널 2.2.x의 시대(또는 원래 구현된 시기)연결하다리눅스 2.4.x에서이렇게 철저한 점검은 이루어지지 않았습니다), 확장된 검사 기능을 갖춘 이러한 상태 저장 방화벽 시설은 당시에는 존재하지 않았으며 당시에는 합리적이었을 것입니다.

자세한 내용은 아래를 참조하세요.


웹 필터연결하다표시된 것처럼 TCP 패킷을 추적하는 동안 유효한 TCP 플래그가 확인되었습니다.nf_conntrack_proto_tcp.c:

/* table of valid flag combinations - PUSH, ECE and CWR are always valid */
static const u8 tcp_valid_flags[(TCPHDR_FIN|TCPHDR_SYN|TCPHDR_RST|TCPHDR_ACK|
               TCPHDR_URG) + 1] =
{
  [TCPHDR_SYN]                = 1,
  [TCPHDR_SYN|TCPHDR_URG]         = 1,
  [TCPHDR_SYN|TCPHDR_ACK]         = 1,
  [TCPHDR_RST]                = 1,
  [TCPHDR_RST|TCPHDR_ACK]         = 1,
  [TCPHDR_FIN|TCPHDR_ACK]         = 1,
  [TCPHDR_FIN|TCPHDR_ACK|TCPHDR_URG]  = 1,
  [TCPHDR_ACK]                = 1,
  [TCPHDR_ACK|TCPHDR_URG]         = 1,
};

무작위 조합아니요이 표의 내용은 유효하지 않습니다(즉, 32개 사례 중 23개 사례). 궁금하신 분은 다음 출처를 읽어보시기 바랍니다.NF_ACCEPT=1그러므로-NF_ACCEPT1이야이는 유효하지 않음을 의미합니다.). 여기에는 OP의 세 가지 예 FIN,SYN, , 가 포함됩니다 SYN,RST.FIN,RST연결하다그뿐만 아니라 예를 들면패킷이 유효한 TCP 창 내에 있는지 확인.

그렇게 할 때iptables이러한 가짜 패킷에는 다음 일치 항목을 사용하세요.

-m conntrack --ctstate NEW
-m conntrack --ctstate ESTABLISHED
-m conntrack --ctstate INVALID 

또는 이에 상응하는nftables표현:

ct state new
ct state established
ct state invalid

마지막 항목인 INVALID/ 만 invalid일치하므로 제거해야 합니다(충분한 -j DROP/ drop터미널 문을 사용하세요).

CentOS6에 주목하세요.커널 2.6.18은 위조된 패킷을 필터링했습니다.(오늘의 9/32 대신 15/64 사례 허용) 따라서 이러한 패킷을 간단히 삭제하여 처리했습니다 -m state --state INVALID -j DROP.


틀림없이방화벽이와 같은 일치를 사용하십시오.

CentOS7이 설치됨iptables언제 규칙방화벽실행 중인 항목에는 일반적으로 다음이 포함됩니다.

-A INPUT -m conntrack --ctstate INVALID -j DROP
-A FORWARD -m conntrack --ctstate INVALID -j DROP

CentOS8 설치됨nftables언제 규칙방화벽달리기nftables활성화된 백엔드에는 일반적으로 다음이 포함됩니다.

# nft list chain inet firewalld filter_INPUT |grep -A2 invalid
        ct state { invalid } drop
        reject with icmpx type admin-prohibited
    }
# nft list chain inet firewalld filter_FORWARD|grep -A2 invalid
        ct state { invalid } drop
        reject with icmpx type admin-prohibited
    }

따라서 가짜 TCP 플래그는 사용할 때 이미 처리되었습니다.방화벽.


사용하지 않을 때방화벽입력 경로와 전달 경로 모두에 대해 이러한 종류의 규칙을 사용해야 합니다(이는 확실히 더 많은 규칙이 필요하고 있는 그대로 사용해서는 안 되는 예이므로 자주 필요한 규칙과 옵션이 누락되어 있습니다).

IP테이블:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

(그리고 필요에 따라 다른 수락, 삭제 또는 거부 규칙을 추가합니다.구체적인 이유, REJECT 규칙을 배치하는 것이 중요합니다.뒤쪽에규칙 ... INVALID -j DROP)

OUTPUT에서도 동일한 작업을 수행할 수 있지만 일반적으로 자신을 신뢰합니다(그리고 신중하게 제작된 RAW 패킷은 어쨌든 방화벽을 우회합니다).

nftables .nft형식 예(특정 규칙에 따라 수행해야 함):

table inet mytable {
    chain myinput {
        type filter hook input priority 0; policy accept;
        ct state established accept
        ct state invalid drop
    }

    chain myforward {
        type filter hook forward priority 0; policy accept;
        ct state established accept
        ct state invalid drop
    }
}

답변2

CentOS 8은 nftables를 사용하므로 nft.

아마도nftables 위키너를 도울 것이다.

nftable에는 iptables 호환성 레이어가 있지만 이를 기본 nftables 규칙과 혼합하는 것은 권장되지 않습니다.

관련 정보