Я заметил странное поведение на одной из моих машин с Linux 4.8.0 (Debian Sid)

Мой интернет-провайдер отправляет 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 ответ1

0

Это соответствующие биты объявления маршрутизатора:

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: опция информации о маршруте игнорируется, префикс on-link учитывается, и вы получаете маршрут по ссылке. На другом компьютере какое-то программное обеспечение или другое, вероятно, изменяет значение sysconf - попробуйте это:

sysctl -a 2>&1 | grep rt_info_max_plen

Я не могу найти в RFC 4191 ничего о том, должен ли RIO переопределять PIO или нет, поэтому я предполагаю, что это поведение соответствует RFC. Я согласен с вами, что это неоптимально.

Весь трафик локальной подсети передается через маршрутизатор, что не очень оптимально.

Это не так уж плохо. Первый пакет каждому пункту назначения будет отправлен маршрутизатору, который отправит перенаправлению отправителю, что заставит его вставить промежуточный маршрут /128 к месту назначения и начать отправку пакетов непосредственно к месту назначения. Да, это надежный протокол.

Как я могу изменить мой конфиг, чтобы трафик в локальную подсеть не отправлялся через маршрутизатор?

Вы должны исправить свой маршрутизатор так, чтобы он не отправлял ложный RIO. В противном случае вы должны найти, какая часть программного обеспечения изменяет значение sysconf, упомянутого выше, и отключить его. Но я бы не стал сильно беспокоиться об этом - механизм перенаправления позаботится об этом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .