Tujuan skrip ini adalah hanya mengizinkan lalu lintas melalui VPN, kecuali untuk localhost <-> localhost dan lalu lintas SSH yang masuk. Tetapi ketika saya menjalankan skrip melalui SSH saya terputus dan dipaksa untuk me-restart vm. Apa yang salah dengan skrip saya?
#!/bin/bash
iptables -F
#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT
#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
#SSH
Aturan Anda menyiratkan ssh adalah bentuk komunikasi satu arah, padahal sebenarnya tidak. Data sedang dikirim dan dikembalikan.Cara normal untuk menangani ini, karena Anda tidak dapat mengetahui nomor port di sisi klien terlebih dahulu, adalah untuk mengizinkan koneksi yang dianggap "didirikan" atau "terkait" dengan koneksi yang dibuat. Untuk melakukan ini Anda perlu:
Sebelum
DROP
aturan Anda (dan lebih disukai di bagian atas, karena aturan diproses secara berurutan dan keduanya akan berlaku untuk sebagian besar paket).Ada penjelasan tentang bagaimana koneksi TCP menjadi DIDIRIKAN di sini ; pada dasarnya, fakta server membalas paket yang diizinkan oleh
#SSH
INPUT
aturan Anda membuatnya begitu.sumber
-p tcp
membuat perbedaan dalam hal ini, dan melihat penjelasan UDP di halaman berikutnya (itu sama). Intinya adalah bahwa server membalas tanpa mengetahui apakah iptables akan mengizinkannya atau tidak, dan ketika iptables menerima balasan itu dari server pada sistem lokal , ia sekarang melihat lalu lintas di kedua arah (meskipun klien belum), mempertimbangkan koneksi terjalin, dan biarkan jawabannya keluar. "Teknis" di sini bergantung pada firewall yang berada di tengah-tengah kedua pihak.