Бир Linux процессин WireGuard туннелинен сырткары кантип иштетүү керек
Бир программага өзүнүн тармактык контекстин бериңиз, ал толук туннелдүү WireGuard хосттон чыгышы үчүн, анан ага тоскоол болгон өткөрүү жана белгилөө эрежелерин оңдоп коюңуз.
Маршруттарды оңдоо менен программаны толук туннелдүү 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.1veth демейки маршрутун көрсөтөт, WireGuard интерфейсин эмес.- Сурам иштеп турганда эки эреженин FORWARD эсептегичтери өсөт.
- Колдонмонун процесси сиз күткөн аттар мейкиндигинин inodeин билдирет.
- Кайра жүктөөдөн кийин аттар мейкиндиги кызмат башталганга чейин бар; эртерек иштеген unit ийгиликсиз болот, же андан жаманы, аттар мейкиндигинен сырткары иштейт.
Анан туннел кулаганда эмне болушу керектигин чечиңиз. Аттар мейкиндиги иштей берет, бул көнүгүүнүн максаты жана ошол эле учурда тобокелдик: бошотулган программа туташууда калат, калганынын баары токтойт. Муну саясат тандоосу катары жазып койңуз жана бошотуу эмнени камтыбасын ачык айтыңыз — эсептин инсандыгы, сакталган браузер абалы жана сиздин DNS провайдериңиз тармактык аттар мейкиндигинин чөйрөсүнөн тышкары, ал эми бошотууну анонимдүүлүк деп эсептөө конфигурациядан узак жашаган ката.