Бул жумуш станциясынан чыгуучу бир жол — SOCKS прокси, ал эми анын артындагы OpenVPN пайдалуу эч кандай маалыматсыз туташуу убактысы бүткөнүн билдирет. Ошол эле машинадагы браузер ошол прокси аркылуу иштейт, эсептик маалыматтар туура, порт жооп берет. Үч нерсе биринчи текшерүүгө жетиштүү тез-тез айырмаланат: прокси сүйлөгөн SOCKS версиясы, кардар тандаган транспорт жана атты чечүү жүргөн жер. Коргоо дубалын күнөөлөөдөн мурун ар бирин ырастаңыз.

Коргоо дубалынан мурун SOCKS версиясын шайкештештириңиз

Коомдук OpenVPN socks-proxy үчүн SOCKS5 сүйлөйт. Аны SOCKS4 гана сунуш кылган проксиге багыттасаңыз, TCP туташуусу ачылып, анан токтоп калат, анткени кардар экинчи тарап эч качан талдабаган саламга жооп күтөт. Сырттан бул токтоп калуу так чыпкаланган портко окшош, ошондуктан версия жөнүндө суроо каалаган коргоо дубалы эрежесинен мурун турат. SOCKS-ти билген бир тартуу муну бир команда менен чечет.

curl --socks5-hostname 127.0.0.1:9050 gw.lab.example

Бүткөн сурам бир эле учурда эки нерсени далилдейт: прокси SOCKS сурамын кабыл алды жана атты чечти. URL схемасы керек эмес, анткени curl жылаңач хостту HTTP деп эсептейт, бул бул сыноого жетиштүү.

Бул тартуу кардар журналы жашырган бузулушту да жокко чыгарат. Прокси браузерге уруксат берип, ошол эле учурда VPN барагынан баш тарта алат, анда баш тартуу CONNECT этабында, каалаган VPN аутентификациясынан мурун болот. OpenVPN убакыт бүткөнүн гана билдирет, ошондуктан проксинин өз жообу — сизге керектүү далил.

Транспорт эки тарапта тең TCP болушу керек

Бул жерде SOCKS5 TCP агымын алып жүрөт, ошондуктан туннелдин өзүнө proto tcp-client керек. Дагы эле UDP-де турган профиль бул жол менен иштебейт, анткени кардар протоколдун UDP бирикме режимин колдонбойт. Профилди которуу — формалдуулук эмес, чыныгы өзгөрүү: алыс тарап ошол эле портто TCP угуусу керек. Андан кийин жүк TCP ичиндеги TCP болуп, жоголгон сегмент эки жолу кайра жөнөтүлөт жана ылдамдык начарлайт, муну интерактивдүү сессиялар чоң өткөрүүлөргө караганда алда канча көп сезет.

proto tcp-client
remote gw.lab.example 8443
socks-proxy 127.0.0.1 9050

Бул директива прокси хостун, милдеттүү эмес портту жана милдеттүү эмес эсептик маалымат файлын кабыл алат. Аларды профилдин өзүнө коюңуз, ошондо башка жердеги көчүрмө дал ушундай иштейт.

Бүт чынжырды бир контейнерге камаңыз

Чынжырды хостто жасоо — анын демейки маршрутун ээлеп, чечүүчүнү кийин эч ким түшүндүрө албай турган абалда калтыруу. Анын ордуна аттар мейкиндиги же контейнер аны чектейт, ошондуктан хост өз жолун сактайт, ал эми SOCKS кадамы менен туннель чогуу жашайт. Ичинде туннель түзмөгү, аны конфигурациялоо укугу жана жеткиликтүү прокси жок болсо, эч нерсе көтөрүлбөйт. Compose кызматы муну cap_add: NET_ADMIN жана bind-бекитилген /dev/net/tun аркылуу алат.

cap_add:
  - NET_ADMIN
devices:
  - /dev/net/tun:/dev/net/tun

Бул жуп контейнерди привилегиялуу режимде иштетүүдөн тар жана түзмөккө керектүү кирүүнүн баары ушул. Tor кардары же өзүнчө прокси контейнери угуучуну бере алат. Эки учурда тең аны loopback-ке байлап, проксини тармакка чыгарруунун ордуна аттар мейкиндигинен хост аркылуу ага жетиңиз.

Атты чечүү — обочолонуу иштен чыккан жер

Пакеттерди алып жүрүп, бирок хосттун чечүүчүсүнөн сураган туннель эч нерсени обочологон жок. Эки нерсе обочолонууну чыныгы кылат: аттар мейкиндигинин өз чечүүчүсү болушу жана анын суроолору прокси же туннель аркылуу өтүшү, эч качан физикалык интерфейс аркылуу өтпөшү. Сыноо үчүн эки ат колдонуңуз: бири туннелдин артында гана бар, экинчиси ошол эле жол менен жүрүшү керек болгон жалпы ат.

docker compose exec vpn cat /etc/resolv.conf
docker compose exec vpn getent hosts internal.lab.example

Эгер алыс ат чечилип, жалпы ат чечилбесе, чынжыр бузулган эмес, тандамал, жана айырма ар бир суроонун кайсы жол менен жүргөнүн айтат. Экөө тең хосттон чечилип, контейнердин ичинде эч бири чечилбесе, контейнер дагы эле хосттун чечүүчүсүн карызга алат. Табылган чечүүчү файлын жазып алыңыз, анткени өзгөртүлүшү керек параметр — ошол.

Ар бир кадамды ирети менен далилдеңиз

Тизме кыска. SOCKS5 сурамы жооп алат, туннель прокси аркылуу өз угуучусуна жетет, аттар мейкиндигинен чыккан пакеттер алыс тарап күткөн даректи алып жүрөт. Кошумча конфигурация үйүүнүн ордуна ар бирин өзүнчө ырастаңыз. Кардар туташты деп, бирок эч нерсе кыймылдабаса, үзүлүү дээрлик дайыма экинчи же үчүнчү фактыда болот.

curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
docker compose exec vpn ip route get 203.0.113.10
docker compose exec vpn getent hosts internal.lab.example

Иштеген айкалышты жазыңыз: SOCKS версиясы, транспорт, чечүүчү жана аттар мейкиндигинин параметрлери. Бул чынжырды экинчи жолу эстен чечүү жазуудан кымбат. Ошол төрт фактыны билетте кармаңыз, чат агымында эмес.

Туташты деп билдирип, эч нерсе өткөрбөгөн чынжыр адатта сиз далилдегенге чейинки кадамда иштен чыккан. Кийинки катмарды кошуудан мурун ошол кадамды сынап көрүңүз.

Тектеш макалалар