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の時代(またはもともと実装された時期)つながるLinux 2.4.xでこのように徹底した点検は行われませんでした)、拡張検査機能を備えたこれらのステートフルファイアウォール施設は、当時は存在せず、当時は合理的でした。

詳しくは下記をご覧ください。


Webフィルタつながる図に示すように、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の3つの例FIN,SYNが含まれますSYN,RSTFIN,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
    }
}

おすすめ記事