Tiga hos Linux, satu reka bentuk: hab OpenVPN yang boleh dicapai secara awam, komputer riba pengguna dan mesin pintu keluar di belakang penghalang rumah biasa yang tidak meneruskan apa-apa ke dalam. Pintu keluar menghubungi hab itu sendiri. Kemudian trafik internet pengguna masuk ke terowong di komputer riba dan keluar melalui pautan atas pintu keluar sendiri. Semua yang mengejutkan dalam susunan ini datang daripada satu perincian: pintu keluarlah yang memulakan sambungan, jadi laluan ke dalam sudah wujud dan tiada pemajuan port diperlukan untuk menciptanya.

Yang berikut menjejaki laluan paket dan bukan susunan konfigurasi, kerana konfigurasi hanya bermakna setelah anda tahu komponen mana memiliki keputusan yang mana. Setiap lapisan memiliki tepat satu keputusan, dan kesilapan berkumpul di tempat dua lapisan dianggap satu.

Dua sesi pengangkutan, satu laluan dalaman

Setiap hos menyimpan sambungan luarannya sendiri ke hab, dan tiada satu pun sambungan itu tahu tentang yang lain. Trafik pengguna ke internet ialah aliran dalaman berasingan yang kebetulan dibawa di dalam terowong pengguna dan kemudian dipancarkan semula dari terowong pintu keluar. Aliran dalaman itulah yang perlu dihalakan oleh hab, dan itulah yang perlu diteruskan oleh pintu keluar.

outer: consumer --TLS--> hub
outer: exit     --TLS--> hub
inner: consumer --tun--> hub --internal--> exit --tun--> uplink

Oleh sebab kedua-dua sambungan luaran keluar dari sisi klien, penghalang pintu keluar tidak pernah melihat SYN masuk dan tidak pernah memerlukan peraturan NAT destinasi. Ia hanya perlu memastikan pengangkutan yang telah ditetapkan kekal hidup, yang sudah dilakukannya untuk mana-mana sambungan jangka panjang. Tiada apa-apa di internet awam perlu sampai ke pintu keluar dahulu, itulah sebabnya alamat dinamik pada pautan atas itu bukan masalah. Penghalang masih perlu membenarkan sesi keluar, tetapi itu kebenaran yang sama yang sudah digunakan oleh pelayar.

Apa yang sebenarnya dipasang iroute di dalam pelayan

Hab ialah satu-satunya peranti yang memutuskan rakan mana memiliki destinasi mana, dan ia membuat keputusan itu dalam jadual penghalakan ruang penggunanya sendiri, bukan dalam jadual kernel. Entri client-config-dir untuk pintu keluar bernama exit-node boleh menuntut awalan lalai di situ:

# /etc/openvpn/server/ccd/exit-node
iroute 0.0.0.0 0.0.0.0

Baris itu memberitahu proses pelayan "paket dalaman dengan apa-apa destinasi milik klien ini". Ia tidak menambah laluan lalai pada sistem pengendalian hab dan tidak menjadikan hab sebagai get laluan internet. Rujukan OpenVPN 2.6 mengekalkan penghalakan dalaman khusus klien dan penghalakan kernel sebagai mekanisme berasingan, dan pemisahan itulah sebabnya reka bentuk ini berfungsi tanpa menyentuh laluan lalai hab.

Pengguna memerlukan arahan cermin, dihantar sebagai push, supaya trafiknya sendiri masuk ke terowong dan bukan keluar melalui get laluan tempatannya. Dengan topologi subrangkaian, kumpulan itu ialah laluan bersambung pada peranti tun pintu keluar, jadi arah balik tidak memerlukan push tambahan; apa yang tidak boleh diterima oleh pintu keluar ialah pengubahan hala di bawah, yang akan menghantar trafik pautan atasnya sendiri kembali ke terowong yang cuba digunakannya. Hantarkannya hanya kepada pengguna dan baca laluan yang digunakan pada klien dan bukan mempercayai bahawa fail CCD telah dipilih.

# /etc/openvpn/server/ccd/consumer-01
push "redirect-gateway def1"

Kernel pintu keluarlah yang melakukan pemajuan

