Назад | Перейти на главную страницу

Некоторые хосты IPv6 отправляют весь трафик, даже в одной подсети, на маршрутизатор.

Я заметил проблему с маршрутизацией IPv6 в нашей локальной сети. Большинство клиентских компьютеров являются тонкими клиентами LTSP. Они получают один адрес через SLAAC. Tracepath6 к хостам в одной подсети показывает, что весь трафик прямой. Но ноутбук, над которым я работаю (Linux Mint 17, стандартный сетевой менеджер), дает себе два IPv6-адреса и устанавливает маршруты, которые все трафик сначала идет на маршрутизатор, включая трафик в той же подсети:

tracepath6 xxxx:1b0:5256:1337:10:50:0:8
 1?: [LOCALHOST]                        0.183ms pmtu 1500
 1:  xxxx:1b0:5256:1337:10:50:0:1                          1.217ms

Вопросы:

1) Почему некоторые хосты получают на один адрес, а некоторые - больше? Я видел это чаще.

2) Почему этот компьютер направляет весь трафик через маршрутизатор?

Маршрутизатор - это dnsmasq и действительно имеет только SLAAC:

Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: IPv6 router advertisement enabled
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.102.20.1 -- 10.102.20.254, lease time 12h
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.101.20.1 -- 10.101.20.254, lease time 12h
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.100.0.100 -- 10.100.0.254, lease time 12h
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.50.20.1 -- 10.50.20.254, lease time 12h
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: SLAAC on xxxx:1b0:5256:1337:: prefix valid 2h

Это мой eth0:

eth0      Link encap:Ethernet  HWaddr 18:67:b0:34:2d:dd
          inet addr:10.50.20.158  Bcast:10.50.255.255  Mask:255.255.0.0
          inet6 addr: fe80::1a67:b0ff:fe34:2ddd/64 Scope:Link
          inet6 addr: xxxx:1b0:5256:1337:2532:eb1a:1151:d2f0/64 Scope:Global
          inet6 addr: xxxx:1b0:5256:1337:1a67:b0ff:fe34:2ddd/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12094 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17250 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2848542 (2.8 MB)  TX bytes:3002689 (3.0 MB)

Это маршруты IPv4:

> route -n 
Kernel IP routing table Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.50.0.1       0.0.0.0         UG    0      0        0 eth0
10.50.0.0       0.0.0.0         255.255.0.0     U     1      0        0 eth0

Это маршруты IPv6:

Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
fe80::/64                      ::                         U    256 1     0 eth0
::/0                           fe80::213:3bff:fe0f:c02c   UG   1   0     0 eth0
::/0                           fe80::213:3bff:fe0f:c02c   UGDAe 1024 0     0 eth0
::/0                           ::                         !n   -1  1   261 lo
::1/128                        ::                         Un   0   3   243 lo
xxxx:1b0:5256:1337:1a67:b0ff:fe34:2ddd/128 ::                         Un   0   1     0 lo
xxxx:1b0:5256:1337:2532:eb1a:1151:d2f0/128 ::                         Un   0   1    86 lo
fe80::1a67:b0ff:fe34:2ddd/128  ::                         Un   0   1   178 lo
ff00::/8                       ::                         U    256 1     0 eth0
::/0                           ::                         !n   -1  1   261 lo

Следующая строка отсутствует на хостах, которые напрямую связываются с другими хостами:

::/0                           fe80::213:3bff:fe0f:c02c   UG   1   2     0 eth0

fe80::213:3bff:fe0f:c02c действительно, это локальный адрес маршрутизатора на стороне LAN.

Изменить: поведение, которое я видел, может быть случайным. Я несколько раз перезагружал один из тонких клиентов, и tracepath6 иногда показывает трафик, проходящий через маршрутизатор, иногда напрямую к хостам. Кажется, почти при каждой перезагрузке все по-другому. Таблица маршрутизации каждый раз остается неизменной, даже если я включаю / отключаю dnsmasq off-link вариант.

Edit2: IPv4 всегда имеет маршрут, в котором указано, что для вашей собственной подсети он должен, например, просто отправлять через eth0. Итак, когда я добавляю этот маршрут в IPv6, трафик больше не проходит через маршрутизатор:

/sbin/route -A inet6 add xxxx:1b0:5256:1337::/64 dev eth0

Итак, почему xxxx:1b0:5256:1337::/64 не включены по умолчанию (здесь ни на одной машине)? Разве не должен присутствовать маршрут, который сообщает ядру, что для текущей подсети просто отправляйте через Ethernet (или wlan, что угодно)?

Edit3: я просто посмотрел с помощью tcpdump + wirehark и увидел, что L Флаг On-Link не установлен в объявлении маршрутизатора, несмотря на то, что отключение не установлено:

dhcp-range=xxxx:1b0:5256:1337::, ra-only, inifite

По-видимому, DNSMasq не устанавливает on-link - это ошибка, исправленная в версии 2.63, слишком новая для Debian 7. В любом случае необходимо обновить до Debian 8, поэтому сделаем это сегодня.

Редактировать, обновление завершено. Строка конфигурации DNSmasq была изменена на:

dhcp-range=::,ra-only,constructor:eth1,infinite

Теперь добавлен маршрут для локальной подсети.

1) Почему некоторые хосты получают на один адрес, а некоторые - больше? Я видел это чаще.

Хосты IPv6 всегда получают локальный адрес канала. Остальные адреса зависят от комбинации флагов в RA и настроек хоста. RA может сигнализировать хосту, что сервер DHCPv6 может выдавать адреса, по которым хост может действовать. Если RA содержит префиксы, разрешающие автоконфигурацию, и хост не отключил автоконфигурацию, то используется SLAAC.

В исходных спецификациях говорилось, что идентификатор интерфейса (последние 64 бита адреса IPv6) строится из адреса канального уровня (обычно MAC-адреса). Но тогда можно было бы отслеживать устройства в Интернете. Представьте себе службу Google или Dropbox, к которой часто обращаются: к какой бы сети вы ни подключили свой ноутбук или мобильный телефон, подсеть изменится, но идентификатор интерфейса всегда будет одним и тем же. Поэтому в наши дни операционные системы предоставляют расширения конфиденциальности.

Расширения конфиденциальности позволяют регулярно менять идентификатор интерфейса. Точные таймеры зависят от реализации, но предположим, что они меняются каждый час. Каждый час ваше устройство настраивает для себя новый IPv6-адрес. Старые адреса устарели, и как только ваше программное обеспечение перестанет их использовать, они будут удалены. Таким образом вы можете получить несколько адресов.

Также: если RA содержит несколько префиксов с установленным флагом автоматической конфигурации, ваше устройство настроит адреса в каждом из них.

2) Почему этот компьютер направляет весь трафик через маршрутизатор?

Обычно это зависит от флага On-Link в префиксах в RA. Если установлен флаг подключения, устройство может создать маршрут для /64 к интерфейсу. Если флаг не установлен, устройство не может знать, находятся ли другие адреса в префиксе на связи, и оно отправляет все эти пакеты на шлюз по умолчанию.

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