5

У меня есть настройки с двумя сетевыми интерфейсами: eth0 и tap0 , соединенные br0

bridge name     bridge id               STP enabled     interfaces
br0             8000.************       no              eth0
                                                        tap0

Ни eth0 ни tap0 имеют IP-адреса, кроме локального IPv6-адреса eth0 :

2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever
41: tap0: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc fq_codel master br0 state DOWN group default qlen 100
    link/ether YY:YY:YY:YY:YY:YY brd ff:ff:ff:ff:ff:ff

Мост, однако, имеет статический адрес IPv4 и настроенный без сохранения состояния адрес IPv6. Поскольку мне нужно, чтобы этот IPv6-адрес без состояния был настроен, если бы он был для eth0 , я настроил MAC для tap0 чтобы он был больше, чем для eth0 (таким образом, brctl выберет eth0 MAC в качестве br0 MAC). В результате IP-адрес, который назначает себе br0 , тот же, что eth0 выбрал бы без каких-либо других интерфейсов.

Обратите внимание, что расширения конфиденциальности отключены (на all а также на любых определенных интерфейсах).

Итак, br0 выглядит так:

42: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.X.Y/24 brd 192.168.X.255 scope global br0
        valid_lft forever preferred_lft forever
    inet6 ZZZZ:ZZZZ:ZZZZ:ZZZZ:ZZZZ:ZZZZ:ZZZZ:ZZZZ/64 scope global 
        valid_lft 7123sec preferred_lft 3523sec
    inet6 fe80::ZZZZ:ZZZZ:ZZZZ:ZZZZ/64 scope link 
       valid_lft forever preferred_lft forever

Таким образом, есть один публичный и один локальный IPv6-адрес, и публичный адрес совпадает с MAC (так как он выбирается без сохранения состояния). Когда я сейчас отправляю пакеты ICMPv6, я не получаю ответ:

PING google.com(2a00:1450:4001:80e::1008) 56 data bytes
^C
--- google.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

Однако при проверке с помощью tcpdump я вижу отправленные пакеты и ответы, поступающие между сервером и моим IP-адресом, т.е. я фактически вижу ответ в дампе пакетов, и он адресован IPv6-адресу br0 . Я попытался указать каждый интерфейс с ping6 -I <interface> без успеха.

Так что сейчас у меня нет идей: я отправляю пакеты, получаю ответ на правильный адрес, но система, похоже, отбрасывает его, а не принимает. Почему он отказывается от них? Это можно отладить?

Изменить: у меня есть маршруты IPv6, работает ip -6 route:

XXXX:XXX:XXXX:XXXX::/64 dev br0  proto kernel  metric 256  expires 6997sec
fe80::/64 dev br0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
default via fe80::XXX:XXXX:XXXX:XXXX dev br0  proto ra  metric 1024  expires 1597sec

Первая строка - это мой префикс, назначенный интернет-провайдером, как сообщается в моем маршрутизаторе (Fritz Box), и это кажется правильным, поскольку это должна быть моя локальная сеть (я прав?), Поэтому мне не нужен шлюз. Два других - это локальные адреса ссылок, так что опять хорошо.

Последний маршрут - это то, что должно быть интересным, верно? IP, который я там нахожу, похоже, соответствует моему роутеру. Я могу пропинговать его, но только если указать интерфейс, то есть, запустив ping6 <ip> получим:

connect: Invalid argument

Но ping6 -I br0 <ip> работает:

PING <ip>(<ip>) from <myip> br0: 56 data bytes
64 bytes from <ip> icmp_seq=1 ttl=64 time=0.534 ms
64 bytes from <ip> icmp_seq=2 ttl=64 time=0.393 ms
64 bytes from <ip> icmp_seq=3 ttl=64 time=0.350 ms
64 bytes from <ip> icmp_seq=4 ttl=64 time=0.369 ms
^C
--- <ip> ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.350/0.411/0.534/0.075 ms

Конечно, <ip> - это IP-адрес маршрутизатора, то есть адрес fe80::... сверху. Я не могу найти точку в конфигурации моего маршрутизатора, где он говорит мне этот адрес, однако я нахожу его уникальный локальный адрес (ULA), и он начинается с fd80:: но кроме того, он идентичен, поэтому я довольно уверен, что это мои маршрутизаторы Адрес IPv6.

Однако: я могу посмотреть IP-адреса моих маршрутизаторов, используя nslookup -query=AAAA fritz.box который выдает два ответа: ULA (fd00::...) и IPv6-адрес, назначенный провайдером в префиксе (2a02:...) с тем же суффиксом (я предполагаю, что он выбирает это, используя SLAAC с его MAC). Здесь не отображается IP-адрес, начинающийся с fe00:... который вводится в маршрут.

Может быть, у кого-то есть объяснение этому странному поведению ...

2 ответа2

1

Я не могу сказать, что мог бы отследить проблему до ее корней, но, по крайней мере, я нашел "взлом", чтобы заставить ее работать. Я должен был убедиться, что мой мост фактически взял MAC от моего интерфейса eth0 а не случайно назначенный tap0 MAC. Чтобы это произошло , вам нужно только убедиться, что ваш адрес tap0 больше, чем адрес eth0:

/usr/bin/openvpn --mktun --dev tap0
ip link set dev tap0 down
ip link set dev tap0 address 5a:c0:02:9e:ae:3c
ip link set dev tap0 up

Теперь при создании моста будет выбран MAC eth0 , который затем будет правильно настроен для SLAAC. Я не совсем понимаю, почему это работает таким образом, но теперь даже переадресация портов работает нормально, и все кажется в порядке.

Маршруты теперь, кажется, настроены правильно, так как я могу добраться до внешних и внутренних систем

0

Вы не забыли включить пересылку ipv6 в /etc/sysctl.conf?

Изменить линию

 #net.ipv6.conf.all.forwarding=1

в

 net.ipv6.conf.all.forwarding=1

что, однако, отключает автоматическую настройку без сохранения состояния.

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