Dua proses OpenVPN berjalan pada sebuah Pi yang menerima pengguna merayau dan sampai ke pembekal huluan pada masa yang sama, dan kedua-duanya hampir tidak berkongsi apa-apa selain perkakasan. Satu mendengar terowong masuk manakala satu lagi mendail ke luar. Setiap satu membaca direktorinya sendiri, dan setiap satu mempunyai mod kegagalannya sendiri. Memulakan semula unit yang salah ialah cara paling biasa pembaikan klien akhirnya menggugat pendengar.

Padankan nama unit dengan direktori yang dimuatkannya

Upstream 2.6 menyediakan dua unit templat, [email protected] dan [email protected]. Templat pelayan bermula di /etc/openvpn/server dan memuatkan %i.conf dari situ. Templat klien bermula di /etc/openvpn/client. Instans bernama roaming boleh wujud di kedua-dua tempat serentak, sebagai pelayan dan sebagai klien, dengan dua konfigurasi tidak berkaitan dan tiada pautan antara keduanya selain rentetan.

Tanya systemd dan bukan sistem fail, kerana pembuat pakej menambah fail tambahan yang boleh mengubah direktori kerja atau argumen yang diterima oleh binari.

systemctl list-units --type=service 'openvpn-*@*'
systemctl cat [email protected]
systemctl show -p WorkingDirectory -p ExecStart [email protected]

Perintah pertama menyenaraikan setiap unit yang dicipta, termasuk yang gagal dan kekal dimuatkan. Perintah kedua mencetak fail unit bersama sebarang penimpaan. Perintah ketiga ialah cara terpantas melihat dua fakta yang menentukan soalan: direktori tempat proses bermula, dan laluan konfigurasi yang diberikan kepadanya.

Putuskan melalui arah paket, bukan nama antara muka

Instans pelayan memiliki soket mendengar dan menerima sambungan. Pengangkutan tersulitnya ialah input tempatan dan output tempatan pada Pi, manakala trafik yang diteruskannya untuk pengguna mengikut laluan penerusan dan mematuhi set peraturan yang berbeza. Instans klien tidak memiliki pendengar dalam erti kata itu: ia mendail rakan setara, jadi pengangkutan tersulitnya ialah output tempatan menuju lapisan bawah.

Perbezaan itu memberitahu anda di mana sesuatu peraturan terletak. Peraturan yang sepadan dengan antara muka dalam rantaian penerusan hanya membenarkan trafik yang sudah dipilih oleh penghalaan; ia tidak pernah memilih laluan. Apabila paket pengguna merayau keluar melalui jalan yang salah, rantaian yang perlu diperiksa ialah forward, bukan output.

Lihat soket sebelum berteori. Pelayan yang terikat pada udp/1194 menunjukkan soket mendengar. Klien menunjukkan persekutuan dengan alamat pembekal dan tiada apa-apa yang mendengar.

ss -lunp | grep openvpn
ss -unp state established '( dport = :1194 or sport = :1194 )'

Laluan lalai satu instans boleh menangkap balasan instans yang lain

redirect-gateway yang ditolak oleh klien huluan memasang laluan lalai yang bersaing dengan segala yang lain pada mesin, termasuk balasan yang dihantar pelayan kepada pengguna merayau. OpenVPN membuat pengecualian untuk alamat rakan setara sendiri supaya terowong kekal boleh dicapai, tetapi pengecualian itu tidak berkata apa-apa tentang telefon di rangkaian hotel.

Gejalanya biasanya tidak simetri. Jabat tangan selesai, klien melaporkan bersambung, dan trafik mati selepas paket balasan pertama. Penghalaan dasar berasaskan sumber, atau tanda paket yang ditetapkan pada instans pelayan dengan --mark, memisahkan kedua-dua aliran; tidak satu pun merupakan set peraturan lengkap dengan sendirinya, dan kedua-duanya memerlukan laluan sah dalam jadual yang mereka pilih.

Uji keputusan tempatan dan bukan keadaan terowong, kerana kernel memilih sumber dan antara muka sebelum OpenVPN melihat paket itu.

ip route get 203.0.113.44
ip rule show

Mulakan semula satu peranan dan buktikan yang lain terselamat

Urutan penting apabila kedua-dua peranan bergantung pada lapisan bawah yang sama. Mulakan semula klien dahulu jika laluan huluan mesti wujud sebelum trafik pengguna boleh diteruskan, dan mulakan semula pelayan dahulu apabila anda hanya menukar pendengarnya atau kolamnya. Walau apa pun, sahkan kedua-dua unit selepas itu, kerana permulaan semula yang gagal boleh membiarkan peranan lain berjalan dengan keadaan lapuk.

Tuliskan syarat berhenti sebelum perubahan: adakah kehilangan terowong huluan menyekat pengguna merayau, atau ia kembali ke pautan atas milik Pi sendiri? DNS dan IPv6 juga memerlukan jawapan yang jelas, kerana penyelesai yang ditolak sering hidup lebih lama daripada laluan yang menjadikannya berguna.

systemctl restart [email protected]
systemctl is-active [email protected]
journalctl -u [email protected] -n 20 --no-pager

Terima perubahan itu hanya apabila tiga perkara berlaku serentak: sambungan masuk baharu selesai, aplikasi yang diteruskan sampai ke destinasinya melalui jalan keluar yang dimaksudkan, dan kedua-dua proses masih melaporkan rakan setara yang dijangka. Jika salah satu daripada tiga itu gagal, anda menukar instans yang salah atau laluan yang salah, dan langkah seterusnya ialah membaca semula unit itu dan bukannya memulakan semula apa-apa yang lain.

Artikel berkaitan