Kontena terowong anda berfungsi, docker compose exec vpn curl -s https://ifconfig.me menjawab dengan alamat penyedia, namun pelayar di desktop anda masih keluar melalui ISP anda. Jurang itu dijangka. Kontena yang menjalankan klien VPN memegang ruang nama rangkaian, laluan dan antara muka terowong, dan tiada apa yang bertutur HTTP atau SOCKS; menerbitkan port padanya tidak boleh mencipta pendengar yang tidak pernah wujud.

Di mana klien berjalan menentukan reka bentuk. Kontena adik boleh berpindah ke ruang nama terowong, aplikasi desktop tidak boleh, dan penghala memerlukan laluan bukan medan proksi. Salah pemetaan, simptomnya sama: sambungan ditolak, atau trafik yang senyap mengambil laluan lama.

Padankan susunan dengan tempat klien berjalan

Tanya satu soalan sebelum menyunting Compose: bolehkah klien dimulakan di dalam ruang nama rangkaian kontena VPN? Apa sahaja yang sudah berjalan sebagai kontena Linux boleh. Pelayar, IDE atau CLI di meja anda tidak boleh, kerana tetapan proksinya menjangka perkhidmatan protokol, bukan ruang nama.

ClientArrangementWhat must already exist
Another Compose serviceShares the vpn namespace via network_mode: service:vpnA working tunnel and correct start order
Host browser, IDE or CLIProxy listener inside the namespace, published to host loopbackA configured SOCKS or HTTP proxy and its access rules
Router, VM or phoneThe container as a layer-3 gatewayForwarding, NAT and a return route

Ketiga-tiga ini tidak bercampur. Medan proksi HTTP yang menghala ke alamat jambatan kontena tidak mencapai apa-apa melainkan ada proksi mendengar di situ, dan pendengar proksi tidak menghalakan trafik penghala. Tentukan dahulu, kemudian ikut bahagian yang sepadan.

Kongsi ruang nama terowong dengan kontena adik

Ini pilihan termurah kerana tiada protokol proksi terlibat. Aplikasi menyertai ruang nama perkhidmatan vpn dan mewarisi antara muka, laluan dan ruang portnya:

services:
  vpn:
    image: your-vpn-client
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: ["CMD-SHELL", "ip link show tun0 >/dev/null"]
      interval: 10s
      retries: 5
  app:
    image: your-app
    network_mode: service:vpn
    depends_on:
      vpn:
        condition: service_healthy

Tiga sekatan menyusul daripada fakta bahawa ruang nama itu milik perkhidmatan lain. Aplikasi tidak mendapat kunci networks sendiri, kerana ia tidak mempunyai ruang nama untuk dilekati. Penerbitan port terletak pada vpn, kerana di situlah ruang nama tinggal. Dan mencipta semula vpn memusnahkan ruang nama yang disertai aplikasi, jadi docker compose up -d --force-recreate vpn membiarkan anda mencipta semula app juga; mula semula biasa tidak selalu mencukupi. Rujukan perkhidmatan Compose merangkumi susunan ini dan sekatan penerbitan portnya.

Jangan andaikan penyelesai ikut serta. /etc/resolv.conf ialah fail setiap kontena, bukan sebahagian daripada ruang nama rangkaian, jadi aplikasi masih boleh bertanya penyelesai hos sementara paketnya keluar melalui terowong. Bacanya dari dalam kontena dan tetapkan dns: pada aplikasi apabila nama peribadi mesti diselesaikan melalui terowong.

docker compose exec app ip route
docker compose exec app cat /etc/resolv.conf
docker compose exec app curl -s https://ifconfig.me

Jika senarai laluan mengandungi antara muka terowong dan alamatnya milik penyedia, aplikasi berada di dalam terowong. Jika antara muka tiada, app bermula sebelum vpn mempunyai terowong, jadi cipta semula app sebaik sahaja vpn melaporkan sihat.

Letakkan pendengar proksi sebenar dalam ruang nama untuk klien hos

