Добавление целого блока IPv6 / 64 в сетевой интерфейс Debian

15

Я попытался добавить целый блок IPv6 (/ 64) к интерфейсу, используя

ip route add local 2001:41d0:2:ad64::/64 dev lo

как описано здесь на моем сервере Debian, но мне кажется, что-то упущено.

Если я пингуюсь, например, 2001:41d0:2:ad64::feлокально, все работает просто отлично, но если я пытаюсь с удаленной машины, это не работает. Затем я попытался добавить маршрут на eth0:

ip route add local 2001::41d0:2:ad64::/64 dev eth0

Теперь я не мог даже пинговать любой примерный адрес локально!

Я немного растерялся, потому что, кажется, что-то упустил, но не могу найти здесь ответ.

Для краткости: я хочу 2001:41d0:2:ad64::/64быть привязанным к eth0, чтобы каждый IP-адрес, содержащийся в этом блоке, был доступен через Интернет на моей машине.

Я надеюсь, что кто-то там может указать мне правильный путь. Заранее спасибо.

Руководство предоставляется провайдер требует , чтобы я добавить каждый IPv6 к интерфейсу Явно. Я хочу, чтобы это сказалось.

Рабочая конфигурация с привязкой явного IP-адреса

/ и т.д. / сеть / интерфейсы:

auto eth0
iface eth0 inet static
        address my.ip.v4
        netmask 255.255.255.0
        network my.network.address.ip
        broadcast my.broadcast.address.ip
        gateway my.gateway.ip

iface eth0 inet6 static
        address 2001:41d0:2:ad64::fe
        netmask 64
        gateway 2001:41d0:2:adff:ff:ff:ff:ff
        up ip addr add 2001:41d0:2:ad64::1/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::1/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::2/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::2/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::3/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::3/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::4/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::4/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::5/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::5/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::6/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::6/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::7/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::7/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::8/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::8/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::9/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::9/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::a/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::a/64 dev eth0

Решение попробовать # 1

Я попытался включить локальный маршрут, как предложил @kasperd.

Содержимое моего / etc / network / interfaces

auto lo
iface lo inet loopback
    post-up ip route add local 2001:41d0:2:ad64::/64 dev lo
    pre-down ip route del local 2001:41d0:2:ad64::/64 dev lo

auto eth0
iface eth0 inet static
        # <snip of ipv4 config>

iface eth0 inet6 static
        address 2001:41d0:2:ad64::fe
        netmask 64
        gateway 2001:41d0:2:adff:ff:ff:ff:ff

Таблица локальной маршрутизации:

# ip -6 route show table local
local ::1 dev lo  proto none  metric 0
local 2001:41d0:2:ad64::fe dev lo  proto none  metric 0
local 2001:41d0:2:ad64::/64 dev lo  metric 1024
local fe80::225:90ff:fe06:6bbe dev lo  proto none  metric 0
ff00::/8 dev eth0  metric 256

Выход traceroute(мой локальный домашний ПК):

  1    <1 ms    <1 ms    <1 ms  fritz.box [xxx]

  2    20 ms    21 ms    24 ms  2002:c058:6301::1
  3    21 ms    22 ms    24 ms  10gigabitethernet6.switch2.fra1.he.net [2001:470
:0:150::1]
  4    44 ms    31 ms    40 ms  100ge3-1.core1.ams1.he.net [2001:470:0:2d4::1]
  5     *        *        *     Zeitüberschreitung der Anforderung.
  6     *        *       35 ms  ams-5-6k.nl.eu [2001:41d0::8d1]
  7    37 ms    39 ms    36 ms  rbx-g2-a9.fr.eu [2001:41d0::ab1]
  8    37 ms    70 ms    36 ms  chi-3-4m.il.us [2001:41d0::176]
  9  Zielhost nicht erreichbar.

Ablaufverfolgung beendet.

traceroute6 на сервере:

traceroute to 2001:41d0:2:ad64::23 (2001:41d0:2:ad64::23), 30 hops max, 80 byte packets
 1  2001:41d0:2:ad64::a (2001:41d0:2:ad64::a)  0.028 ms  0.009 ms  0.008 ms

ping6 на сервере:

PING 2001:41d0:2:ad64::23(2001:41d0:2:ad64::23) 56 data bytes
64 bytes from 2001:41d0:2:ad64::23: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 2001:41d0:2:ad64::23: icmp_seq=2 ttl=64 time=0.057 ms
^C
--- 2001:41d0:2:ad64:23 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.029/0.043/0.057/0.014 ms

tcpdump вывод (при пинге и трассировке на удаленном сервере):

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

tracert к воротам:

Routenverfolgung zu vss-3-6k.fr.eu [2001:41d0:2:adff:ff:ff:ff:ff] über maximal 3
0 Abschnitte:

  1    <1 ms    <1 ms    <1 ms  fritz.box [2002:5476:1b4c:0:c225:6ff:fe40:b2b0]

  2    23 ms    22 ms    26 ms  2002:c058:6301::1
  3    24 ms    40 ms    23 ms  10gigabitethernet6.switch2.fra1.he.net [2001:470
:0:150::1]
  4    28 ms    37 ms    39 ms  100ge3-1.core1.ams1.he.net [2001:470:0:2d4::1]
  5     *        *        *     Zeitüberschreitung der Anforderung.
  6    38 ms    33 ms     *     ams-5-6k.nl.eu [2001:41d0::8d1]
  7    36 ms    39 ms    38 ms  rbx-g2-a9.fr.eu [2001:41d0::ab1]
  8    36 ms    35 ms    35 ms  vss-3-6k.fr.eu [2001:41d0:2:adff:ff:ff:ff:ff]

