我有一台运行 Linux 的路由器。它的网络配置中有一个到我的 ISP 的默认路由,用于公共互联网访问。我现在需要阻止访问指定的目标网络。
原始路由表:
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
假设 74.1.1.0/24 是我想要禁止路由的网络。我希望连接到此路由器的每个客户端都会收到该网络中某个地址的“网络不可达”信息。
有什么办法可以做到这一点吗?
答案1
使用 iproute2。
ip route add unreachable 74.1.1.0/24
在这种情况下,如果你想否认出站流量到该网络,最好使用路由来拒绝该网络,而不是使用 netfilter。对于入站,使用 netfilter 更符合习惯,就像这里的另一个答案一样,但要用--src
而不是--dst
,并且最好使用 ICMP admin banned,或者直接使用 drop。您可以使用 RPDB(请参阅ip-rule(8)
)来实现相同的效果,但可能看起来不合适。
不要使用 ifconfig、route 或net-tools
包中的其他工具;它们早已被弃用。
您可以确认路由器本身将使用什么作为路由决策。
$ ip route get 74.1.1.0/24
RTNETLINK answers: Network is unreachable
请注意,“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
如果所涉及的用户空间有缺陷并挂起而不是立即返回错误,那就是另一个问题。内核无法弥补这种有缺陷的用户空间。
答案2
您可以使用 netfilter
iptables -A FORWARD --dst 74.1.1.0/24 -j REJECT --reject-with icmp-net-unreachable
man iptables
--reject-with
关于该选项,有以下说法
--reject-with type
The type given can be icmp-net-unreachable, icmp-host-unreachable,
icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited,
icmp-host-prohibited or icmp-admin-prohibited (*) which return the
appropriate ICMP error message (port-unreachable is the default). The
option tcp-reset can be used on rules which only match the TCP protocol:
this causes a TCP RST packet to be sent back. This is mainly useful for
blocking ident (113/tcp) probes which frequently occur when sending mail to
broken mail hosts (which won't accept your mail otherwise)
答案3
添加指向该子网的路由lo
:
route add -net 74.1.1.0/24 gw 127.0.0.1 lo
该ip
命令有一个blackhole
我刚刚发现的参数:
ip route add blackhole 74.1.1.0/24
阅读更多。
看起来有一个reject
选项 - 看看它是否能满足你的需要:
route add -net 74.1.1.0/24 reject
答案4
REJECT=敲门,你就大叫走开!。
DROP = 敲门,你静静地坐着,然后访客离开,:theory?..:P
取决于你想要实现什么,我的意见是
REJECT 表示尝试继续对话直至 ACCEPT 达成,DROP 则不表示任何意思,因此将结束任何对话,:up2you:)。