iptables: izinkan klien VPN mencapai satu host saja
Aturan yang Anda butuhkan ada di FORWARD, bukan INPUT. Izinkan satu tujuan untuk kumpulan VPN, tolak sisanya, lalu buktikan dengan penghitung dan perintah pembatalan.
Dua tiket dukungan yang tampak tidak berhubungan ternyata berbagi satu penyebab. Pada yang pertama, administrator ingin server hanya menerima koneksi dari terowongan; pada yang kedua, pengguna VPN harus menjangkau satu host internal dan tidak lebih. Kedua kebijakan berada di FORWARD, dan keduanya biasanya dicoba di INPUT. Hasilnya tampak seperti firewall dan berperilaku seperti pengganti sementara.
Rantai mana yang menjawab pertanyaan Anda
Paket yang dikirim klien VPN ke host di LAN, atau lebih jauh ke internet, diteruskan oleh kernel dan dievaluasi di FORWARD. INPUT dan OUTPUT hanya melihat lalu lintas yang berakhir di server itu sendiri atau berasal darinya. Karena itu, penolakan untuk apa pun yang tidak tiba di tun0 melindungi pendengar milik server, dan juga akan mengakhiri sesi SSH Anda kecuali aliran yang sudah terbentuk diizinkan lebih dulu. Itu tidak mengubah apa pun tentang ke mana klien boleh pergi.
Beri nama pertanyaannya lebih dulu: siapa yang boleh menjangkau server, atau ke mana klien boleh pergi. Sebagian besar jaringan memerlukan kedua jawaban, di rantai yang berbeda.
Dahulu keadaan, lalu izin, lalu penolakan
Daftar izin hanya berfungsi jika izin spesifik berada di atas penolakan umum dan jika lalu lintas balasan diizinkan di atas keduanya. Sisipkan aturan pada posisi eksplisit, lalu cetak rantainya dengan iptables -S FORWARD agar urutannya terlihat, bukan diasumsikan.
POOL=10.99.0.0/24
iptables -I FORWARD 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD 2 -s "$POOL" -d 172.31.20.15 -p tcp -m multiport --dports 443,3389 -j ACCEPT
iptables -I FORWARD 3 -s "$POOL" -j REJECTDua detail menentukan apakah ini bertahan saat bertemu lalu lintas nyata. Tanpa aturan keadaan, balasan atas koneksi yang baru Anda izinkan sendiri dievaluasi terhadap penolakan dan dibuang. Aturan LOG tanpa batas dapat memenuhi partisi kecil saat pemindaian pertama mengenainya, jadi tambahkan -m limit --limit 10/min sebelum Anda melanjutkan pencatatan. REJECT mengembalikan galat segera, yang lebih ramah saat Anda menyetel daftar; DROP membuang tanpa suara, sehingga setiap kesalahan tampil sebagai waktu tunggu habis. Pilih satu dengan sengaja dan tuliskan pilihan itu di catatan perubahan.
Penerusan dan NAT harus sudah berfungsi
Pemfilteran tidak dapat membuktikan bahwa jalur itu ada. Pastikan dulu bahwa kernel meneruskan sama sekali, dan buat pengaturan itu permanen, bukan perintah shell sekali pakai. Filter adalah lapisan terakhir, bukan yang pertama.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s "$POOL" -o eth0 -j MASQUERADEDi mana penyamaran berada bergantung pada dari mana klien keluar. Jika mereka keluar menuju jaringan jauh melalui terowongan, aturan NAT diletakkan pada antarmuka itu, bukan antarmuka WAN. Lalu perhatikan penghitung: jika penghitung POSTROUTING tidak pernah bergerak sementara jumlah penerimaan di FORWARD naik, jalur balik rusak dan filternya baik. Pembacaan itu menghemat satu sore untuk menulis ulang aturan yang tidak pernah menjadi masalah.
Blok surat berada satu rantai lebih jauh
Memblokir porta 25 di INPUT hanya menghentikan surat yang dialamatkan ke server VPN. Klien yang telah disusupi dan mengirim surat melalui terowongan akan diteruskan, jadi blok itu harus berada di FORWARD di samping 465 dan 587. Jika satu aplikasi meneruskan surat secara sah, letakkan tujuan dan portnya di atas aturan itu.
iptables -I FORWARD 2 -s "$POOL" -p tcp -m multiport --dports 25,465,587 -j REJECTBiarkan penghitung penolakan berjalan seminggu sebelum Anda mengencangkan hal lain. Angka yang berhenti naik adalah aliran sah yang baru saja Anda rusak.
Baca kembali, lalu buktikan dari klien
Baca kumpulan aturan sebagaimana dilaporkan kernel, bukan sebagaimana skrip Anda menulisnya. Mulai dengan iptables -S FORWARD, lalu tabel NAT dengan iptables -t nat -L POSTROUTING -n -v, lalu entri conntrack untuk aliran yang Anda uji. Simpan perintah pembatalan atau pembersihan terjadwal selama pekerjaan berlangsung. Setiap pemanggilan memerlukan -w, jika tidak dua administrator akan bertabrakan pada kunci xtables. Tidak satu pun dari itu opsional selama jendela perubahan.
Akhiri dengan menguji dari klien di dalam kumpulan dan dari klien di luarnya. Aturan yang hanya berfungsi dari mesin tempat Anda mengetiknya bukanlah kebijakan.