攔截 dhcp 數據包是一個看似簡單,可是有時候倒是死活都不生效的問題。html
從 dhcp 協議上來看,攔截 dhcp 彷佛是很簡單的。dhcp 客戶端從 udp 68 端口廣播發出 dhcp 請求,目標地址爲 255.255.255.255,目標端口爲 udp 67。
而後 dhcp 服務器響應請求,從 udp 67 端口向客戶端 udp 68 端口迴應數據。ubuntu
按照這個流程來看,用 iptables 來攔截一個壞蛋服務器的響應,規則是很簡單的:centos
iptables -t filter -A INPUT -m mac --mac-source <壞蛋 dhcp 的 mac 地址> \ -p udp --sport 67 --dport 68 -j DROP
可是,你試試看,在默認安裝的 ubuntu-server 上,這個規則徹底不起做用!服務器
具體的緣由是由於 dhcp 客戶端使用了 raw socket ,而 raw socket 在 netfilter 處理以前就得到了數據包,見 https://www.mail-archive.com/netfilter@lists.samba.org/msg03189.html。框架
ubuntu-server 和 centos 使用的 dhcp 客戶端爲 isc dhcp client,經過 raw socket 請求 dhcp,所以經過 netfilter 框架是沒有辦法直接攔截到 dhcp 的!!!socket