iptables 不會阻止轉發到主機本身的另一個 IP
我有主機用作網關
net.ipv4.conf.all.rp_filter=0
和代替使用的 iptables rpfilter
iptables -t raw -A PREROUTING -m rpfilter --invert -j LOG-DROP-RP
我的主機有 2 個介面 eth1 的 IP 為 10.0.0.1/8 和 eth2 的 IP 為 192.168.0.1/16。如果某個 eth 1上 IP 為 192.168.0.2 的主機發送數據包,它會被丟棄並記錄。轉發表也會阻止 eth1 和 eth2 之間的轉發。從 eth 1上的 10.0.0.2 到 eth 2 上的 192.168.0.2 的數據包被轉發規則阻止並記錄。
但是,如果 eth 1上 IP 為 10.0.0.2 的主機將數據包發送到 192.168.0.1,它將通過。rpfilter 只是忽略它。轉發表似乎也被忽略了。
我該如何預防?因為在這個主機上可能有一些私有介面 eth3 監聽它的私有服務,它可以從任何不需要的地方訪問。
Linux使用弱主機模型:分配給任何介面的任何IP地址都屬於整個主機。當您從 10.0.0.2 到達 192.168.0.1 時,不涉及轉發,因為目標地址屬於主機:數據包由過濾器/輸入處理,而不是過濾器/轉發(因此不會對此數據包進行評估) . 可以在此處找到數據包行程的詳細示意圖。
這不是路由異常,因此不會觸發Strict Reverse Path Forwarding,無論是在路由堆棧中還是在iptables的rpfilter模組中設置。
因此,您還必須使用 IP 地址為此添加明確的規則。如果仍希望將其放入原始表中,則addrtype匹配甚至可以在那裡確定目標是否是本地的(或者也是廣播的)。您可以在 SRPF 測試後添加這些規則(如果將多個 IP 地址分配給主機,而不僅僅是 .1 的,這將起作用):
iptables -t raw -A PREROUTING -s 10.0.0.0/8 ! -d 10.0.0.0/8 -m addrtype --dst-type LOCAL,BROADCAST -j DROP iptables -t raw -A PREROUTING -s 192.168.0.0/16 ! -d 192.168.0.0/16 -m addrtype --dst-type LOCAL,BROADCAST -j DROP
我不知道iptables如何添加不包含與正在使用的特定地址相關的詳細資訊的通用規則。使用nftables是可能的:
# drop packets to address not configured on incoming interface filter prerouting fib daddr . iif type != { local, broadcast, multicast } drop