Ablaufverfolgung beendet.

ping к воротам:

Ping wird ausgeführt für 2001:41d0:2:adff:ff:ff:ff:ff mit 32 Bytes Daten:
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=36ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=34ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=38ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=57ms

Ping-Statistik für 2001:41d0:2:adff:ff:ff:ff:ff:
    Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
    (0% Verlust),
Ca. Zeitangaben in Millisek.:
    Minimum = 34ms, Maximum = 57ms, Mittelwert = 41ms

Так что он все еще работает локально (сервер), но не удаленно (мой компьютер).

Hikaru-Синдо
источник
Итак, вы пробовали трассировку с удаленного компьютера? Где трассировка не удалась?
Zoredache
Если все хосты находятся в одной сети, у вас не должно быть никакого маршрута.
Спек
У вашей второй ip routeкоманды есть опечатка в адресе IPv6.
Майкл Хэмптон
@Spack Я хочу, чтобы eth0 прослушивал весь префикс ipv6 / 64 (входящий трафик), @ michael-hampton исправлен, это было как раз при наборе этого вопроса, @Zoredache. Сбой на шлюзе ISPs, 2001:41d0:2:adff:ff:ff:ff:ffпосле чего он просто отключается.
Хикару-Синдо
Из исследований, которые я провел в прошлом, это невозможно. Причина, по которой он работает локально, заключается в том, что ваша таблица маршрутизации знает, куда направлять пакеты. Если вы добавите этот префикс в качестве статического маршрута в свой пограничный маршрутизатор, вы увидите, что клиенты LAN могут подключаться.
Натан C

Ответы:

13

Мне нужно что-то подобное в прошлом. Я обнаружил, что для этого нужно выполнить три шага:

  • Вам необходимо направить префикс на хост
  • Вам нужен локальный маршрут на хосте
  • Приложения должны установить опцию IP_FREEBINDили IP_TRANSPARENTна сокеты

Правильный способ получения префикса, маршрутизируемого на хост, заключается в том, чтобы связаться с вашим провайдером, если он еще не предоставил вам его. У них может быть сервер DHCPv6, который может делегировать вам префикс, если вы просто отправите ему правильный запрос DHCPv6.

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

Использование такого демона не рекомендуется, кроме как в крайнем случае, так как он будет излишне потреблять память от всех ваших соседей. Существует несколько реализаций такого демона, который выглядит многообещающим - ndppd . (У меня нет особого опыта в этом, так как я узнал об этом только после того, как написал свой собственный с префиксом ссылки.)

Похоже, у вас уже работает местный маршрут. Как вы заметили, для работы он должен быть назначен loинтерфейсу.

Наконец, приложения, использующие адреса из этого диапазона, нуждаются в параметре IP, чтобы иметь возможность привязываться к адресам, которые явно не назначены конкретному сетевому интерфейсу на хосте. Вот фрагмент кода, который можно использовать:

const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));
kasperd
источник
У меня есть статический префикс, перенаправленный на мой сервер интернет-провайдером (они не предоставляют DHCP. Ни для IPv4, ни для IPv6). Я хочу, чтобы все IPv6 в этом / 64 блоке были доступны извне (большинство моих приложений привязаны к ::, которые должны быть всеми доступными адресами, если я не ошибаюсь). Теперь я хочу, чтобы все эти IP-адреса были доступны на eth0, поэтому, если я попытаюсь подключиться к любому IPv6 в этом блоке, любое приложение, прослушивающее указанный порт, сможет ответить (например, каждый IP-адрес должен правильно отвечать на команду ping).
Хикару-Синдо
Если вы связываетесь с :: опция IP_TRANSPARENT не нужна. С префиксом, направленным на мой сервер и локальным маршрутом, я могу связываться с :: и получать соединения, сделанные с произвольными адресами IPv6 в этом диапазоне. ping6 тоже работает. Я тестирую это на Ubuntu 12.04, но я ожидаю, что он будет работать на любом недавнем ядре и на других дистрибутивах. Если это не работает для вас, я предлагаю вам взглянуть на сетевой трафик, используяtcpdump -pni eth0 'host 2001:41d0:2:ad65::fe'
kasperd
Это все еще не работает. В своем вопросе я предоставил немного больше информации о конфигурации, возможно, это поможет.
Хикару-Синдо
Вы говорите, что у вас / 64 маршрутизируется на сервер. Но примеры, приведенные в руководстве провайдера хостинга, имеют только префикс ссылки и не имеют префикс маршрутизации. А выходные данные tcpdump и traceroute6 выглядят так, как будто адреса не маршрутизируются на сервер. Удалось ли вам получить один IPv6-адрес, работающий с использованием документации провайдера?
kasperd
1
@ Арья Когда я нуждался в такой вещи, я вводил команду/etc/rc.local
kasperd
2

Сейчас 2019 год. Одно слово: ip_nonlocal_bind (начиная с ядра 4.3, как я знаю).

Используйте ndppd + sysctl net.ipv6.ip_nonlocal_bind = 1, последний позволяет привязывать к любому IPv6-адресу (в этом случае IP_FREEBIND не требуется).

Думаю, ты сделал так:

ip add add local 2001::41d0:2:ad64::/64 dev lo
ip route add local 2001::41d0:2:ad64::/64 dev eth0
sysctl  net.ipv6.ip_nonlocal_bind = 1

ndppd.conf будет выглядеть так:

route-ttl 30000

proxy eth0 {

   router no

   timeout 500
   ttl 30000
   rule 2001::41d0:2:ad64::/64{
       static
   }
}

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

Александр Гнатына
источник