Squid menjawab permintaan CONNECT dengan baris http_access pertama yang sepadan, dan baris itu boleh menjadi penolakan. Fakta tunggal ini menjelaskan mengapa pengecualian untuk titik akhir VPN biasanya gagal pada percubaan pertama, kerana permintaan itu tidak pernah sampai kepada kebenaran yang ditambahkan seseorang di bahagian bawah. Pembetulan yang sempit mengekalkan pengawal port sedia ada dan mengajar mereka satu sumber, destinasi dan port yang telah disemak. Semua yang lain pada proksi berkelakuan sama seperti sebelum ini.

Bagaimana Squid memutuskan permintaan CONNECT

Permintaan CONNECT menamakan hos dan port, dan Squid menelusuri baris http_access mengikut urutan sehingga salah satunya sepadan. Penolakan yang sepadan menamatkan penilaian serta-merta dan klien menerima 403 daripada proksi. Itulah sebabnya kedudukan sesuatu peraturan lebih penting daripada rumusannya. Mengalihkan baris yang sama satu langkah ke atas boleh mengubah hasilnya sepenuhnya.

Pengawal lazim menolak apa-apa di luar Safe_ports dan menolak CONNECT di luar SSL_ports. Nama-nama itu ialah ACL yang ditakrifkan dalam konfigurasi anda sendiri, jadi kandungannya milik anda dan bukan protokol. Sesuatu pengedaran mungkin membenarkan julat port yang luas sebagai Safe_ports sambil mengehadkan CONNECT secara berasingan. Baca nilai langsung sebelum menganggap sesuatu port disekat mengikut reka bentuk.

Sahkan proksi ialah komponen yang menolak permintaan itu. 403 yang dijana oleh Squid sama sekali tidak menyerupai amaran TLS daripada pelayan VPN, dan menggabungkan kedua-duanya menjadi satu masalah memakan jam pertama. Periksa baris log akses untuk permintaan itu, kerana ia merekodkan tindakan serta peraturan yang menghasilkannya.

Bina satu padanan gabungan dan bukannya tiga ACL longgar

Bina pengecualian daripada tiga fakta: julat sumber yang diluluskan, satu alamat destinasi yang diluluskan dan satu-satunya port tempat titik akhir mendengar. Dua ACL longgar dan satu padanan gabungan menghasilkan dasar yang sangat berbeza, kerana yang dinilai ialah gabungannya. Namakan ACL gabungan itu berdasarkan apa yang dibenarkannya, bukan berdasarkan kaedah yang dibawanya.

Bentuk di bawah menggunakan julat dokumentasi yang mesti diganti dengan nilai yang telah disemak. Squid tidak menyimpan mana-mana nama ini untuk dirinya, jadi anda yang memilih dan anda yang mengekalkannya konsisten. Resipi ini terhad kepada Squid 6 dan 7, yang konfigurasi terdokumentasinya menyokong kumpulan all-of. Rujukan semasa menandakan arahan itu sebagai tidak tersedia dalam Squid 8, jadi anggap ini sebagai resipi terikat versi dan bukan laluan migrasi, dan semak arahan itu dalam rujukan keluaran anda sendiri sebelum menggunakannya.

acl pvpn_src src 192.0.2.128/25
acl pvpn_dst dst 198.51.100.77/32
acl pvpn_port port 1194
acl pvpn_ok all-of CONNECT pvpn_port pvpn_dst pvpn_src

Kumpulan all-of hanya sepadan apabila setiap ahli sepadan, bermakna sumber, destinasi dan port diperiksa pada satu baris. Kumpulan itu sendiri tidak memberikan apa-apa, dan permintaan yang hanya sepadan dengan dua daripada tiga fakta tidak dapat memenuhinya. Sifat itu mengekalkan pengecualian itu sempit apabila seseorang menambah gerbang kedua kemudian. Sama ada destinasi baharu ditambah dengan sengaja, atau permintaan itu kembali kepada pengawal asal.

Lenturkan pengawal port tanpa membuangnya

