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 иштетиңиз, анткени интерфейсти көчүрүү аны өчүрөт жана кийин сырттан оңдой албаган маршруттарды жок кылышы мүмкүн. Калыбына келтирүү буйруктарын түрмөнүн ичинде эмес, консолдо кармаңыз.