Поставио сам net.ipv6.conf.all.forwarding=1 на Debian прелаз да би могао да прослеђује саобраћај VPN клијената, и отприлике пола сата касније машина више није имала IPv6 подразумевану руту. Узводни рутер је био активан, линк-локални сусед је још одговарао, а uplink је и даље имао своју глобалну адресу. Оно што је престало била је спремност кернела да на том интерфејсу и даље прихвата router oglase. Рута није нестала када сам откуцао sysctl; нестала је када је истекао животни век RA-научене подразумеване руте и ништа је није обновило.

Ништа није изгледало покварено на први поглед. Прослеђивање је радило, клијенти су пролазили док је стара рута још била у кешу, а квар је дошао касније од промене која га је изазвала. То кашњење је разлог зашто се то приписује uplink-у или firewall правилу које никада није било укључено.

Прочитајте табелу рута пре него што додирнете било који sysctl

Почните са ip -6 route show default и прочитајте атрибуте, не само гејтвеј. RA-научена подразумевана рута означена је са proto ra, носи преференцију и показује expires одбројавање. Рута коју сте додали ручно нема ни једно ни друго, а та разлика вам каже који механизам поседује руту.

$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref medium

Затим погледајте адресу: ip -6 addr show dev eth0. Глобална адреса са пожељним и важећим животним веком мереним у сатима надживеће подразумевану руту чији се животни век рутера мери у минутима. Адреса постоји, а подразумевана рута недостаје, то је потпис проблема са oglasima. Ако недостаје и адреса, прво треба ловити линк, информације о префиксу или откривање дупликата адреса.

Зашто прослеђивање искључује обраду RA

RA је ICMPv6 пакет типа 134, послат са линк-локалног извора са ограничењем скока 255. Пре него што га кернел употреби, проверава accept_ra интерфејса. Подразумевана вредност је 1, а 1 не значи да. Значи: прихвати само док овај хост не прослеђује. Поставите forwarding=1 и тај услов пада, па се oglas одбацује пре него што се у њему размотри било који префикс или подразумевани рутер.

Постоје три вредности, а само трећа преживљава прослеђивање:

accept_raforwarding=0forwarding=1
0ignoredignored
1 (default)acceptedignored
2acceptedaccepted

Две друге заставице одлучују шта се стварно инсталира. accept_ra_defrtr контролише да ли подразумевани рутер из oglasa постаје рута, а accept_ra_pinfo контролише да ли се информације о префиксу користе за конфигурацију адресе. Искључивање accept_ra_defrtr уобичајен је начин да се SLAAC адресе задрже на хосту који прослеђује без учења подразумеване руте. То је друга полуга од accept_ra и по њу посежете када желите адресе, али не руту. Референца кернела за IP sysctl наводи све три.

Потврдите то са три наредбе

Прво прочитајте живе вредности уместо датотеке за коју мислите да је учитана:

sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
       net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtr

Друго, докажите да oglasi још долазе. Филтрирање по бајту типа ICMPv6 је довољно и избегава читање зида саобраћаја откривања суседа:

tcpdump -ni eth0 'icmp6 and ip6[40] == 134'

Ако се ништа не појави током неколико минута, accept_ra није ваш проблем. Узводна страна је престала да оглашава, нешто на путу филтрира ICMPv6 или тај интерфејс заиста није на сегменту на којем мислите. Треће, сами затражите oglas и прочитајте његова поља:

rdisc6 eth0

rdisc6 долази у пакету ndisc6 на Debian-у и Ubuntu-у. У излазу погледајте животни век рутера и преференцију пре него што било шта друго промените. Oglas са животним веком рутера 0 је налог за уклањање подразумеваног рутера и ниједна accept_ra вредност то не претвара у употребљиву руту. Тако такође ухватите узводни CPE у режиму моста који дели префиксе, али се никада не нуди као рутер.

Учините uplink јединим попустљивим интерфејсом

Ако узводна страна треба да буде подразумевани рутер, тамо прихватајте oglase упркос прослеђивању и нигде другде:

# /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 = 1

Ограничење је важно јер је IPv6 прослеђивање један глобални прекидач у Линуксу, а не један по линку. Упишите 1 у net.ipv6.conf.wg0.forwarding и затим прочитајте net.ipv6.conf.all.forwarding: глобална вредност се преокрене и сваки интерфејс почиње да прослеђује. Не можете бити рутер на тунелу и обичан хост на LAN-у. Оно што можете ограничити је прихватање. Држите accept_ra=2 на uplink-у, а интерфејсе тунела и LAN-а оставите на 1 или 0, како залутали oglas који стигне преко тунела не би могао да инсталира подразумевану руту која показује у њега.

Привремени sysctl -w неће преживети следеће подизање система, а и systemd-networkd и NetworkManager уписују те вредности из сопствене конфигурације. У networkd поставите IPv6Forwarding=yes и IPv6AcceptRA=yes у .network датотеци uplink-а; networkd документује IPv6Forwarding као глобално због истог разлога у кернелу. Са NetworkManager-ом је ipv6.method=auto на uplink-у оно што покреће accept_ra вредност, па поново прочитајте sysctl након nmcli connection up уместо да верујете првој провери.

Статичка алтернатива, ip -6 route add default via fe80::1 dev eth0, заиста ради и разуман је одговор када узводни рутер има стабилну линк-локалну адресу. Будите јасни око тога шта губите. Статичка подразумевана рута никада се не обнавља и никада се не повлачи, па наставља да показује на мртвог суседа након што се узводни рутер замени. RA рута пада сигурно; статичка пада тихо.

Тестирајте прослеђени пакет, а не гејтвејев властити

Гејтвејеви властити пинг-ови могу успети на рути коју ниједан клијент не може користити, а могу успети и зато што је гејтвеј извор. Тестирајте са повезаног клијента, а затим питајте гејтвеј шта би учинио за адресу тог клијента:

# 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::2

Затим сачекајте један животни век рутера и погледајте поново. Стабилно стање које желите је подразумевана рута означена proto ra чија се expires вредност стално ресетује, плус all.forwarding=1. Ако expires само одбројава, oglasi се још негде одбацују, а уобичајени кривац је мрежни менаџер који преписује accept_ra након што се sysctl при подизању већ извршио.

Пре него што ово закључите, потврдите четири ствари: подразумевана рута је proto ra и обнавља се, accept_ra=2 важи само за uplink, прослеђивање је и даље 1 након подизања система и након поновног покретања менаџера, и клијент, а не гејтвеј, завршава IPv6 пинг. Ако клијент и даље не успева са здравом рутом, следећи сумњивац је повратни пут или узводни firewall, а не oglas.

Повезани чланци