Linux 路由器 - 如何向 LAN 客户端发送 ICMP 不可达消息

Linux 路由器 - 如何向 LAN 客户端发送 ICMP 不可达消息

我有一个 Linux 家用路由器,带有 eth0(192.168.0.2/24)和用于 LAN 客户端的网桥 br0(192.168.1.1/24)。网桥 br0 包含 eth1(有线)和 eth2(无线)。

路由器将所有 LAN 流量通过 eth0(192.168.0.2)通过 SNAT 路由到 ADSL 路由器(192.168.0.1),然后从那里路由到 Internet。(目前我想知道我是否可以在没有 SNAT 的情况下做到这一点,但这不是目前的问题。)

我想知道 LAN 客户端如何获取无法访问主机的 icmp 消息。如果 LAN 客户端 ping 其自身子网中未使用的 IP(例如 192.168.1.123),我会看到目标主机无法访问的消息。如何获取不在 LAN 客户端子网内的其他无法访问地址的这些消息?在 Linux 路由器上,我是否应该将所有无法路由的未知网络添加为 iptables 规则,或者使用 iproute2 将它们添加为无法访问的地址?

例如,10.0.0.1 是一个我不使用的地址。如果我从局域网客户端到 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 地址。最佳做法是什么?

答案1

ICMP 不可达数据包是一种特殊的数据包;只有当路由器无法路由到该目的地时(如果路由器运行正常),它们才会被抛回您的系统;您还需要确保它们不会被过于热心的防火墙丢弃。

对于 10.0.0.1 的情况,ISP 可能不会过滤 RFC 1918 范围直到跳 3 - 但如果丢弃是由于 ACL 过滤器造成的,它就会丢弃数据包而不会发送无法到达的响应。

为了让您的 Linux 路由器丢弃数据包并抛出不可达信息,请添加一条reject路由:

route add -net 10.0.0.0 netmask 255.0.0.0 reject

您将需要使其持久化 - 您需要在哪里执行此操作取决于路由器的 Linux 版本。

相关内容