iptables に次のルールを設定して、次の文字で終わるドメインをブロックします.watch
:
sudo iptables -A OUTPUT -j DROP -m string --string ".watch" --algo kmp
しかし、問題は が一致できないことです。したがって、上記の行は何も一致しません。ただし、から.
へのドットを削除すると正常に動作します。.watch
watch
Iptables ルールでドット「.」をブロックするにはどうすればよいですか?
答え1
文法的には正しいようですが、あなたのアプローチはこの目的には適していません。ストリングパッチパケット内の任意の文字列に一致します。
watch
またはどこかにあるパケットはすべてドロップされます.watch
。これにより誤検知が発生する可能性が高く、サービス拒否攻撃の新たなベクトルも導入される可能性があります。- 暗号化されたトラフィックを処理できません。ブロックできません。ウェブトラフィックの大部分。
- マッチング アルゴリズム (
bm
Boyer–Moore およびkmp
Knuth–Pratt–Morris) には比較的優れたオプションがありますが、文字列フィルターを使用すると依然として計算負荷が大きくなる可能性があります。
ドキュメントでもこれに対して明確に警告しています。
このマッチは注意して使用してください。多くの人が、ワームを阻止するために、DROP ターゲットとともにこのマッチを使用したいと考えています。これは大きな間違いです。これは、どんな IDS 回避方法でも破られてしまいます。
同様に、多くの人がこの一致を、POST という文字列を含む HTTP パケットをドロップすることで、POST や GET などの HTTP の特定の機能を停止する手段として使用しています。この作業は、フィルタリング プロキシの方が適していることを理解してください。さらに、POST という単語を含む HTML コンテンツは、前者の方法でドロップされます。この一致は、ユーザーランドの興味深いパケットをキューに入れて、より適切に分析できるようにするために設計されています。これに基づいてパケットをドロップすることは、どの IDS 回避方法でも阻止されます。
あなたが達成しようとしていることに対して、より良い代替案があります:
- DNSベースのフィルタリング。どのDNSサーバーでもこれを行うことができます。例:ドメイン名一般的な軽量 DNS フォワーダーです。
address=/watch/0.0.0.0
設定に追加するだけです。 - Web プロキシ ベースのフィルタリング。
答え2
DNS名は長さプレフィックス付きラベルとしてエンコードされます(RFC 1035 の詳細については を参照してください) なので、--hex-string "|05|watch|00|"
で終わる名前に一致させるには を使用する必要があります.watch
(長さは 2 桁の 16 進数で記述されることに注意してください。たとえば、serverfault.com
は としてエンコードされます)。これはおよび(またはアドレスが一致する場合は 5353 )"|0b|serverfault|03|com|00|"
と組み合わせる必要があることに注意してください。そうしないと、他の無関係なパケットの多くに一致する可能性があります。-p udp
--destination-port 53
.local
DNS クエリは TCP 経由でも実行できますが、TCP のフィルタリングはより複雑であり、暗号化された要求に関する既存のコメントや、DNS や Web プロキシを使用したアプリケーション レベルのフィルタリングの使用に関する提案が引き続き適用されます。