2

Я использую домашнюю сеть с двумя стеками (IPv4 и IPv6) и несколькими VLAN для отделения устройств IoT (VLAN 20) от обычных пользователей (VLAN 10) от сетевого оборудования (VLAN без тегов). В настоящее время я размещаю локальный DNS (и несколько других сервисов) на Raspberry Pi 3 B+ (работающем с raspbian), который обычно живет в нетегированной VLAN, но я хотел бы попробовать дать ему адреса в других 2 VLAN (10 и 20) в качестве эксперимента (упрощение правил межсетевого экрана, снижение нагрузки на маршрутизатор и т. д.). Моя первая попытка этого не удалась, поэтому я попытался упростить вещи и просто поместить их в без тегов VLAN плюс VLAN 10, но это также не удалось, и я не могу понять, почему.

Настройка одного адреса

Вот обычная настройка (только адрес в нетегированной VLAN, ничего в VLAN 10 или 20):

/etc/network/interfaces пуст.

Вот /etc/dhcpcd.conf:

hostname
clientid
persistent
option rapid_commit
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
option ntp_servers
option interface_mtu
require dhcp_server_identifier
slaac private

interface eth0
static ip_address=192.168.1.10/24
static ip6_address=fd:<STATIC_IPv6_ULA>/64
static routers=192.168.1.1 fd:<STATIC_IPv6_ULA_FOR_ROUTER>
static domain_name_servers=127.0.0.1 ::1

И вот результирующие адреса, которые я получаю:

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether <MAC_ADDR> brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd:<IPv6_ULA_FROM_SLAAC>/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 85965sec preferred_lft 13965sec
    inet6 <IPv6_GLOBAL_ADDR_FROM_SLAAC>/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 85965sec preferred_lft 13965sec
    inet6 fd:<STATIC_IPv6_ULA>/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::<IPv6_LLA>/64 scope link
       valid_lft forever preferred_lft forever

Это работает нормально, я могу маршрутизировать к хостам в VLAN 10 и 20 через маршрутизатор. Проблема возникает при попытке добавить интерфейс в одну из VLAN ...

Добавление VLAN

Чтобы добавить адрес в VLAN 10, я добавил следующую конфигурацию поверх конфигурации в настройке с одним адресом:

Вот /etc/network/interfaces:

auto eth0.10

iface eth0.10 inet manual
  vlan-raw-device eth0

iface eth0.10 inet6 manual
  vlan-raw-device eth0

Вот /etc/dhcpcd.conf:

interface eth0.10
static ip_address=10.0.10.10/24
static ip6_address=fd:<STATIC_IPv6_VLAN_10_ULA>/64
static routers=10.0.10.1 <STATIC_IPv6_VLAN_10_ULA_FOR_ROUTER>
static domain_name_servers=127.0.0.1 ::1

И вот результирующие адреса, которые я получаю:

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether <MAC_ADDR> brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd:<STATIC_IPv6_ULA>/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
3: eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether <MAC_ADDR> brd ff:ff:ff:ff:ff:ff
    inet 10.0.10.10/24 brd 10.0.10.255 scope global eth0.10
       valid_lft forever preferred_lft forever
    inet6 fd:<IPv6_VLAN_10_ULA_FROM_SLAAC>/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 86377sec preferred_lft 14377sec
    inet6 <IPv6_GLOBAL_ADDR_FROM_SLAAC>/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 86377sec preferred_lft 14377sec
    inet6 fd:<STATIC_IPv6_VLAN_10_ULA>/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::<IPv6_LLA>/64 scope link
       valid_lft forever preferred_lft forever

Это было очень странно, я потерял свой глобальный IPv6-адрес в нетегированной VLAN, а также локальный адрес канала (LLA) и ULA, которые я получаю от SLAAC. Я попробовал несколько пингов, чтобы увидеть, что сработало, и вот что я нашел:

$ ping -4 -I eth0 www.google.com
<SUCCESS>
$ ping -4 -I eth0.10 www.google.com
<SUCCESS>
$ ping -6 -I eth0 www.google.com
connect: Network is unreachable
$ ping -6 -I eth0.10 www.google.com
<SUCCESS>

Итак, IPv4 работал нормально на обеих VLAN, но IPv6 был сломан на немаркированной VLAN. Я посмотрел в syslog все сообщения, связанные с dhcpcd , и нашел их:

