Маршруттарды өңдеу арқылы бағдарламаны толық туннелі WireGuard хосттан босата алмайсыз. Маршруттар жолды межелі орын бойынша таңдайды, ал сіз босатуды қалайтын нәрсе — процесс, сондықтан ядроның салыстыратын ештеңесі жоқ. Жарамды тәсіл — бұл процеске өзінің желілік контекстін беру: өз интерфейсі, мекенжайлары және әдепкі маршруты бар, veth жұбымен хостқа қосылған аттар кеңістігі. Мен мұны Ubuntu 24.04-те wireguard-tools 1.0.20210914-пен іске қосты, және аттар кеңістігі ешқашан мәселе болған емес — мәселе хосттың жіберу саясаты мен туннельдің таңбалау ережелері болды.

Алдымен өзіңізге қажет контекст түрін таңдаңыз

Іс жүзінде екі нысан кездеседі. Егер хост толық туннель жүргізсе және бір бағдарлама ISP жолымен шығуы керек болса, сіз екінші аттар кеңістігін саласыз, оны хостқа қосасыз және хост ол үшін трафикті жіберіп, түрлендіруге рұқсат бересіз. Егер аттар кеңістігінде VPN интерфейсі бар болса және сізге тек оның ішінде іске қосылатын команда қажет болса, бұл кәдімгі ip netns exec жағдайы және маршруттау жұмысының көбісі орындалып қойған.

Екі нысанның ешқайсысы да бір процесс идентификаторымен шектелген ереже бермейді. Netfilter мекенжайларды, порттарды, таңбаларды және интерфейстерді салыстырады; әр процесс үшін маршруттау кестесі жоқ. Таңбалау трафикті бағыттай алады, бірақ таңба сіз әлдеқашан анықтаған пакеттерге қойылуы керек, және бұл бір қабат төмендегі сол мәселе. Аттар кеңістігі сол процестер ағашы үшін бүкіл стекті бөледі, сондықтан бұл кәдімгі жауап.

Егер талап шынымен туннельден ештеңе шықпауы болса, оның орнына туннельді тоқтатыңыз. Аттар кеңістігі аралас жағдай үшін бар: бір бағдарлама сыртқа, қалғаны бәрі ішке, сол машинада, сол уақытта.

Екінші контексті салып, оны хостқа қосыңыз

Мысалдық орналасу: хостта әдепкі маршрутты тасымалдайтын WireGuard интерфейсі және clearnet деп аталатын желілік аттар кеңістігі бар, ол veth жұбымен хостқа қосылған. Төмендегі мекенжайлар мысалдар.

ip netns add clearnet
ip link add veth-clear-out type veth peer name veth-clear-in
ip addr add 192.168.100.1/24 dev veth-clear-out
ip link set veth-clear-out up
ip link set veth-clear-in netns clearnet
ip netns exec clearnet ip addr add 192.168.100.2/24 dev veth-clear-in
ip netns exec clearnet ip link set veth-clear-in up
ip netns exec clearnet ip route add default via 192.168.100.1

Бұл аттар кеңістігі енді хостқа жете алады, басқа еш жерге емес. Хост трафикті жіберіп, бастапқы мекенжайды қайта жазуы керек, өйткені 192.168.100.0/24 жеке және оның үстіндегі маршрутизатордың оған қайта оралатын маршруты жоқ:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o <wan-interface> -j MASQUERADE

Әрі қарай жылжымас бұрын аттар кеңістігінің жағын растаңыз.ip netns exec clearnet ip route veth маршрутын және 192.168.100.1 арқылы әдепкі маршрутты көрсетуі керек, ал сол мекенжайға ping жауап беруі керек. Егер хост мекенжайына ping сәтсіз болса, мекенжайлар немесе байланыс күйі дұрыс емес және ешбір firewall ережесі көмектесе алмайды.

Аттар шешілгенде, бірақ ештеңе қайтпаса, FORWARD оқыңыз

Классикалық сәтсіздік маршруттау қатесіне ұқсайды: аттар кеңістігі атты шешеді, пакет шығады, ал жауап ешқашан келмейді. FORWARD саясаты DROP болатын хосттарда — бірнеше дистрибутив және қатайтылған бейнелердің көбісі солай жасайды — пакет жолда тасталады, ал қолданба басатын қате сүзгілеу туралы ештеңе айтпайды.

Бірдеңе қоспас бұрын тізбекті оқыңыз:

iptables -S FORWARD
nft list chain inet filter forward

Содан кейін трафикті екі бағытта да, санауыштармен өткізіңіз, ереженің қашан да сәйкес келгенін білу үшін:

iptables -A FORWARD -i veth-clear-out -o <wan-interface> -j ACCEPT
iptables -A FORWARD -i <wan-interface> -o veth-clear-out -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
watch -n1 'iptables -L FORWARD -v -n'

Пакет санауышы нөлге тең ереже жолда емес. Не интерфейс атаулары сіз болжағаннан өзгеше, не тізбектегі бұрынғы ереже пакетті бірінші қабылдады, тастады немесе қайтарды. Тәртіпті түзетіңіз, ереже мәтінін емес.

Жауап трафигі — адамдар ұмытып кететін жартысы. Қайтару ережесіне сол veth атауы және байланыс күйінің сәйкестігі қажет, немесе саясатты ашық ұстасаңыз, қарапайым интерфейс қабылдауы. Тек шығыс ережесін қосыңыз, сонда бастапқы белгі қайтады, ал жаңа ережеңіз сол жерде дұрыс көрініп тұрады.

Туннельдің таңбалау ережелерін жаңа жолдан алыс ұстаңыз

