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