00:28:23 HOSTNAME systemd[1]: Starting dhcpcd on all interfaces...
00:28:23 HOSTNAME dhcpcd[340]: dev: loaded udev
00:28:23 HOSTNAME dhcpcd[340]: eth0: waiting for carrier
00:28:23 HOSTNAME dhcpcd[340]: eth0.10: waiting for carrier
00:28:24 HOSTNAME dhcpcd[340]: eth0: carrier acquired
00:28:24 HOSTNAME dhcpcd[340]: DUID <DUID>
00:28:24 HOSTNAME dhcpcd[340]: eth0: IAID <IAID>
00:28:24 HOSTNAME dhcpcd[340]: eth0: IAID conflicts with one assigned to eth0.10
00:28:24 HOSTNAME dhcpcd[340]: eth0: adding address fe80::<IPv6_LLA>
00:28:24 HOSTNAME dhcpcd[340]: eth0: adding address fd:<STATIC_IPv6_ULA>/64
00:28:24 HOSTNAME dhcpcd[340]: eth0: adding route to fd:<STATIC_IPv6_ULA_PREFIX>/64
00:28:24 HOSTNAME dhcpcd[340]: eth0: probing address 192.168.1.10/24
00:28:24 HOSTNAME dhcpcd[340]: eth0.10: carrier acquired
00:28:24 HOSTNAME dhcpcd[340]: eth0.10: IAID <IAID>
00:28:24 HOSTNAME dhcpcd[340]: eth0.10: IAID conflicts with one assigned to eth0
00:28:24 HOSTNAME dhcpcd[340]: eth0: deleting address fe80::<IPv6_LLA>
00:28:24 HOSTNAME dhcpcd[340]: eth0.10: adding address fe80::<IPv6_LLA>
00:28:24 HOSTNAME dhcpcd[340]: eth0.10: adding address fd:<STATIC_IPv6_VLAN_10_ULA>/64
00:28:24 HOSTNAME dhcpcd[340]: eth0.10: adding route to fd:<STATIC_IPv6_ULA_VLAN_10_PREFIX>/64
00:28:24 HOSTNAME dhcpcd[340]: eth0.10: probing address 10.0.10.10/24
00:28:24 HOSTNAME dhcpcd[340]: eth0: soliciting an IPv6 router
00:28:25 HOSTNAME dhcpcd[340]: eth0.10: soliciting an IPv6 router
00:28:29 HOSTNAME dhcpcd[340]: eth0.10: using static address 10.0.10.10/24
00:28:29 HOSTNAME dhcpcd[340]: eth0.10: adding route to 10.0.10.0/24
00:28:29 HOSTNAME dhcpcd[340]: eth0.10: adding default route via 10.0.10.1
00:28:29 HOSTNAME dhcpcd[340]: forked to background, child pid 603
00:28:29 HOSTNAME systemd[1]: Started dhcpcd on all interfaces.
00:28:30 HOSTNAME dhcpcd[603]: eth0: using static address 192.168.1.10/24
00:28:30 HOSTNAME dhcpcd[603]: eth0: adding route to 192.168.1.0/24
00:28:30 HOSTNAME dhcpcd[603]: eth0: adding default route via 192.168.1.1
00:28:30 HOSTNAME dhcpcd[603]: eth0.10: Router Advertisement from fe80::<IPv6_LLA_OF_ROUTER>
00:28:30 HOSTNAME dhcpcd[603]: eth0.10: adding address <IPv6_GLOBAL_ADDR_FROM_SLAAC>/64
00:28:30 HOSTNAME dhcpcd[603]: eth0.10: adding address <IPv6_VLAN_10_ULA_FROM_SLAAC>/64
00:28:30 HOSTNAME dhcpcd[603]: eth0.10: adding route to <IPv6_GLOBAL_PREFIX_FROM_SLAAC>/64
00:28:30 HOSTNAME dhcpcd[603]: eth0.10: adding default route via fe80::<IPv6_LLA_OF_ROUTER>
00:29:17 HOSTNAME dhcpcd[603]: eth0.10: fe80::<IPv6_LLA_OF_ROUTER> is unreachable, expiring it
00:30:08 HOSTNAME dhcpcd[603]: eth0.10: fe80::<IPv6_LLA_OF_ROUTER> is reachable again

