Linux IPv6 RA 路由信息 (24) 行为

Linux IPv6 RA 路由信息 (24) 行为

我注意到我的一台 Linux 4.8.0 (Debian Sid) 机器出现了奇怪的行为

我的 ISP 路由器正在发送以下 IPv6 RA:

        IP6 (hlim 255, next-header ICMPv6 (58) payload length: 128) fe80::5667:51ff:fee7:7cf > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 128
        hop limit 64, Flags [other stateful], pref high, router lifetime 180s, reachable time 0s, retrans time 0s
      prefix info option (3), length 32 (4): <prefix>::/64, Flags [onlink, auto], valid time 1138201s, pref. time 533401s
      route info option (24), length 24 (3):  <prefix>::/64, pref=medium, lifetime=1143629s
      rdnss option (25), length 40 (5):  lifetime 360s, addr: <dns1> addr: <dns2>
      mtu option (5), length 8 (1):  1500
      source link-address option (1), length 8 (1): 54:67:51:e7:07:cf

这产生以下路由表:

ip -6 r
<prefix>::/64 via fe80::5667:51ff:fee7:7cf dev eth0 proto ra metric 100  pref medium
fe80::5667:51ff:fee7:7cf dev eth0 proto static metric 100  pref medium
fe80::/64 dev eth0 proto kernel metric 256  pref medium
default via fe80::5667:51ff:fee7:7cf dev eth0 proto static metric 100  pref medium

第一个条目很奇怪。所有本地子网流量都通过路由器转发,这不是最理想的。此外,我还将 accept_ra_rt_info_max_plen 设置为 0。

在与 Linux 4.7.0(Debian Jessie)位于同一子网的另一台机器上,路由表看起来与预期一致:

<prefix>::/64 dev eth0  proto kernel  metric 256  expires 1136467sec                       
fe80::/64 dev eth0  proto kernel  metric 256               
default via fe80::5667:51ff:fee7:7cf dev eth0  proto ra  metric 1024  expires 120sec hoplimit 64

造成这种现象的原因是什么?如何修改配置,使流向本地子网的流量不通过路由器发送?

答案1

以下是路由器广告的相关内容:

prefix info option (3), length 32 (4): p/64, Flags [onlink, auto], valid time 1138201s, pref. time 533401s
route info option (24), length 24 (3): p/64, pref=medium, lifetime=1143629s

前缀信息选项 (PIO) 表示前缀p/64在链路上。路由信息选项 (RIO) 表示p/64可以通过路由器路由。

默认情况下,Linux 忽略 RIO:

$ sysctl -a 2>&1 | grep wlan0.accept_ra_rt_info_max_plen
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 0

因此,Debian Jessie 的行为是预期的:忽略路由信息选项,遵守链接前缀,然后您获得链接路由。在另一台机器上,某个软件或其他软件可能正在更改 sysconf 的值 — 尝试以下操作:

sysctl -a 2>&1 | grep rt_info_max_plen

我在 RFC 4191 中找不到任何关于 RIO 是否应覆盖 PIO 的内容,因此我认为该行为符合 RFC。我同意您的看法,认为它不是最优的。

所有本地子网流量都通过路由器转发,这不是很理想。

情况并没有那么糟糕。发往每个目的地的第一个数据包将被发送到路由器,路由器将向发送者发送重定向,这将导致其插入到目的地的临时 /128 路由,并开始直接向目的地发送数据包。是的,这是一个强大的协议。

我如何修改我的配置以便流向本地子网的流量不通过路由器发送?

您应该修复路由器,使其不再发送虚假的 RIO。如果做不到这一点,您应该找出哪个软件正在更改上述 sysconf 的值,然后禁用它。但我不会太担心——重定向机制可以很好地解决这个问题。

相关内容