Pada satu laptop, dengan satu klien VPN terhubung, kontainer Linux terus saling berbicara sementara kontainer Windows berhenti. Variabelnya bukan image, melainkan jalur yang dilalui paket masuk ke host. Kontainer Windows di jaringan default meminjam tabel rute dan terjemahan host, sehingga kebijakan yang mengubah perutean host juga mengubahnya. Pastikan itu dengan pencarian rute sebelum memasang ulang apa pun.

Dari mana paket kontainer Windows masuk ke host

Kontainer di jaringan default nat mendapat alamat dari prefiks layanan Host Networking Service, biasanya di suatu tempat dalam 172.16.0.0/12, dan mencapai host melalui adaptor virtual. Host memiliki rute untuk prefiks itu dan menerjemahkan lalu lintas ke adaptor yang sedang aktif. Tidak ada mesin virtual terpisah di tengah jalur tersebut.

Desain itulah yang membuat kegagalannya mekanis. Saat kontainer mengirim paket, host melakukan pencarian rute untuk prefiks kontainer. Rute mana pun yang menang, ke sanalah paket pergi, dan kontainer tidak punya pendapat soal itu.

Apa yang diubah klien VPN pada jalur itu

Klien korporat sering memasang banyak rute dan filter yang menolak akses ke subnet lokal selama terowongan aktif. Niatnya bersifat bertahan: jaringan lokal yang disusupi tidak boleh mencapai mesin yang dilindungi. Efek sampingnya adalah rute host ke prefiks kontainer bukan lagi jaringan NAT lokal.

Sebagai gantinya, pencarian cocok dengan terowongan dan paket diserahkan ke gateway, yang tidak pernah mendengar alamat kontainer itu. Ping gagal, aplikasi kehabisan waktu, dan kontainer tampak rusak sementara ikon VPN menyala. Lihat tabel host saat terhubung dan rute pesaingnya terlihat.

Container modeOutbound pathTypical result behind the VPN
Windows, default natHost routes and translates container trafficContainer prefix follows the tunnel and fails
Windows, transparentContainer sits on the physical linkDepends on the local subnet being allowed
Linux engine on Docker DesktopVM egress proxied by a host processOften keeps working

Mengapa kontainer Linux berperilaku berbeda

Mesin Linux menjalankan kontainer di dalam mesin virtual ringan, dan koneksi keluar dari mesin itu dibuka oleh proksi di sisi host atas nama kontainer. Host yang memulai soket, jadi aturan VPN tentang prefiks kontainer tidak berlaku padanya dengan cara yang sama, dan beban kerja tetap mencapai jaringan.

Perbedaan itu juga menjelaskan mengapa resep Linux tidak bisa dipindahkan. Kontainer Linux yang butuh terowongannya sendiri diberi perangkat TUN plus kemampuan NET_ADMIN. Kontainer Windows tidak mengekspos antarmuka apa pun sebagai perangkat, jadi pola itu tidak punya padanan di sisi itu.

Buktikan rutenya, lalu pilih desain

Kumpulkan bukti dari host, bukan dari kontainer, karena host yang melakukan pencarian:

docker network inspect nat --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"
route print -4
Get-NetRoute -AddressFamily IPv4 | Where-Object DestinationPrefix -like "172.16.*"

Jalankan keluaran rute sekali sebelum VPN terhubung dan sekali sesudahnya. Jika pada keluaran kedua prefiks kontainer menunjuk ke adaptor terowongan, diagnosis selesai dan memulai ulang kontainer tidak akan menolong.

Opsi pertama adalah keputusan kebijakan: tanyakan kepada pemilik jaringan apakah akses LAN lokal dapat diizinkan untuk perangkat ini. Beberapa klien korporat menyediakannya sebagai pengaturan, tetapi itu melemahkan batas yang disengaja. Mintalah sebagai pengecualian terdokumentasi dengan pemilik dan tanggal tinjauan. Sakelar per perangkat yang tidak pernah ditinjau lagi adalah cara kebijakan bertahan menghilang diam-diam.

Di tempat kebijakan harus bertahan, pindahkan beban kerja alih-alih melawan rute. Jaringan transparan dengan subnet dan gateway eksplisit menempatkan kontainer pada tautan lokal, beban kerja Linux berjalan di belakang proksi mesin virtual, dan mesin virtual terpisah dengan kliennya sendiri mempertahankan kebijakannya sendiri. Pilih satu dengan sengaja dan ujilah dari dalam kontainer, karena di sanalah permintaan pengguna berasal.

Artikel terkait