Я заметил проблему с маршрутизацией 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
к интерфейсу. Если флаг не установлен, устройство не может знать, находятся ли другие адреса в префиксе на связи, и оно отправляет все эти пакеты на шлюз по умолчанию.
Конечно, ваше устройство всегда может выбрать (намеренно или из-за ошибки) игнорировать флаг включения и в любом случае отправлять все на шлюз по умолчанию.