Linux作为路由器:发送ICMPv4消息“网络不可达”和“主机不可达”

Linux作为路由器:发送ICMPv4消息“网络不可达”和“主机不可达”

我希望基于 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、a​​ddr-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

相关内容