Таким образом, кажется, есть проблема, которая приводит к удалению LLA в нетегированной VLAN, что не позволяет ему видеть рекламу маршрутизатора на этом интерфейсе.

Я предполагаю, что эта настройка должна быть возможной (несколько VLAN на NIC, работающие с IPv6). Любые идеи о том, что вызывает эту проблему? Это просто глупость для меня?

В случае, если это полезно, вот версия ядра raspbian, работающая на Raspberry Pi:

$ uname -a
Linux HOSTNAME 4.14.70-v7+ #1144 SMP Tue Sep 18 17:34:46 BST 2018 armv7l GNU/Linux

1 ответ1

0

Спасибо за отзыв @grawity! Проблема была просто в том, что dhcpcd устарел. Как @grawity упомянул в комментариях выше, dhcpcd только добавил поддержку автоматических IAID на тегированных интерфейсах VLAN в версии 7.0.0. Вот версия на моей системе raspbian, использующая установку по умолчанию из apt:

$ sudo dhcpcd --version
dhcpcd 6.11.5
Copyright (c) 2006-2016 Roy Marples
Compiled in features: INET IPv4LL INET6 DHCPv6 AUTH

Если это кому-нибудь поможет, вот шаги, которые я предпринял, чтобы установить последнюю версию (7.0.8) из исходного кода:

Проверьте https://github.com/rsmarples/dhcpcd/releases для последней версии dhcpcd .

wget https://github.com/rsmarples/dhcpcd/archive/dhcpcd-7.0.8.tar.gz
tar xzf dhcpcd-7.0.8.tar.gz
cd dhcpcd-dhcpcd-7.0.8
./configure --libexecdir=/lib/dhcpcd --dbdir=/var/lib/dhcpcd5
make
sudo make install

Обратите внимание, что я установил dbdir в /var/lib/dhcpcd5 , хотя эти инструкции обычно рекомендуют использовать /var/lib/dhcpcd . В моей системе /var/lib/dhcpcd5 уже использовалась существующей установкой dhcpcd , а /var/lib/dhcpcd не существовало. Делай все, что имеет для тебя смысл.

Теперь, когда это сделано:

$ sudo dhcpcd --version
dhcpcd 7.0.8
Copyright (c) 2006-2018 Roy Marples
Compiled in features: INET ARP ARPing IPv4LL INET6 DHCPv6 AUTH

И теперь все работает отлично с добавленным интерфейсом VLAN 10 (и это также работает, когда я добавляю в интерфейс VLAN 20). Вот как все выглядит с добавленным интерфейсом VLAN 10:

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether <MAC_ADDR> brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fd:<IPv6_ULA_FROM_SLAAC>/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 86382sec preferred_lft 14382sec
    inet6 <IPv6_GLOBAL_ADDR_FROM_SLAAC>/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 86382sec preferred_lft 14382sec
    inet6 fd:<STATIC_IPv6_ULA>/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::<IPv6_LLA>/64 scope link
       valid_lft forever preferred_lft forever
3: eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether <MAC_ADDR> brd ff:ff:ff:ff:ff:ff
    inet 10.0.10.10/24 brd 10.0.10.255 scope global noprefixroute eth0.10
       valid_lft forever preferred_lft forever
    inet6 fd:<IPv6_VLAN_10_ULA_FROM_SLAAC>/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 86381sec preferred_lft 14381sec
    inet6 <IPv6_VLAN_10_GLOBAL_ADDR_FROM_SLAAC>/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 86381sec preferred_lft 14381sec
    inet6 fd:<STATIC_IPv6_VLAN_10_ULA>/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::<IPv6_LLA_2>/64 scope link
       valid_lft forever preferred_lft forever

Интересно, что LLA для каждого интерфейса уникален. Похоже, что он получен из IAID, который, как я вижу из syslog теперь уникален для каждого интерфейса. Для eth0 мой IAID получен из моего MAC-адреса, но для интерфейса VLAN 10 IAID просто ff:00:00:0a . Для интерфейса VLAN 20 это ff:00:00:14 . Таким образом, может показаться, что IAID это просто ff::VLAN_NUMBER , что приводит к уникальным LLA на каждом интерфейсе. Как бы то ни было, это скорее любопытство, чем реальная проблема ...

Несмотря на это, все интерфейсы настроены правильно, и все они могут достигать узлов внутренней сети, а также внешних узлов Интернета. Еще раз спасибо @ Grawity!

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