conntrack モジュールの基本的な概念が理解できません。
まず、私のシステム (Ubuntu 18.04) では有効になっていることを確認し、modinfo
nf_conntrack に関する情報を表示し、/proc/modules
ファイルには nf_conntrack が「ライブ」であることが示されています。
次に、次のテスト設定を行います。
マシン A (192.168.1.2) <-----> ルーター マシン (192.168.1.1 および 192.168.2.1) <----> マシン B (192.168.2.2)
ルーターマシンには次の iptables ルールがあります。
iptables -t filter -A FORWARD -m set --match-set BlackListPort dst -j DROP
BlackListPort は ipset テーブルです。
ここで、マシン A (1.2) からマシン B (2.2) への SSH 接続を確立します。動作を確認した後、ポート 22 (SSH のデフォルト) を BlackListPort テーブルに追加します。
その ipset テーブルからポート 22 を削除するまで、SSH 接続はフリーズ/ハングします。
さて、問題は: 私のシステムには conntrack が存在するのに、なぜ SSH ブロックが成功するのでしょうか? SSH 接続はポート 22 が ipset に追加される前に確立されたため、conntrack はすべてのパケットをスキップして SSH が機能するようにする必要があります。
答え1
ポート 22 が ipset に追加される前に SSH 接続が確立されたため、conntrack はすべてのパケットをスキップして SSH が機能するようにする必要があります。
これは正しくありません。
追跡対象の接続に属しているかどうかに関係なく、すべてのパケットはフィルター ルールを通じて処理されます。
関連するルール チェーンの先頭近くに次のようなものを配置することは、iptables ルールの非常に一般的な最適化です (FORWARD
この例では):
iptables -t filter -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
古いディストリビューションでは、代わりに次のバージョンが表示される場合があります。
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
( conntrack
match が match よりも優先されるようになったのは理解していますstate
。カーネルのバージョンによっては、この点についてうるさく言われることもあると思います。)
これにより、既存の接続に属するパケット(接続追跡情報が存在する場合)が通過できるようになります。しかし、重要なのは、あなた制御できる正確にはどこでそのルールを設定するか、まったく使用するかを決定します。したがって、ファイアウォール ルールで接続状態を必要に応じて考慮するように設定できます (または考慮しないように設定できます)。