Дали IPv6 сообраќајот треба да оди преку VPN или директно?
Одлучете дали ::/0 припаѓа внатре во тунелот, според три услови: поддршка на излезот, достапност на крајната точка и само локални мрежи.
Минатиот месец две лица ми побараа спротивни резултати: едниот сакаше IPv6 да биде покриен од VPN, другиот сакаше канцеларискиот печатач да продолжи да работи. Една рута ::/0 не може сама да ги обезбеди двете. Дали таа рута припаѓа внатре во тунелот зависи од три услови, а првото го исклучува за повеќето комерцијални излези. Ако излезот не носи IPv6, насочувањето на стандардната рута кон него го крие вашиот сообраќај во тунел што нема каде да го испрати.
Три услови го одлучуваат одговорот
Стандардната рута е еден ред, ::/0, и се совпаѓа со секоја IPv6 дестинација без поспецифична рута (RFC 4291). Инсталирањето е лесно. Одлуката дали треба се сведува на три услови.
Прв услов: излезот на кој се поврзувате има работен IPv6 и е подготвен да го пренесе. Втор услов: вашиот клиент може да задржи пат до крајната точка на тунелот, која обично се наоѓа во опсегот што ќе го рутирате. Трет услов: можете да ги именувате локалните IPv6 дестинации што мора да останат надвор од тунелот.
Секој услов пропаѓа на свој начин, затоа погодувањето чини цела вечер. Пропаднат прв услов ви дава тишина и табела за рутирање што изгледа исправно. Пропаднат втор услов го убива ракувањето неколку секунди по почетокот. Пропаднат трет услов остава работен тунел и незадоволен колега кај печатачот.
| What you see | Decision |
|---|---|
| Exit answers IPv6 probes, no local IPv6 devices to protect | Route ::/0 into the tunnel |
| Exit answers IPv6 probes, printer or NAS reachable by a global address | Route ::/0, then give those prefixes a route of their own |
| Exit is IPv4-only inside the tunnel | Do not route ::/0; block IPv6 on the client |
Endpoint is reached over IPv6 and sits inside ::/0 | Install a host route for the endpoint first |
Дали излезот навистина носи IPv6?
Тунелски интерфејс со IPv6 адреса не докажува ништо за другата страна. Многу комерцијални профили внатре се само IPv4: серверот ви дава v4 адреса и го фрла сѐ друго. Инсталирајте стандардна рута од AllowedIPs врз тоа и јадрото со задоволство ќе праќа IPv6 во интерфејс чиј партнер никогаш не го гледа.
Тестирајте од клиентот додека тунелот е кренат. ping -6 -c 3 2001:4860:4860::8888 и ip -6 route get 2001:4860:4860::8888 одговараат на различни прашања: дали се враќа одговор и кој уред го избрало јадрото. Кога второто го именува вашиот тунел, а првото не враќа ништо, проблемот е во излезот, не во рутата.
Ако сами го управувате излезот, клиентскиот тест може да помине, а патот сепак да заврши во ќорсокак. Потврдете net.ipv6.conf.all.forwarding=1 на портата и дека нејзиниот огненоѕид прифаќа пакети пренесени од тунелот. Правилно рутиран пакет во излез што одбива да пренесе изгледа од страната на клиентот точно како грешка во рутирањето.
Може ли клиентот да го задржи патот до крајната точка?
Ова е случајот што ме фати на преносен компјутер со WireGuard крајна точка само на IPv6. Адресата на крајната точка е обична глобална адреса, па спаѓа во ::/0. Рутирајте го целиот префикс во интерфејсот и пакетите за ракување сами ќе се натераат во тунелот што сѐ уште се обидуваат да го изградат. Тунелот никогаш не се крева, и ништо во излезот на клиентот не кажува зошто.
wg-quick го решава ова на Linux. Изведува рути од AllowedIPs, ги инсталира во сопствена табела и додава правило за политика за сообраќајот до крајната точка прво да се реши низ главната табела: правилото suppress_prefixlength 0 што ќе го најдете во ip -6 rule. Затоа wg-quick up успева таму каде што рачно напишаната ip -6 route add default dev wg0 ве отсекува.
Проверете ги двете состојби со ip -6 route get <endpoint-v6>, пред и по кревањето на тунелот. Ако одговорот се смени кон вашиот уред за тунел, сте го отстраниле патот што му е потребен на тунелот. Кога сами ги пишувате рутите, додадете рута за домаќин до крајната точка преку оригиналната порта, или поврзете се со крајната точка преку IPv4 и оставете IPv6 на полезниот товар.
Што мора да остане надвор од тунелот?
Поспецифичните рути ја победуваат стандардната, затоа префиксот на врската или ULA опсегот со сопствена рута продолжува да работи без дополнителен труд. Ова е тивката причина зошто толку многу поставки со целосен тунел IPv4 преживуваат: LAN префиксите се поспецифични од стандардната и никогаш не влегуваат во тунелот.
Тоа се крши кога локален уред е достапен преку глобална адреса, што е нормално за печатач што истиот рутер му дал јавен префикс, NAS или телевизор. Тие адреси се совпаѓаат со ::/0 и со ништо друго, затоа се преместуваат во тунелот со сѐ друго и исчезнуваат.
Одлучувајте по дестинација, не по протокол. Ако два или три локални домаќини се важни, дајте им на нивните префикси рута надвор преку физичкиот интерфејс, или извадете ги од договореното множество. Ако списокот продолжува да расте, чесниот одговор е поделен тунел за IPv6 со писмен список на исклучоци, а не стандардна рута што постојано ја крпите.
Ако одговорот е не, блокирајте го
Оставањето на IPv6 без рута не е исто како да го оставите на мир. Домаќин со работна стандардна рута за IPv6 продолжува да ја користи додека тунелот носи IPv4, затоа сообраќајот излегува покрај VPN и секоја услуга што преферира IPv6 ја гледа вашата вистинска адреса. Тоа е истекување, не поделен тунел.
Изберете едно и запишете кое сте го избрале. Рутирајте ја стандардната и прифатете ги компромисите погоре, или исклучете го IPv6 за времетраењето на тунелот. Испуштањето на префиксот од AllowedIPs не е доволно само по себе, бидејќи оперативниот систем ја чува сопствената стандардна рута. На Linux грубата верзија е sysctl -w net.ipv6.conf.all.disable_ipv6=1; пофината верзија го фрла IPv6 надвор од тунелот со правило на огненоѕидот. Телефонските клиенти имаат јасен прекинувач за блокирање на IPv6 што ја врши истата работа.
Проверете го како истекување
Кренете го тунелот и прочитајте ја состојбата наместо да му верувате на прекинувачот. ip -6 route show default треба да покаже една стандардна рута, а ip -6 route get за дестинација надвор од вашата LAN треба да го именува уредот за тунел. Повторете ги двете по исклучување: стандардната рута што го надживува тунелот е грешката што ја баравте.
Потоа тестирајте го спротивниот правец. Од домаќин на локалната мрежа, стигнете до клиентот на неговата локална IPv6 адреса. Ако тоа престане да работи, третиот услов никогаш не бил исполнет, што и да тврдела табелата за рутирање тогаш.
Запишете го резултатот таму каде што следниот човек ќе го најде: кои префикси остануваат локални, зошто и што прави клиентот по исклучување. Два реда во runbook му заштедуваат на следниот инженер повторно откривање на јамката на крајната точка на полноќ.