Додавання цілого блоку 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-адреси explict

/ і т.д. / мережа / інтерфейси:

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 / мережі / інтерфейсів

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

Так що це все ще працює лише локально (сервер), але не віддалено (мій ПК).


Отже, ви спробували traceroute з віддаленої машини? Де пропадає слід?
Зоредаче

Якщо всі хости знаходяться в одній мережі, у вас не повинно було бути маршруту.
Spack

У вашій другій ip routeкоманді написано помилку на адресу IPv6.
Майкл Хемптон

@Spack Я хочу, щоб eth0 прослуховував цілий префікс ipv6 / 64 (вхідний трафік), @ michael-hampton виправлено, це було лише під час введення цього питання, @Zoredache Це не вдалося в шлюзі провайдерів, 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));

У мене є статичний префікс, направлений ISP на мій сервер (вони не забезпечують 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
@Arya Коли мені потрібна була така річ, я поклав команду/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, і тепер ви можете прив’язати до будь-якої адреси (доданого блоку) і використовувати її як додав сам.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.