我有一个Linux家庭路由器eth0(192.168.0.2/24)和网桥br0 LAN客户端(192.168.1.1/24)。 桥br0包含eth1(有线)和eth2(无线)。
路由器将通过eth0(192.168.0.2)的所有LANstream量路由到通过SNAT的ADSL路由器(192.168.0.1),并从那里到Internet。 (目前我想知道如果没有SNAT,我可以做到这一点,但现在不是这个问题。)
我想知道如何局域网客户端可以得到ICMP消息不可达主机。 如果LAN客户端在其自己的子网(例如192.168.1.123)中ping一个未使用的IP,则看到目标主机不可达消息。 我怎样才能得到那些不在LAN客户端子网内的其他不可达地址的消息? 我应该添加所有的unroutable,未知的networking作为iptables规则,或者可能添加它们与iproute2作为不可达地址,在Linux路由器上?
例如,10.0.0.1是我不使用的地址。 如果我从一个lan客户端到10.0.0.1做traceroute,我看到这些数据包是这样传递的:
#traceroute 10.0.0.1 跟踪路由到10.0.0.1(10.0.0.1),最多30跳,52字节的数据包 1 linuxrouter(192.168.1.1)0.247ms 0.143ms 0.126ms 2 adslrouter(192.168.0.1)0.526 ms 0.526 ms 0.322 ms 3 isp.hop1(194.109.wx)33.250 ms 33.376 ms 33.337 ms 4 isp.hop2(194.109.yz)61.811 ms!N 32.700 ms!N 32.639 ms!N
(我不知道为什么我的isp的第一跳转发这些)
相反,我宁愿让Linux路由器拒绝任何rfc1918地址。 什么是最佳实践?
ICMP无法访问的数据包是一个特殊的品种; 如果路由器无法路由到目的地,路由器的行为是正确的,他们只会被抛回到你的系统。 你还需要确保它们不会被过度的防火墙所丢弃。
在10.0.0.1的情况下,ISP可能不会过滤RFC 1918范围,直到第3跳 – 但是如果丢弃是由于ACLfilter引起的,则只会丢弃数据包而不发送Unreachable响应。
为了让你的linux路由器丢弃数据包并丢弃不可用的数据,添加一个reject路由:
route add -net 10.0.0.0 netmask 255.0.0.0 reject
你会想让这个持久化 – 你需要做的这取决于你的路由器的linux的味道。