Pada kedudukan mereka sekarang, dua baris pengawal lazim kelihatan seperti ini. Kedua-duanya biasanya terletak selepas pengesahan dan sebelum baris dasar yang membenarkan apa-apa.

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

Tambahkan padanan gabungan yang dinafikan pada setiap satu, supaya pengecualian yang sepadan bertahan melepasi pengawal yang jika tidak akan menolaknya. Hanya baris pengawal berubah, dan masing-masing hanya dengan satu terma tambahan.

http_access deny CONNECT !SSL_ports !pvpn_ok
http_access deny !Safe_ports !pvpn_ok

Terma pada satu baris akses digabungkan, jadi baris itu kini hanya menolak permintaan yang gagal pada pemeriksaan asal dan pada pengecualian sekali gus. Permintaan untuk titik akhir yang diluluskan lulus, dan setiap permintaan lain mengekalkan tingkah laku port yang lama. Ini lebih sempit daripada menambah port itu ke senarai SSL_ports global, yang akan membenarkan port itu kepada setiap destinasi. Jika port itu sudah ada dalam senarai tersebut, ACL ini tidak menyempitkan apa-apa dan kebenaran lama yang lebih luas masih terpakai kepada destinasi lain, jadi baca senarai langsung sebelum mendakwa pengecualian itu membuka port. Ia juga boleh diterbalikkan, kerana dua baris kembali kepada bentuk sebelumnya. Rujukan kawalan akses mendokumenkan susunan dan pengawal lazim yang menjadi sandaran perubahan ini.

Di mana pengecualian tidak boleh diletakkan

Godaan ialah meletakkan kebenaran di atas pengawal dan selesai. Peletakan itu juga melangkau perlindungan pengesahan dan destinasi tempatan yang biasanya berada dekat puncak konfigurasi yang berfungsi. Hasilnya bukan pengecualian sempit, tetapi lubang dengan komen di atasnya. Kekalkan sebarang kebenaran baharu pada peringkat yang disemak sama seperti bahagian lain dasar klien.

Periksa apa lagi yang diperlukan oleh permintaan selepas pengawal port. Akaun yang disahkan, alamat klien yang dibenarkan dan dasar destinasi semuanya masih terpakai, dan pengecualian itu tidak mengubah satu pun daripadanya. Jika proksi anda sudah membenarkan akaun yang diluluskan mencapai destinasi sewenang-wenangnya, pengawal port itu tidak pernah menjadi kawalan sebenar.

Pertimbangkan sama ada titik akhir itu TCP. Pengecualian CONNECT membawa aliran TCP, dan profil OpenVPN yang menggunakan UDP tidak akan menjadi boleh dicapai melaluinya. Tukar profil kepada TCP hanya jika pelayan mendengar begitu dan pengendali menerima perbezaan tingkah laku itu.

Periksa sempadan dengan penghurai dan permintaan sebenar

Huraikan konfigurasi sebelum memuat semula, dan biarkan sesi kedua terbuka semasa melakukannya. Ralat sintaks semasa memuat semula boleh membiarkan proksi pada konfigurasi lama atau menolak yang baharu sepenuhnya. Penghurai melaporkan baris yang ditolak, yang lebih banyak daripada apa yang akan diberitahu oleh ralat klien.

Kemudian muat semula dan hantar satu CONNECT sebenar melalui proksi daripada sumber yang diluluskan. Larian penghurai datang dahulu, kerana memuat semula dengan kesilapan menaip tidak mengajar apa-apa tentang dasar itu.

squid -k parse
squid -k reconfigure
curl -v -p -x http://proxy.lab.internal:3128 https://vpn.lab.internal:1194/ --max-time 5

Uji tiga kes: sumber dan akaun yang diluluskan, sumber yang tidak diluluskan, dan destinasi berbeza pada port yang sama. Kes ketiga ialah yang membuktikan pengecualian itu sempit, kerana ia melatih port itu tanpa padanan destinasi. Baca log akses untuk ketiga-tiganya dan bukannya mempercayai mesej klien. CONNECT yang berjaya membina satu aliran TCP dan tidak lebih, jadi jabat tangan VPN kekal sebagai ujian berasingan.

Artikel berkaitan