我的 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 封包來停止 HTTP 中的特定功能,例如 POST 或 GET。請理解,這項工作最好由過濾代理來完成。此外,使用前一種方法,任何帶有 POST 一詞的 HTML 內容都會被刪除。此匹配的設計目的是能夠將用戶感興趣的資料包排隊以進行更好的分析,僅此而已。基於此的丟棄資料包將被任何 IDS 規避方法所擊敗。
對於您想要實現的目標,有更好的選擇:
- 基於 DNS 的過濾。任何 DNS 伺服器都可以執行此操作。例如,網域解析是一個常見的輕量級 DNS 轉送器:您只需新增
address=/watch/0.0.0.0
到其配置即可。 - 基於 Web 代理程式的過濾。
答案2
DNS 名稱被編碼為長度前綴標籤(請參閱RFC 1035詳細資訊),因此您需要使用--hex-string "|05|watch|00|"
來匹配以 結尾的名稱.watch
(請注意,長度寫為 2 個十六進位數字,例如serverfault.com
將編碼為"|0b|serverfault|03|com|00|"
)。請注意,這應該與-p udp
and --destination-port 53
(如果匹配地址則為 5353 )結合使用.local
,否則它可能會匹配許多其他不相關的資料包。
DNS 查詢也可以透過 TCP 進行,但過濾 TCP 更加複雜,並且有關加密請求的現有註釋以及有關使用 DNS 和/或 Web 代理的應用程式級過濾的建議仍然適用。