OpenVPN melalui SOCKS5: padankan versi, pengangkutan dan DNS
Rantaian SOCKS gagal apabila versi proksi, pengangkutan atau laluan DNS tidak sepadan. Gunakan SOCKS5, bawa TCP, dan kekalkan rantaian di dalam namespace.
Satu laluan keluar dari stesen kerja ini ialah proksi SOCKS, dan OpenVPN di belakangnya melaporkan tamat masa sambungan tanpa apa-apa yang berguna. Pelayar pada mesin yang sama berfungsi melalui proksi itu, kelayakannya betul, dan portnya menjawab. Tiga perkara cukup kerap berbeza untuk diperiksa dahulu: versi SOCKS yang dituturkan oleh proksi, pengangkutan yang dipilih oleh klien, dan di mana penyelesaian nama berlaku. Sahkan setiap satunya sebelum membuat kesimpulan bahawa tembok api yang bersalah.
Padankan versi SOCKS sebelum tembok api
OpenVPN komuniti menuturkan SOCKS5 untuk socks-proxy. Halakan ke proksi yang hanya menawarkan SOCKS4, sambungan TCP dibuka lalu tersekat, kerana klien menunggu balasan terhadap sapaan yang tidak pernah dihuraikan oleh hujung sana. Dari luar, sekatan itu kelihatan tepat seperti port yang ditapis, sebab itulah soalan versi datang sebelum sebarang peraturan tembok api. Permintaan yang sedar SOCKS menyelesaikannya dalam satu arahan.
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
Permintaan yang selesai membuktikan dua perkara sekali gus: proksi menerima permintaan SOCKS dan ia menyelesaikan nama itu. Tiada skema URL diperlukan, kerana curl menganggap hos kosong sebagai HTTP, yang cukup untuk ujian ini.
Permintaan itu juga menyingkirkan kegagalan yang disembunyikan oleh log klien. Proksi boleh membenarkan pelayar dan masih menolak destinasi VPN, dan dalam kes itu penolakan berlaku di CONNECT, sebelum sebarang pengesahan VPN. OpenVPN hanya melaporkan tamat masa, jadi jawapan proksi sendiri ialah bukti yang anda perlukan.
Pengangkutan mesti TCP di kedua-dua belah
SOCKS5 membawa aliran TCP di sini, jadi terowong itu sendiri memerlukan proto tcp-client. Profil yang masih ditetapkan kepada UDP tidak akan berfungsi melalui laluan ini, kerana klien tidak menggunakan mod persatuan UDP protokol itu. Menukar profil ialah perubahan sebenar, bukan formaliti: hujung jauh mesti mendengar TCP pada port yang sama. Muatan kemudian menjadi TCP di dalam TCP, di mana segmen yang hilang dihantar semula dua kali dan tempo merosot, sesuatu yang sesi interaktif lebih perhatikan berbanding pemindahan besar.
proto tcp-client
remote gw.lab.example 8443
socks-proxy 127.0.0.1 9050
Arahan itu menerima hos proksi, port pilihan dan fail kelayakan pilihan. Letakkan semuanya di dalam profil supaya salinannya berkelakuan sama di tempat lain.
Bataskan seluruh rantaian dalam satu kontena
Melakukan rantaian pada hos bermakna mengambil alih laluan lalai dan meninggalkan penyelesai dalam keadaan yang tiada siapa dapat jelaskan kemudian. Namespace atau kontena membataskannya, jadi hos mengekalkan laluannya sendiri sementara lompatan SOCKS dan terowong tinggal bersama. Di dalamnya tiada apa yang naik tanpa peranti terowong, hak untuk mengkonfigurasinya dan proksi yang boleh dicapai. Perkhidmatan Compose mendapatnya dengan cap_add: NET_ADMIN dan /dev/net/tun yang dipasang bind.
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
Pasangan itu lebih sempit daripada menjalankan kontena dengan keistimewaan, dan itulah keseluruhan akses peranti yang diperlukan. Klien Tor atau kontena proksi berasingan boleh menyediakan pendengar. Dalam kedua-dua kes, ikatkannya pada loopback dan capai dari namespace melalui hos daripada mendedahkan proksi kepada rangkaian.
Penyelesaian nama ialah tempat pengasingan gagal
Terowong yang membawa paket sambil bertanya kepada penyelesai hos tidak mengasingkan apa-apa. Dua perkara menjadikan pengasingan itu nyata: namespace mempunyai penyelesai sendiri, dan pertanyaannya bergerak melalui proksi atau terowong, tidak pernah melalui antara muka fizikal. Gunakan dua nama untuk ujian: satu yang hanya wujud di belakang terowong, dan satu awam yang sepatutnya mengikut laluan yang sama.
docker compose exec vpn cat /etc/resolv.conf
docker compose exec vpn getent hosts internal.lab.example
Jika nama hujung jauh diselesaikan dan yang awam tidak, rantaian itu terpilih dan bukan rosak, dan perbezaannya memberitahu anda laluan mana setiap pertanyaan ambil. Jika kedua-duanya diselesaikan dari hos tetapi tiada satu pun di dalam kontena, kontena masih meminjam penyelesai hos. Catat fail penyelesai yang anda temui, kerana itulah tetapan yang perlu diubah.
Buktikan setiap lompatan mengikut urutan
Senarainya pendek. Permintaan SOCKS5 mendapat jawapan, terowong mencapai pendengarnya melalui proksi, dan paket yang meninggalkan namespace membawa alamat yang dijangka oleh hujung jauh. Sahkan satu demi satu daripada melapisi lebih banyak konfigurasi. Apabila klien berkata bersambung dan tiada apa bergerak, putusnya hampir selalu pada fakta kedua atau ketiga.
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
Catat gabungan yang berjaya: versi SOCKS, pengangkutan, penyelesai dan tetapan namespace. Menyelesaikan rantaian ini kali kedua dari ingatan lebih mahal daripada nota itu. Simpan keempat-empat fakta itu dalam tiket, bukan dalam urutan sembang.
Rantaian yang melaporkan bersambung dan tidak melepaskan apa-apa biasanya gagal pada lompatan yang belum anda buktikan. Uji lompatan itu sebelum menambah lapisan lain.