Dodanie całego bloku IPv6 / 64 do interfejsu sieciowego w Debianie

15

Próbowałem dodać cały interfejs IPv6 (/ 64) do interfejsu przy użyciu

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

jak opisano tutaj na moim serwerze Debian, ale wydaje mi się, że czegoś mi brakuje.

Jeśli pinguję na przykład 2001:41d0:2:ad64::felokalnie, wszystko działa dobrze, ale jeśli spróbuję ze zdalnego komputera, to nie działa. Próbowałem następnie dodać trasę na eth0:

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

Teraz nie mogłem nawet pingować żadnego lokalnego przykładu!

Jestem trochę zagubiony, ponieważ wydaje mi się, że coś mi brakuje, ale nie mogę znaleźć tutaj odpowiedzi.

W skrócie: Chcę 2001:41d0:2:ad64::/64być związany z eth0, aby każdy adres IP, który zawiera ten blok, był dostępny z Internetu na moim komputerze.

Mam nadzieję, że ktoś tam wskaże mi właściwą drogę. Z góry dziękuję.

Przewodnik dostarczone przez ISP wymaga mi dodać każdy IPv6 do interfejsu explictly. Chcę, żeby to było dorozumiane.

Konfiguracja pracy z jawnym wiązaniem adresu IP

/ etc / network / interfaces:

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

Rozwiązanie wypróbuj # 1

Próbowałem ponownie włączyć lokalną trasę zgodnie z sugestią @kasperd.

Treść mojego / 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

Lokalna tabela routingu:

# 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

Wyjście traceroute(mojego lokalnego komputera domowego):

  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 na serwerze:

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 na serwerze:

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 wyjście (podczas pingowania i śledzenia na zdalnym serwerze):

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

tracert do bramy:

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 do bramy:

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

Więc nadal działa tylko lokalnie (serwer), ale nie zdalnie (mój komputer).

Hikaru-Shindo
źródło
Więc próbowałeś traceroute ze zdalnego komputera? Gdzie ślad nie powiedzie się?
Zoredache
Jeśli wszystkie hosty są w tej samej sieci, nie powinieneś mieć żadnej trasy.
Spack
Twoje drugie ip routepolecenie ma literówkę w adresie IPv6.
Michael Hampton
@Spack Chcę, aby eth0 nasłuchiwało cały prefiks ipv6 / 64 (ruch przychodzący), @ naprawiono @ michael-hampton, to było właśnie podczas pisania tego pytania, @Zoredache Nie działa na bramce ISP 2001:41d0:2:adff:ff:ff:ff:ffpo tym, jak upłynie limit czasu.
Hikaru-Shindo
Z badań, które przeprowadziłem w przeszłości, nie jest to możliwe. Działa lokalnie, ponieważ twoja tabela routingu wie, gdzie trasować pakiety. Jeśli dodasz ten przedrostek jako trasę statyczną w routerze brzegowym, zobaczysz, że klienci LAN mogą się połączyć.
Nathan C

Odpowiedzi:

13

W przeszłości potrzebowałem czegoś podobnego. Przekonałem się, że do działania tego potrzebne są trzy kroki:

  • Musisz skierować prefiks do hosta
  • Potrzebujesz trasy lokalnej na hoście
  • Aplikacje muszą ustawić opcję IP_FREEBINDlub IP_TRANSPARENTna gniazdach

Właściwy sposób na przekierowanie prefiksu do hosta polega na skontaktowaniu się z usługodawcą, jeśli jeszcze go nie podał. Mogą mieć serwer DHCPv6, który może przekazać Ci prefiks, jeśli tylko wyślesz do niego odpowiednie żądanie DHCPv6.

Jeśli z jakiegoś powodu nie jest możliwe uzyskanie prawdziwego prefiksu routowanego, ale masz dostęp do korzystania z dowolnej liczby adresów z prefiksu łącza dostępnego w jednym z interfejsów sieciowych, możesz zmienić jego część w prefiks routowany przez mając demona odpowiadającego na żądania wykrywania sąsiadów dla każdego adresu IPv6 w tym zakresie.

Używanie takiego demona nie jest zalecane w ostateczności, ponieważ niepotrzebnie zużywa pamięć od wszystkich sąsiadów. Istnieje kilka implementacji takiego demona, który wygląda obiecująco, to ndppd . (Nie mam z tym żadnego szczególnego doświadczenia, ponieważ dowiedziałem się o tym dopiero po napisaniu własnego z prefiksem linku).

Wygląda na to, że masz już uruchomioną trasę lokalną. Jak zauważyłeś, należy go przypisać do lointerfejsu, aby działał.

Wreszcie aplikacje używające adresów z tego zakresu potrzebują opcji IP, aby móc łączyć się z adresami, które nie są jawnie przypisane do konkretnego interfejsu sieciowego na hoście. Oto fragment kodu, którego można użyć:

const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));
kasperd
źródło
Mam statyczny prefiks skierowany do mojego serwera przez dostawcę usług internetowych (nie zapewniają DHCP. Ani dla IPv4, ani dla IPv6). Chcę, aby wszystkie IPv6 w tym bloku / 64 były dostępne z zewnątrz (większość moich aplikacji łączy się z :: które powinny być wszystkimi dostępnymi adresami, jeśli się nie mylę). Teraz chcę, aby wszystkie te adresy IP były dostępne w eth0, więc jeśli spróbuję połączyć się z dowolnym IPv6 w tym bloku, każda aplikacja nasłuchująca na określonym porcie będzie mogła odpowiedzieć (na przykład każdy adres IP powinien poprawnie odpowiedzieć na ping).
Hikaru-Shindo
W przypadku powiązania z :: opcja IP_TRANSPARENT nie jest potrzebna. Z prefiksem skierowanym do mojego serwera i lokalną trasą na miejscu, mogę łączyć się z :: i odbierać połączenia z dowolnymi adresami IPv6 w tym zakresie. ping6 również działa. Testuję to na Ubuntu 12.04, ale spodziewałbym się, że będzie działał na każdym ostatnim jądrze również w innych dystrybucjach. Jeśli to nie działa, sugeruję przyjrzeć się ruchowi sieciowemu za pomocątcpdump -pni eth0 'host 2001:41d0:2:ad65::fe'
kasperd
Nadal nie działa. Podałem kilka dodatkowych informacji na temat konfiguracji w moim pytaniu, może to pomaga.
Hikaru-Shindo
Mówisz, że masz / 64 skierowany do serwera. Ale przykłady w przewodniku dostawcy usług hostingowych mają tylko prefiks łącza i brak prefiksu trasy. A dane wyjściowe tcpdump i traceroute6 wyglądają, jakby adresy nie były kierowane do serwera. Czy udało Ci się uzyskać pojedynczy adres IPv6 działający przy użyciu dokumentacji od dostawcy?
kasperd
1
@Arya Kiedy potrzebowałem czegoś takiego, /etc/rc.local
wstawiłem
2

Teraz jest rok 2019. Jedno słowo: ip_nonlocal_bind (od jądra 4.3 o ile wiem).

Użyj ndppd + sysctl net.ipv6.ip_nonlocal_bind = 1, ostatni pozwala na powiązanie z dowolnym adresem IPv6 (w tym przypadku nie jest potrzebne IP_FREEBIND).

Zgadnij, że to zrobiłeś:

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 będzie wyglądać następująco:

route-ttl 30000

proxy eth0 {

   router no

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

uruchom ndppd, a teraz możesz połączyć się z dowolnym adresem (dodanego bloku) i używać go tak, jak się dodaje.

Alexander Gnatyna
źródło