Blokir satu klien OpenVPN dari LAN tanpa menghentikan tunnel
Sematkan alamat tunnel klien ke sertifikatnya, buang lalu lintas LAN-nya di kepala FORWARD, lalu verifikasi IPv6, sesi yang dilacak, dan ketahanan setelah reboot.
Satu klien di server OpenVPN Anda harus kehilangan akses LAN sementara semua tunnel lain tetap hidup. Jika Anda mencarinya, jawaban teratas biasanya mengatakan daemon tidak bisa melakukannya, yang hanya setengah benar: OpenVPN tidak punya firewall per klien, tetapi host yang menerminasi tunnel sudah memfilter paket. Dua keputusan yang penting adalah identitas yang Anda blokir dan posisi aturannya. Jika keduanya benar, perubahannya menjadi satu baris yang bisa Anda uji dan hapus.
Sematkan klien sebelum menulis aturan
OpenVPN menyewakan alamat tunnel dari kumpulan, jadi 10.8.0.6 adalah kursi, bukan orang. Saat sesi berakhir, sewa kembali dan bisa diberikan ke koneksi berikutnya, artinya aturan yang ditulis terhadap alamat itu mengikuti kursi, bukan pengguna. Jadi putuskan dulu apa yang sebenarnya Anda blokir: alamat untuk percobaan singkat, atau sertifikat untuk seseorang yang ingin Anda jauhkan.
Untuk mengikat alamat ke sertifikat, buat berkas di direktori yang disebut client-config-dir dan beri berkas itu common name sertifikat dengan tepat. Taruh satu direktif di dalamnya, ifconfig-push 10.8.0.6 255.255.255.0, dan klien itu mempertahankan alamat tunnel yang sama saat menyambung ulang. Dua pengaturan harus ada agar ini berlaku: client-config-dir harus dideklarasikan di konfigurasi server, dan alamat yang dikirim harus berada di subnet yang bisa dirutekan server. Jika satu hilang, berkas diabaikan tanpa kesalahan, yang membuat uji firewall berikutnya menyesatkan.
Blokir sementara bisa memakai alamat dari kumpulan, asalkan tiket mencatat sesi mana yang memegangnya saat itu.
Urutan menentukan apakah pembuangan berjalan
Pada gateway Linux yang meneruskan antara tunnel dan LAN, paket melewati rantai FORWARD. Baca perintah di bawah sebagai kalimat: sisipkan di kepala FORWARD, cocokkan lalu lintas yang masuk dari tun0, dari host tunggal itu, yang dialamatkan ke subnet LAN, lalu buang.
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP-I adalah yang membuat aturan berjalan. Jika ditambahkan dengan -A, aturan itu mendarat di bawah penerimaan luas mana pun untuk subnet tunnel dan tidak pernah melihat paket. Verifikasi posisinya dengan iptables -vnL FORWARD --line-numbers, dan baca penghitungnya juga: pembuangan di atas yang tidak menghitung apa pun berarti lalu lintas datang lewat jalur lain.
Alamat LAN gateway itu sendiri adalah jalur lain. Paket yang dikirim ke kotak itu masuk ke INPUT, bukan FORWARD, jadi klien bisa kehilangan host LAN dan tetap membuka halaman admin router. Tambahkan aturan INPUT yang cocok saat itu penting.
Apa yang tidak bisa dilihat filter
Pemfilteran terjadi saat paket dievaluasi, jadi sesi TCP yang sudah terbentuk bisa berlanjut sampai ditutup atau direset. Jika blokir harus berefek segera, bersihkan aliran yang dilacak untuk sumber itu dengan conntrack -D -s 10.8.0.6 setelah aturan dipasang. Jika beberapa detik tumpang tindih dapat diterima, catat pilihan itu alih-alih membiarkannya implisit. Bagaimanapun, orang berikutnya perlu tahu apakah aturan menghentikan lalu lintas hidup atau hanya koneksi baru.
Lalu lintas antar-peer tidak pernah menyentuh firewall host. Dengan client-to-client aktif, OpenVPN meneruskan paket itu di dalam daemon, jadi FORWARD maupun INPUT tidak melihatnya. Satu-satunya perbaikan adalah mematikan client-to-client atau menerima bahwa peer bisa saling menjangkau; aturan iptables tidak akan melihat lalu lintas itu.
IPv6, firmware, dan ketahanan setelah reboot
Aturan IPv4 tidak mengatakan apa pun tentang IPv6. Jika tunnel dan LAN membawa kedua keluarga, aturan padanannya harus ada di ip6tables, atau di kumpulan aturan nftables yang memiliki kebijakan di host itu. Firmware router sering menyembunyikan netfilter di balik abstraksinya sendiri, jadi sintaksis dan nama tabel yang disalin dari forum mungkin tidak berlaku.
Di OpenWrt, jalur yang didokumentasikan adalah entri konfigurasi firewall, bukan baris iptables yang ditulis tangan, dan baris tulisan tangan bisa hilang saat firewall dimuat ulang. Distribusi lain memulihkan aturan lewat netfilter-persistent, unit boot, atau penyimpanan vendor, dan mekanisme itu tidak bisa saling ditukar. Buktikan yang Anda pilih dengan reboot, karena muat ulang melatih jalur yang berbeda.
Verifikasi per jalur, lalu kembalikan dengan bersih
Uji setiap jalur secara terpisah, karena satu pemeriksaan yang berhasil menyembunyikan yang lain. Klien yang diblokir harus tetap mencapai internet lewat tunnel tetapi gagal terhadap host LAN, klien kedua harus mencapai host yang sama, dan alamat gateway serta jalur peer masing-masing perlu pengamatan sendiri. Tulis hasilnya di samping aturan agar perubahan berikutnya punya garis dasar. Tabel di bawah adalah himpunan yang layak disimpan di tiket.
| Jalur | Diharapkan dengan aturan | Saat gagal |
|---|---|---|
| Klien diblokir ke host LAN | Tidak ada jawaban | Aturan berada di bawah penerimaan, atau sumber tidak cocok |
| Klien diblokir ke internet | Bekerja lewat tun0 | Aturan terlalu luas, tanpa kecocokan tujuan |
| Klien kedua ke host LAN yang sama | Bekerja | Aturan cocok lebih dari host yang dimaksud |
| Klien diblokir ke alamat LAN gateway | Diblokir hanya dengan aturan INPUT yang cocok | Aturan INPUT hilang |
| Klien diblokir ke alamat tunnel peer | Masih bekerja | client-to-client aktif dan di luar jangkauan firewall |
Mengembalikan adalah penghapusan menurut spesifikasi, bukan flush: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP menghapus persis entri itu dan membiarkan sisa rantai utuh. Hapus baris yang sama dari berkas mana pun yang memulihkan aturan saat boot, muat ulang, dan pastikan klien mencapai host LAN lagi. Flush FORWARD juga akan membatalkan aturan yang tidak Anda tulis, yang mengubah pengembalian menjadi insiden kedua.
Sebelum menutup tiket, pastikan tiga hal: alamat yang disematkan cocok dengan sertifikat, aturan berada di atas penerimaan dengan penghitung bukan nol, dan berkas persistensi berisi aturan yang sama yang Anda uji. Jika salah satunya hilang, blokir itu ilusi dalam sesi shell.