IPv6-standertrûte ferdwûn nei it oansetten fan trochstjoeren op Linux
As jo IPv6-trochstjoeren oansette, negearret de kernel de routerankundigings op 'e uplink, en de learde standertrûte ferrint. Reparaarje it mei accept_ra.
Ik sette net.ipv6.conf.all.forwarding=1 op in Debian-gateway sadat it VPN-klantferkear trochstjoere koe, en sawat in healoere letter hie de masine gjin IPv6-standertrûte mear. De upstream-router wie aktyf, de link-lokale buorman antwurde noch, en de uplink hie noch syn globale adres. Wat stoppe wie, wie de reewilligens fan 'e kernel om op dat ynterface noch routerankundigings oan te nimmen. De rûte ferdwûn net doe't ik de sysctl yntype; hy ferdwûn doe't de libbensdoer fan 'e RA-learde standert op rekke en neat him fernijde.
Neat like op it earste each stikken. Trochstjoeren wurke, klanten kamen der troch wylst de âlde rûte noch yn 'e cache siet, en de flater kaam letter as de feroaring dy't him feroarsake. Dy fertraging is wêrom't dit taskreaun wurdt oan 'e uplink of oan in firewallregel dy't nea belutsen wie.
Lês de rûtetabel foardat jo in sysctl oanreitsje
Begjin mei ip -6 route show default en lês de attributen, net allinnich de gateway. In RA-learde standert is markearre proto ra, draacht in foarkar en toant in expires-ôftelling. In rûte dy't jo mei de hân tafoege hawwe, hat gjin fan beide, en dat ferskil fertelt jo hokker meganisme de rûte besit.
$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref mediumSjoch dan nei it adres: ip -6 addr show dev eth0. In globaal adres mei foarkars- en jildige libbensdoeren yn oeren oerlibbet in standertrûte wêrfan't de routerlibbensdoer yn minuten metten wurdt. Adres oanwêzich plus standert ûntbrekt is de sinjatuer fan in ankundigingsprobleem. Adres ek ûntbrekt betsjut dat de link, de prefiksinformaasje of dubbele-adresdeteksje it earste is om efteroan te gean.
Wêrom't trochstjoeren RA-ferwurking útsette
In RA is in ICMPv6-pakket fan type 134, stjoerd fan in link-lokale boarne mei hoplimyt 255. Foardat de kernel it brûkt, rieplachtet er de accept_ra fan it ynterface. De standertwearde is 1, en 1 betsjut net ja. It betsjut allinnich akseptearje wylst dizze host net trochstjoert. Set forwarding=1 en dy betingst falt ôf, dus de ankundiging wurdt weilitten foardat der in prefiks of standertrouter yn beskôge wurdt.
Der binne trije wearden, en allinnich de tredde oerlibbet trochstjoeren:
accept_ra | forwarding=0 | forwarding=1 |
|---|---|---|
| 0 | ignored | ignored |
| 1 (default) | accepted | ignored |
| 2 | accepted | accepted |
Twa oare flaggen beslisse wat echt ynstallearre wurdt. accept_ra_defrtr regelet oft de standertrouter yn 'e ankundiging in rûte wurdt, en accept_ra_pinfo regelet oft prefiksinformaasje brûkt wurdt foar adreskonfiguraasje. accept_ra_defrtr útsette is de gewoane manier om SLAAC-adressen op in trochstjoerende host te hâlden sûnder in standert te learen. It is in oare hefbeam as accept_ra, en it is dy't jo pakke moatte as jo adressen wolle mar gjin rûte. De kernel IP-sysctl-referinsje listet alle trije.
Befêstigje it mei trije opdrachten
Lês earst de libjende wearden yn stee fan it bestân dat jo tinke dat laden is:
sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtrBewiis twadde dat de ankundigings noch oankomme. Filterje op 'e ICMPv6-typebyte is genôch, en it foarkomt dat jo in muorre fan buorman-ûntdekkingsferkear lêze:
tcpdump -ni eth0 'icmp6 and ip6[40] == 134'As der oer ferskate minuten neat ferskynt, is accept_ra net jo probleem. De uplink stoppe mei ankundigjen, eat op it paad filteret ICMPv6, of dat ynterface leit net echt op it segmint dat jo tinke. Freegje trêde sels in ankundiging oan en lês de fjilden:
rdisc6 eth0rdisc6 sit yn it pakket ndisc6 op Debian en Ubuntu. Sjoch yn 'e útfier nei de routerlibbensdoer en it foarkar foardat jo eat oars feroarje. In ankundiging mei in routerlibbensdoer fan 0 is in opdracht om de standertrouter te ferwiderjen, en gjin accept_ra-wearde makket dêrfan in brûkbere rûte. Dit is ek hoe't jo in upstream-CPE yn brêgemodus fange dy't prefiksen útdielt mar himsels nea as router oanbiedt.
Meitsje de uplink it iennige tastienende ynterface
As de uplink de standertrouter wêze moat, akseptearje dêr ankundigings nettsjinsteande trochstjoeren, en nearne oars:
# /etc/sysctl.d/60-ipv6-router.conf
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.eth0.accept_ra = 2
net.ipv6.conf.eth0.accept_ra_defrtr = 1De begrinzing makket út omdat IPv6-trochstjoeren ien globale skeakel is yn Linux, net ien per link. Skriuw 1 nei net.ipv6.conf.wg0.forwarding en lês dan net.ipv6.conf.all.forwarding: de globale wearde draait om en elk ynterface begjint troch te stjoeren. Jo kinne net router op 'e tunnel en gewoane host op it LAN wêze. Wat jo begrinzgje kinne, is akseptaasje. Hâld accept_ra=2 op 'e uplink en lit tunnel- en LAN-ynterfaces op 1 of 0, sadat in ferdwaalde ankundiging oer de tunnel gjin standert ynstallearje kin dy't dêryn wiist.
In tydlike sysctl -w oerlibbet de folgjende werstart net, en sawol systemd-networkd as NetworkManager skriuwe dizze wearden út har eigen konfiguraasje. Set yn networkd IPv6Forwarding=yes en IPv6AcceptRA=yes yn it .network-bestân fan 'e uplink; networkd dokumintearret IPv6Forwarding as globaal om deselde kernelreden. By NetworkManager is ipv6.method=auto op 'e uplink wat de accept_ra-wearde driuwt, dus lês de sysctl opnij nei nmcli connection up yn stee fan de earste kontrôle te fertrouwen.
It statyske alternatyf, ip -6 route add default via fe80::1 dev eth0, wurket wol, en it is in ridlik antwurd as de upstream-router in stabile link-lokale adres hat. Wês dúdlik oer wat jo opjouwe. In statyske standert wurdt nea fernijd en nea weromlutsen, dus hy bliuwt wize nei in deade buorman nei't de uplink ferfongen is. De RA-rûte falt feilich; de statyske falt stil.
Test in trochstjoerd pakket, net dat fan 'e gateway sels
De eigen pings fan 'e gateway kinne slagje op in rûte dy't gjin klant brûke kin, en se kinne ek slagje om't de gateway de boarne is. Test fan in ferbûn klant en freegje de gateway dan wat hy foar it adres fan dy klant dwaan soe:
# on the VPN client
ping -6 -c 3 2001:4860:4860::8888
# on the gateway, using a client address
ip -6 route get 2001:4860:4860::8888 from fd42:20::2Wachtsje dan ien routerlibbensdoer en sjoch wer. De stabile tastân dy't jo wolle is in standert markearre proto ra wêrfan't de expires-wearde hieltyd weromset, plus all.forwarding=1. As expires allinnich ôftelt, wurde ankundigings noch earne weilitten, en de gewoane skuldige is in netwurkbehearder dy't accept_ra oerskriuwt nei't de sysctl by it opstarten al rûn hat.
Foardat jo dit ôfslute, befêstigje fjouwer dingen: de standertrûte is proto ra en fernijt, accept_ra=2 jildt allinnich foar de uplink, trochstjoeren is noch 1 nei in werstart en nei in behearder-werstart, en in klant yn stee fan 'e gateway foltôget in IPv6-ping. As de klant noch mislearret mei in sûne rûte, is de folgjende fertochte it werompaad of in upstream-firewall, net de ankundiging.