Linux

Linux 路由器 - 如何向 LAN 客戶端發送 icmp 不可達消息

  • September 4, 2011

我有一個帶有 eth0 (192.168.0.2/24) 的 Linux 家用路由器和用於 LAN 客戶端 (192.168.1.1/24) 的橋接 br0。網橋 br0 包含 eth1(有線)和 eth2(無線)。

路由器通過 eth0 (192.168.0.2) 將所有 LAN 流量通過 SNAT 路由到 ADSL 路由器 (192.168.0.1),然後從那裡到 Internet。(目前我想知道我是否可以在沒有 SNAT 的情況下做到這一點,但這不是現在的問題。)

我想知道 LAN 客戶端如何獲取無法訪問的主機的 icmp 消息。如果 LAN 客戶端在其自己的子網中 ping 一個未使用的 IP(例如 192.168.1.123),我會看到目標主機無法訪問的消息。如何獲取不在 LAN 客戶端子網內的其他無法訪問的地址的這些消息?我應該將所有無法路由的未知網路添加為 iptables 規則,還是將它們與 iproute2 一起添加為無法到達的地址,在 linux 路由器上?

例如,10.0.0.1 是我不使用的地址。如果我從 lan 客戶端到 10.0.0.1 進行跟踪路由,我會看到這些數據包這樣傳輸:

# 跟踪路由 10.0.0.1
跟踪路由到 10.0.0.1 (10.0.0.1),最大 30 跳,52 字節數據包
1 linuxrouter (192.168.1.1) 0.247 毫秒 0.143 毫秒 0.126 毫秒
2 個 adslrouter (192.168.0.1) 0.526 毫秒 0.526 毫秒 0.322 毫秒
3 isp.hop1 (194.109.wx) 33.250 毫秒 33.376 毫秒 33.337 毫秒
4 isp.hop2 (194.109.yz) 61.811 毫秒!N 32.700 毫秒!N 32.639 毫秒!N

(我不知道為什麼我的 isp 的第一跳轉發這些)

而不是這個,我寧願讓 linux 路由器拒絕任何 rfc1918 地址。最佳實踐是什麼?

ICMP Unreachable 數據包是一個特殊的品種;如果路由器的行為正確,它們只會在路由器無法路由到該目的地時被扔回您的系統;您還需要確保它們不會被過分熱心的防火牆丟棄。

在 10.0.0.1 的情況下,ISP 可能直到第 3 跳才過濾 RFC 1918 範圍 - 但如果丟棄是由於 ACL 過濾器,它只會丟棄數據包而不發送 Unreachable 響應。

要讓您的 linux 路由器丟棄數據包並拋出無法訪問的數據包,請添加一個reject路由:

route add -net 10.0.0.0 netmask 255.0.0.0 reject

你會想讓這個持久化——你需要在哪裡做這取決於你的路由器的linux風格。

引用自:https://serverfault.com/questions/308062