Pelayar desktop tidak boleh menyertai ruang nama, jadi terowong mesti didedahkan sebagai perkhidmatan. Jalankan proksi SOCKS atau HTTP sebenar di dalam ruang nama vpn dan terbitkan hanya portnya:

services:
  vpn:
    ports:
      - "127.0.0.1:1080:1080"
  proxy:
    image: your-proxy
    network_mode: service:vpn
    command: ["--socks", "0.0.0.0:1080"]

Alamat sebelah hos ialah separuh penting pemetaan itu. 127.0.0.1:1080 di kiri menjauhkan pendengar daripada LAN anda; "1080:1080" kosong menerbitkan proksi terbuka kepada setiap peranti yang boleh mencapai mesin anda.

Sebelah kontena ada perangkapnya sendiri. Port yang diterbitkan dihantar ke alamat kontena pada jambatan, bukan ke loopbacknya, jadi proksi yang dimulakan dengan --socks 127.0.0.1:1080 di dalam ruang nama menerima sambungan daripada adik-beradik dan menolak semua yang tiba melalui port terbitan. Ikatkannya pada 0.0.0.0 dan bergantung pada ikatan loopback sebelah hos untuk pengasingan. Peraturan yang sama terpakai pada alamat mendengar dalam fail konfigurasi proksi.

Kemudian tentukan di mana nama diselesaikan. Dalam curl, --socks5 menyelesaikan nama hos secara setempat dan --socks5-hostname menghantar nama ke proksi; pelayar memaparkan suis yang sama di bawah label berbeza. Penyelesaian setempat membocorkan pertanyaan walaupun halaman dimuatkan melalui terowong.

Anggap kontena sebagai get laluan hanya dengan laluan balik

Penghala, VM dan telefon tidak akan menggunakan medan proksi HTTP, dan sesetengah aplikasi mengabaikan pemboleh ubah proksi sepenuhnya. Menghalakan trafik mereka bermaksud lapisan 3: kontena memajukan paket dan menterjemah alamat pada antara muka terowong.

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Dua perkara mudah terlepas. Klien memerlukan laluan yang menghala get laluan lalainya ke hos ini, dan balasan mesti menemui jalan balik, sama ada melalui laluan statik pada penghala hulu atau melalui NAT pada antara muka menghadap klien. Tanpa salah satu, terowong membawa permintaan keluar dan balasan lenyap.

Ia juga mempunyai jejari kesan paling luas. Hos yang menjadi get laluan bagi seluruh LAN menghantar setiap klien tersalah konfigurasi melalui akaun VPN anda, dan terowong yang jatuh sama ada menggelapkan LAN atau kembali ke ISP bergantung pada kill switch.

Sahkan laluan keluar, kemudian gulung balik mengikut urutan

Periksa dalam urutan ini dan berhenti pada kegagalan pertama: alamat keluar di dalam ruang nama, alamat keluar dari hos melalui proksi, kemudian penyelesaian nama untuk hos peribadi.

docker compose exec vpn curl -s https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 http://internal.example/health

Dua alamat pertama harus sepadan dengan penyedia, dan yang ketiga harus diselesaikan melalui proksi dan bukannya gagal dengan ralat nama. Baris pertama sepadan dan baris kedua gagal bermakna pendengar atau port terbitan salah, bukan terowongnya.

Menggulung balik ialah kebalikan persediaan. Buang pemboleh ubah persekitaran proksi daripada profil shell dan daripada mana-mana unit systemd, kemudian turunkan tindanan supaya ruang nama kongsi hilang bersama pemiliknya. Padam port terbitan sebelum memadam perkhidmatan proksi, jika tidak hos menyimpan pendengar loopback yang tiada siapa baca.

Sebelum meneruskan, sahkan empat perkara: klien yang anda pedulikan benar-benar mencapai terowong, hanya pemilik ruang nama menerbitkan port, nama peribadi diselesaikan di tempat yang anda maksudkan, dan tiada apa mendengar pada alamat hos yang bukan loopback. Setiap satunya gagal senyap dalam pengeluaran, dan setiap satunya ialah pemeriksaan satu baris di atas.

Artikel berkaitan