Di dalam pintu keluar, paket daripada pengguna tiba di antara muka tun yang dialamatkan kepada sesuatu hos internet. Kernel merujuk jadual penghalakannya, menjumpai pautan atas sebenar sebagai padanan terbaik dan kemudian menggunakan dua dasar berasingan: bolehkah paket ini dimajukan sama sekali, dan bolehkah ia keluar melalui antara muka itu dengan alamat sumber itu. Pemajuan ialah sysctl, dan ia dimatikan secara lalai pada banyak edaran.

Jadi pintu keluar memerlukan pemajuan IPv4 yang dihidupkan secara berterusan, peraturan yang menerima sumber terowong pengguna ke arah pautan atas, dan laluan jawapan kembali melalui tun. Menghidupkan pemajuan untuk seluruh hos juga mengubah tingkah laku apa-apa lagi yang dihalakan melaluinya, sebab itu peraturan itu harus menamakan sumber dan antara muka dan bukannya menerima semuanya.

Laluan balik dibeli oleh terjemahan sumber

Hos internet tiada laluan ke alamat 10.90.0.x, jadi jawapan akan digugurkan sebelum sampai ke pintu keluar. Menulis semula sumber ketika paket meninggalkan pautan atas menyelesaikannya, dan penjejakan sambungan membalikkan tulisan semula itu pada laluan pulang.

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 10.90.0.0/24 -o enp1s0 -j MASQUERADE
ip -4 route get 10.90.0.9   # run on the exit: must point at the tun

Peraturan di atas ialah titik permulaan untuk satu antara muka pautan atas, bukan dasar tembok api. Sempitkan sumber kepada peruntukan yang benar-benar anda benarkan, dan asingkan dasar input pintu keluar sendiri supaya penyamaran untuk trafik terowong tidak secara senyap mendedahkan perkhidmatan tempatan. Pada hos dengan alamat pautan atas dinamik, penyamaran juga menyelamatkan anda daripada menjejaki alamat itu secara manual.

Di mana hab boleh menguatkuasakan dan di mana tidak

Dengan client-to-client dan laluan data ruang pengguna tradisional, hab menyerahkan paket dalaman antara rakan di dalam proses pelayan. Ia tidak pernah merentasi rantaian FORWARD kernel hab, jadi peraturan kernel di situ tidak boleh mengehadkan transit antara rakan, betapa telitinya pun ia ditulis. Penguatkuasaan mesti hidup dalam dasar pelayan itu sendiri: siapa yang boleh menyambung, fail CCD mana yang diterimanya, dan sama ada pemilikan lalai pintu keluar diberikan sama sekali.

Sebab itulah iroute lalai ialah keputusan kepercayaan yang luas. Pintu keluar mesti menerima trafik balik daripada alamat internet sewenang-wenangnya secara sah, dan ia mesti mesin yang anda kawal, tampal dan pantau. Memberikan pemilikan yang sama kepada rakan yang anda tidak akan berikan penghalang ialah kesilapan yang diundang oleh reka bentuk ini.

Keahlian ialah kawalan sebenar. Mana-mana klien yang boleh mengkonfigurasi laluannya sendiri boleh cuba menggunakan pintu keluar, jadi mengehadkan siapa yang boleh menyambung, atau rakan mana yang akan dilayani oleh pintu keluar, ialah sebahagian daripada reka bentuk dan bukan fikiran kemudian.

Gagal dengan selamat apabila pintu keluar hilang

Matikan pintu keluar dan pemilikan lalai dalaman hilang bersama sesinya. Yang tidak sepatutnya berlaku ialah hab secara senyap menjadi pintu keluar pengganti: tiada laluan lalai daripada kumpulan VPN ke pautan atas hab, dan tiada peraturan penyamaran luas pada hab yang dengan senang hati akan memajukan trafik yang sama. Uji kegagalan itu dengan sengaja, kemudian uji pemulihan dengan aliran baharu dan bukan halaman yang sudah terbuka.

# on the consumer, with the exit up and then down
ip -4 route get 1.1.1.1
curl -sS -o /dev/null -w '%{http_code}\n' https://example.com

Jika trafik pengguna masih sampai ke internet selepas pintu keluar tiada, sesuatu yang lain membawanya dan sempadan yang anda maksudkan tidak wujud. Perlakukan DNS dan IPv6 juga sebagai keputusan berasingan: laluan IPv4 dengan penyamaran tidak mengatakan apa-apa tentang trafik AAAA, dan penyelesai yang ditolak oleh hab akan menjawab dari tempat pertanyaan itu benar-benar keluar.

Artikel berkaitan