Pi като VPN клиент: един мениджър или собствен скрипт?
Сравнение на профил в NetworkManager и ръчно изработен клиентски скрипт на Raspberry Pi, включително пълен тунел, DNS, IPv6 и поведение при спиране на тунела.
Raspberry Pi, на което трябва да защитава само собствения си изходящ трафик, има два реалистични варианта: тунелът да принадлежи на мрежовия мениджър или да поддържате скрипт, който го притежава. И двата могат да пренасят трафик. Те се провалят на различни места и отказът, който можете да диагностицирате дистанционно в два часа през нощта, е този, който си заслужава да изберете. Сравнете ги по собственост, по това какво означава пълен тунел, когато участват IPv6 и DNS, и по това какво се случва в момента, в който тунелът падне.
Двама собственици за един тунел
Вариант A е профил вътре в мрежовия мениджър на системата: импортиран профил OpenVPN или родна WireGuard връзка, активирана при зареждане от същата услуга, която вдига Ethernet и Wi-Fi. Вариант B е ваша собствена единица, която стартира клиента директно, редактира конфигурацията на резолвера и инсталира свои маршрути и правила за защитна стена. И двата са законни варианта; различават се по това кой има право да променя таблицата за маршрутизация.
Отказите се различават, защото собствениците се различават. При A профил, който не се активира, оставя интерфейса вдигнат, а тунела свален, и журналите на мениджъра казват защо. При B скрипт, който успее наполовина, оставя маршрути, които преживяват процеса, създал ги. Да пускате и двете е най-лошият изход: два процеса пишат маршрута по подразбиране, две редакции на резолвера се състезават при зареждане и два набора тайни за ротация.
Изберете един собственик на тунел и изключете другия, преди да тествате каквото и да е. Двама собственици означават и две места за проверка, когато тунелът е вдигнат и нищо не се резолвира. Това единствено правило предотвратява повечето объркани състояния, описани в дискусиите за Pi VPN.
Какво създава импортът и какво не
В Raspberry Pi OS Bookworm и по-късно инструментът по подразбиране за мрежова конфигурация е NetworkManager, така че профилът е естественият дом за клиентски тунел. Импортът изисква инсталиран подходящ плъгин; без него импортът се проваля със съобщение за неподдържан тип връзка, което е честният сигнал да спрете и да инсталирате плъгина.
nmcli connection import type openvpn file ./provider.ovpn
nmcli connection show
nmcli --ask connection up id provider-name
Импортът запазва профил. Той не доказва, че другата страна е достъпна, и не гарантира, че всяка директива във файла е преживяла преобразуването. Прочетете обратно получената връзка и проверете частите, които носят идентичност и доверие: сертификата, отдалечения хост и порт и дали паролата се пита или се съхранява.
Активирането с --ask държи паролата извън историята на обвивката на споделена машина. За Pi без надзор в крайна сметка ще искате профилът да се вдига при зареждане, което е отделно решение от еднократното вдигане на ръка.
Пълен тунел в сравнение при двата варианта
Пълният тунел е твърдение за маршрути, а не за намерение, и двата варианта го изразяват различно. Подходът с профил иска от мениджъра да инсталира маршрут по подразбиране и настройките на резолвера; подходът със скрипт прави каквото каже скриптът, включително нищо. Нито един вариант не покрива IPv6, освен ако не му се каже, и недокоснат маршрут по подразбиране за IPv6 ще носи трафик извън тунела, докато IPv4 изглежда безупречно.
ip -4 route get 198.51.100.23
ip -6 route show default
resolvectl query example.org
Използвайте документационен адрес за проверката на маршрута и заменете с хост, който ви е позволено да проверявате. Първата команда показва кой интерфейс би използвало Pi за обикновена дестинация; втората показва дали все още съществува маршрут по подразбиране за IPv6; третата доказва кой резолвер е отговорил. Прочетете и трите, преди да вярвате на каквото и да е твърдение за пълен тунел.
Ако инструкциите на доставчика обещават пълен тунел, но маршрутът по подразбиране за IPv6 остава, Pi изтича. Изключете IPv6 на входящия канал или поискайте профилът да го заяви, и решете съзнателно, вместо да го откривате по-късно.
Отворен отказ срещу затворен
Когато тунелът падне, таблица за маршрутизация, която загуби маршрута си по подразбиране, просто се връща към физическия входящ канал и трафикът продължава открито. Това е отворен отказ и е поведението по подразбиране на двата варианта, освен ако нещо не го предотврати. Повечето хора го откриват седмици по-късно, четейки журнал на защитната стена.
Затвореният отказ ви струва дистанционния достъп, когато тунелът е свален, затова се нуждае от съзнателно изключение за пътя за управление. Един начин е правило, което разрешава само адреса на VPN партньора извън тунела:
sudo nft add table inet vpnkill
sudo nft 'add chain inet vpnkill out { type filter hook output priority 0; policy accept; }'
sudo nft add rule inet vpnkill out oifname != "tun0" ip daddr != 203.0.113.24 reject
Сравнете оперативната цена честно. Профилът обикновено не може да изрази това правило, затова затвореният отказ ви тласка към варианта със скрипт или към малка единица, която инсталира правилото независимо от тунела. Във всеки случай записвайте отказите за седмица: тихият отказ изглежда идентично на счупена услуга и ще ви трябва броячът, когато потребител съобщи, че един сайт е спрял да се зарежда.
Избор за Pi без екран
Ако образът вече пуска NetworkManager, тунелът не изисква нищо екзотично и искате той да следва входящия канал автоматично, вземете профила. Ако ви трябва маршрутизация по политика, няколко тунела, избирани за всяка дестинация, или правило за затворен отказ, което трябва да съществува преди вдигането на тунела, вземете скрипта и притежавайте всяка негова част, включително реда на зареждане и почистването. Смесването на двата варианта струва повече от всеки от тях поотделно.
Преминаването между тях е предимно въпрос на ред: изключете стария собственик, потвърдете, че не е останал застоял маршрут или запис в резолвера, след което включете новия и рестартирайте два пъти. Едно рестартиране може да скрие състезание, което второ разкрива. Завършете, като тествате Pi, а не тунела: резолвирайте име, изтеглете нещо по IPv4, изтеглете по IPv6, ако сте го запазили, след това свалете тунела и потвърдете, че избраното от вас поведение наистина се случва. Интерфейс в ip link е началото на теста, не краят.