Бұл қадам жұмыс істеп тұрған аттар кеңістігін ағып кететін кеңістікке айналдырады. WireGuard конфигурациялары әдетте firewall таңбасының саясатын өз маршруттау ережелерімен және арнайы кестемен бірге орнатады, сондықтан таңбаланбаған пакеттер негізгі кестеге қайтады, ал таңбаланғандар туннель кестесін пайдаланады. Аттар кеңістігінен жіберілген трафик шыққан кезде саяси маршруттау бойынша бағаланады, және бұл ережелердің қалай жазылғанына байланысты ол туннель кестесіне түсіп қалуы мүмкін.

Екі қосымша жолдарды бөледі. Аттар кеңістігінің ішкі желісі үшін mangle тізбегінде ертерек қайтарыңыз және сол ішкі желіні негізгі кестеге қоятын көзге негізделген ереже қосыңыз:

iptables -t mangle -I PREROUTING -s 192.168.100.0/24 -j RETURN
ip rule add from 192.168.100.0/24 lookup main priority 100

100 басымдығы менің хостымда туннель ережелерінен бұрын тұрады, сондықтан сол көз үшін кәдімгі кесте шешеді. Санды соқыр көшірмеңіз:wg-quick орнататын басымдықтар нұсқалар мен IPv4 және IPv6 конфигурациялары арасында өзгеше, сондықтан мынаны орындаңыз ip rule show және өз машинаңызда туннель ережелерінің алдына түсетін басымдықты таңдаңыз.

Ережелер тізіміне сенудің орнына көзге қатысты іздеу арқылы тексеріңіз:

ip route get 1.1.1.1 from 192.168.100.2
ip netns exec clearnet ip route get 1.1.1.1

Егер бірінші команда WireGuard интерфейсін хабарласа, жаңа ереже әлі туннель саясатының алдында емес. Егер ол WAN интерфейсін хабарлап, екіншісі әлі veth әдепкі маршрутын көрсетсе, хост пен аттар кеңістігі келіспейді және екі маршруттау кестесін қайта оқығаныңыз жөн.

Қосылымды ашатын процесті іске қосыңыз

Команданы іске қосу — бір жол, бірақ сокетті шын мәнінде жасайтын процесті іске қосыңыз.ip netns exec clearnet curl -s https://ifconfig.me— ең кішкентай адал сынақ: ол аттар кеңістігінің әлемге ұсынатын мекенжайын көрсетеді, хост қолданатынын емес.

Қызмет үшін аттар кеңістігін жол бойынша тіркеңіз, процесс бүкіл өмірінде сонда қалуы үшін:

[Service]
NetworkNamespacePath=/run/netns/clearnet

Графикалық қолданбалар — бір жолдық тәсіл үнсіз сәтсіз болатын жер. Мәзірден іске қосылған браузер сұранысты жиі аттар кеңістігінен тыс жұмыс істеп тұрған данаға береді, сондықтан жаңа терезе пайда болады, ал трафик әлі туннель арқылы шығады. Оған бөлек профиль беріңіз, шын мәнінде жаңа дана жасалуы үшін, содан кейін болжаудың орнына процестің контекстін тексеріңіз:

readlink /proc/$(pgrep -f clearnet-profile | head -1)/ns/net
readlink /run/netns/clearnet

Екі шығыс сәйкес болуы керек. Сол тексеру кез келген ұзақ жұмыс істейтін бағдарлама үшін жарамды, және іске қосқыш көздегеніңізді жасады деп болжаудың орнына оны әр қолданба үшін бір рет орындаған жөн.

Аттарды шешу өзінің шешімін қажет етеді. Аттар кеңістігін жасау оған resolver конфигурациясын бермейді; әр аттар кеңістігіне арналған файлдар мына арқылы қолдау көрсетіледі /etc/netns/<name>/resolv.conf ал онсыз сіз қате оқуға оңай мінез-құлықты мұра етесіз. IPv6-ға да сол қатынас қажет: егер аттар кеңістігінде v6 әдепкі маршруты болмаса, ал қолданба v6-ны қаласа, сұраныстар кері шегінуге дейін тұрып қалуы мүмкін, бұл сынған туннельге ұқсайды.

Қаңқаны тексеріңіз, тек шығу мекенжайын емес

Жұмыс істеп тұрған жария мекенжай маршрутты дәлелдейді, бүкіл талапты емес. Қалғанын осы тәртіппен өтіңіз:

  • ip netns exec clearnet ip route get 1.1.1.1 veth әдепкі маршрутын көрсетеді, WireGuard интерфейсін емес.
  • Екі ереженің FORWARD санауыштары сұраныс жүріп жатқанда өседі.
  • Қолданба процесі сіз күтетін аттар кеңістігінің inode-ін хабарлайды.
  • Қайта жүктеуден кейін аттар кеңістігі қызмет басталмай тұрып бар; ертерек жұмыс істейтін unit сәтсіз болады немесе, одан жаманы, аттар кеңістігінен тыс жұмыс істейді.

Содан кейін туннель құлағанда не болуы керектігін шешіңіз. Аттар кеңістігі жұмысын жалғастырады, бұл жаттығудың мақсаты және сонымен бірге қауіп: босатылған бағдарлама қосылып қалады, ал қалғанының бәрі тоқтайды. Мұны саясат таңдауы ретінде жазып қойыңыз және босатудың нені қамтымайтынын анық айтыңыз — тіркелгі идентификациясы, сақталған браузер күйі және сіздің DNS провайдеріңіз желілік аттар кеңістігінің ауқымынан тыс, ал босатуды анонимдік деп санау — конфигурациядан ұзақ өмір сүретін қате.

Қатысты мақалалар