VPN атаулар кеңістігіндегі қолданба LAN-нан қолжетімсіз
Желілік атаулар кеңістігі бір бағдарламаға өз туннелін және өз loopback-ын береді. Хосттың орнына тек оның портын socat секірісімен немесе veth жұбымен жариялаңыз.
Қызметіңіз машинада жұмыс істеп тұр, туннель көтерілген, бірақ үстеліңіздегі браузер әлі жауап күтіп тұр. Қарапайым мағынада ештеңе бұзылмаған: қолданба желілік атаулар кеңістігінің ішінде тыңдап тұр, ал бұл стек LAN үшін көрінбейді. Оның loopback-ы атаулар кеңістігіне тиесілі, сондықтан басқа машинадағы клиенттің портқа жететін мекенжайы жоқ. Бір әдейі секіріс немесе бір veth жұбы хосттың қалған бөлігін жылжытпай-ақ мұны түзетеді.
Неге LAN мекенжайында ештеңе жауап бермейді
Атаулар кеңістігі — толық желілік стек: интерфейстер, маршруттар, firewall ережелері және жеке loopback. ip netns exec арқылы іске қосылған процесс тек осы стекті көреді, сондықтан ол байланысатын мекенжай тек атаулар кеңістігінің ішінде шешіледі. Хосттың өзінің 127.0.0.1 мекенжайы мүлде басқа loopback.
Сондықтан хостта curl сәтсіз аяқталады, ал атаулар кеңістігінің ішінде сол команда сәтті орындалады. Қолданба сау; мекенжай хосттың стегінде жай ғана жоқ.
Бір портты socat секірісімен жариялаңыз
socat екі стекті пайдаланушы кеңістігінде жалғайды, бұл бір TCP порты өтуі керек кезде жеткілікті. Хост жағы LAN-да тыңдайды және қабылданған әр қосылым үшін атаулар кеңістігінің ішінде қолданбаның loopback-ына қосылатын екінші socat іске қосады. Ішкі процесс қолданбаға дәл жергілікті клиент сияқты жетеді. Атаулар кеңістігінің маршруттауында ештеңе өзгермейді, сондықтан қолданба туннельді жалғыз шығу жолы ретінде пайдалана береді.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
Сыртқы процесс үшін root немесе атаулар кеңістігіне кіру мүмкіндігі қажет. VPN үзілсе, қолданба жолын жоғалтады және жарияланған порт жабық күйде сәтсіз аяқталады, ал түрмеден дәл осы мінез-құлықты күтесіз.
Бір порттан көп өтсе, veth жұбын пайдаланыңыз
Бірнеше порт немесе протокол өтуі керек болса, немесе басқа хосттар қосылымдарды бастауы керек болса, veth жұбы дұрыс жауап. Бір ұшы хостта қалады, екіншісі атаулар кеңістігіне көшеді, ал кішкентай /30 екі жаққа тұрақты мекенжай береді. Содан кейін хост маршруты атаулар кеңістігінің мекенжайын жұп арқылы жібереді.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns vpn
ip addr add 10.77.0.1/30 dev veth0
ip link set veth0 up
ip netns exec vpn ip addr add 10.77.0.2/30 dev veth1
ip netns exec vpn ip link set veth1 up
Түрмені бұзуға ниетіңіз болмаса, хост арқылы әдепкі маршрут қоспаңыз. Туннель шығу жолы болып қалуы керек, сондықтан жұп арқылы тек жарияланған қызмет мекенжайына қол жеткізуге болады. Атаулар кеңістігіне өзінің resolver файлын да беріңіз, өйткені ip netns exec /etc/netns/vpn/resolv.conf файлын оқиды, ал онсыз түрме ішіндегі атауларды шешу бос.
Хосттан емес, басқа машинадан сынаңыз
Тестті екінші машинадан іске қосыңыз, өйткені хост жергілікті тыңдаушыға LAN туралы ештеңе айтпайтын жолдармен жете алады. Алдымен қолданбаның атаулар кеңістігінің ішінде шын мәнінде неге байланғанын тексеріңіз, содан кейін сырттан жарияланған мекенжайға қосылыңыз. Онда барлық мекенжайға байланысу түрмені кеңейтпейді, өйткені wildcard әлі де атаулар кеңістігіне тиесілі және LAN оны көре алмайды.
ip netns exec vpn ss -lntp
Хосттан қосылым жұмыс істеп, LAN-нан қосылым істемесе, жетіспейтін бөлік — секіріс немесе маршрут, байланысу мекенжайы емес. Тірі tun құрылғысын ішіне көшірудің орнына атаулар кеңістігінің ішінде OpenVPN іске қосыңыз, өйткені интерфейсті көшіру оны өшіреді және кейін сырттан жөндей алмайтын маршруттарды жоюы мүмкін. Қалпына келтіру командаларын түрменің ішінде емес, консольде ұстаңыз.