我希望基于 GNU/Linux 的路由器至少发送这些 ICMPv4 消息:net unreachable
, host unreachable
。尤其是主机不可达消息对我来说很重要:如果路由器与目标主机位于同一网络中,但无法解析 IP,这意味着它无法到达主机本身,那么路由器应该发送主机不可达消息。
目前,我必须制定iptables
规则。但我想按照定义发送这些消息RFC,自动表示:如果根据网关路由表中的信息,数据报的互联网目的地字段中指定的网络不可达,例如,到该网络的距离无限远,则网关可以向该数据报的互联网源主机发送目的地不可达消息。数据报。此外,在某些网络中,网关可能能够确定互联网目标主机是否不可到达。当目标主机不可达时,这些网络中的网关可能会向源主机发送目标不可达消息。顺便说一下,没有涉及路由协议。基本上,每个路由器都是最多三个子网的网关。
我需要做什么?
答案1
好吧,你继续编辑你的问题并改变范围。虽然我不确定你的意思:
如果路由器与目标主机位于同一网络中,但无法解析 IP,这意味着它无法到达主机本身,则路由器应发送主机不可达消息。
我有预感。如果路由器位于同一网段,则可能可以根据定义到达目的地。您所说的“无法解析IP”是什么意思也不清楚。
但是,如果目标主机已关闭,路由器将采取以下行为确切地按照您描述的方式,按照标准。所以我不确定你想要什么与标准行为不同......
上层软件如何根据路由器的响应采取行动是另一个故事。但根据标准,您应该得到您似乎要求的行为。
原答案
如果你想解决这个问题iptables
(我根本不确定你的问题),那么你必须设置一个空路由(还黑洞路线)。不过,您可能需要前者,因为它将返回所需的 ICMP 消息。
技巧iptables
是使用允许的值之一:
... -j REJECT --reject-with ...
引用如何:
REJECT
This module has the same effect as `DROP', except that the
sender is sent an ICMP `port unreachable' error message. Note
that the ICMP error message is not sent if (see RFC 1122):
o The packet being filtered was an ICMP error message in the
first place, or some unknown ICMP type.
o The packet being filtered was a non-head fragment.
o We've sent too many ICMP error messages to that destination
recently (see /proc/sys/net/ipv4/icmp_ratelimit).
REJECT also takes a `--reject-with' optional argument which
alters the reply packet used: see the manual page.
因此在手册页我们得到(搜索“REJECT(IPv6 特定)”和“REJECT(IPv4 特定)”):
- IPv6:icmp6-no-route、no-route、icmp6-adm-prohibited、adm-prohibited、icmp6-addr-unreachable、addr-unreach、icmp6-port-unreachable 或 port-unreach(或 tcp-reset)
- IPv4:icmp-net-unreachable、icmp-host-unreachable、icmp-port-unreachable、icmp-proto-unreachable、icmp-net-prohibited、icmp-host-prohibited 或 icmp-admin-prohibited(或 tcp-reset)
对于 IPv4,您根据您的问题分别寻找icmp-net-unreachable
和。icmp-host-unreachable