如何将网络标记为无法访问?

Lin*_*ong 2 linux routing

我有一个运行 Linux 的路由器。它的网络配置有一个到我的 ISP 的默认路由,用于公共 Internet 访问。我现在需要阻止访问指定的目标网络。

原始路由表:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.16.6.254    0.0.0.0         UG    0      0        0 eth0.2
10.99.0.0       *               255.255.255.0   U     0      0        0 tap0
Run Code Online (Sandbox Code Playgroud)

假设74.1.1.0/24是我要禁止路由的网络。我希望连接到该路由器的每个客户端都能获得该网络中某个地址的“网络无法访问”。

有没有办法做到这一点?

pil*_*ona 7

使用iproute2。

ip route add unreachable 74.1.1.0/24
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您试图拒绝到该网络的出站流量,最好使用路由来拒绝该网络,而不是 netfilter。对于inbound,使用 netfilter 更惯用,就像这里的另一个答案一样,但是用--src代替--dst,最好使用 ICMP admin disabled ,或者只是 drop 。您可以使用 RPDB(请参阅ip-rule(8),以实现相同的效果,但可能看起来不合适。

不要使用包中的 ifconfig、route 或其他工具net-tools;他们早就被弃用了。

您可以确认路由器本身将使用什么作为路由决策。

$ ip route get 74.1.1.0/24
RTNETLINK answers: Network is unreachable
Run Code Online (Sandbox Code Playgroud)

请注意,“get”动词与“show”(或“list”)不同,因为它“计算”路由决策,而不仅仅是过滤和列出路由表中的条目。

网络一侧的主机将无法访问 ICMP 目标网络。

$ ping 74.1.1.1 -c 1
PING 74.1.1.1 (74.1.1.1) 56(84) bytes of data.
From 172.16.6.254 icmp_seq=1 Destination Net Unreachable

--- 74.1.1.1 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0.7ms
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

如果涉及的用户空间有缺陷并且挂起而不是立即返回错误,那就是另一个问题。内核无法弥补这种有缺陷的用户空间。