Secara umum:
Melihat dan memodifikasi konfigurasi firewall memerlukan hak administrator ( root
) seperti halnya membuka layanan dalam kisaran nomor port terbatas. Itu berarti bahwa Anda harus masuk sebagai root
atau gunakan alternatif sudo
untuk menjalankan perintah sebagai root. Saya akan mencoba menandai perintah tersebut dengan opsional [sudo]
.
Isi:
- Urutan masalah atau perbedaan antara
-I
dan-A
- Tampilkan konfigurasi firewall saat ini
- Menafsirkan ouput dari
iptables -L -v -n
- Kenali lingkungan Anda
- Rantai INPUT dan FORWARD
- Modul kernel
1. Urutan masalah atau perbedaan antara -I
dan-A
Yang perlu diingat adalah bahwa aturan firewall diperiksa dalam urutan yang terdaftar. Kernel akan berhenti memproses rantai ketika sebuah aturan dipicu yang akan mengizinkan atau menonaktifkan paket atau koneksi.
Saya pikir kesalahan paling umum untuk administrator firewall pemula adalah mereka mengikuti instruksi yang benar untuk membuka port baru, seperti yang di bawah ini:
[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
dan kemudian menemukan bahwa itu tidak akan berpengaruh.
Alasan untuk itu adalah bahwa -A
opsi menambahkan aturan baru, setelah semua aturan yang ada
dan karena sangat sering aturan akhir dalam firewall yang ada adalah yang memblokir semua lalu lintas yang tidak diperbolehkan secara eksplisit, menghasilkan
...
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Atau setara dengan iptables-save:
...
iptables -A INPUT -j REJECT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
dan aturan baru yang membuka port TCP 8080 tidak akan pernah tercapai. (seperti yang dibuktikan oleh penghitung yang tetap membandel pada 0 paket dan nol byte).
Dengan menyisipkan aturan dengan aturan -I
baru akan menjadi yang pertama dalam rantai dan akan berfungsi.
2. Tampilkan konfigurasi firewall saat ini
Rekomendasi saya untuk administrator firewall adalah untuk melihat konfigurasi aktual yang dijalankan kernel Linux, daripada mencoba mendiagnosis masalah firewall dari alat yang ramah pengguna. Seringkali sekali Anda memahami masalah mendasar Anda dapat dengan mudah menyelesaikannya dalam masalah yang didukung oleh alat-alat itu.
Perintahnya [sudo] iptables -L -v -n
adalah teman Anda (walaupun beberapa orang iptables-save
lebih suka ). Seringkali ketika membahas konfigurasi, berguna untuk menggunakan --line-numbers
opsi juga untuk nomor baris. Merujuk ke aturan #X membuat mendiskusikannya agak lebih mudah.
Catatan: Aturan NAT termasuk dalam iptables-save
output tetapi harus terdaftar secara terpisah dengan menambahkan -t nat
opsi yaitu [sudo] iptables -L -v -n -t nat --line-numbers
,.
Menjalankan perintah beberapa kali dan memeriksa penghitung yang bertambah dapat menjadi alat yang berguna untuk melihat apakah aturan baru benar-benar dipicu.
[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 784K 65M fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 15 1384 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num pkts bytes target prot opt in out source destination
Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 117.239.37.150 0.0.0.0/0 reject-with icmp-port-unreachable
2 4 412 REJECT all -- * * 117.253.208.237 0.0.0.0/0 reject-with icmp-port-unreachable
Atau output dari iptables-save
memberikan skrip yang dapat membuat ulang konfigurasi firewall di atas:
[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT
Ini adalah masalah preferensi yang menurut Anda akan lebih mudah dipahami.
3. Menafsirkan ouput dari iptables -L -v -n
The Kebijakan menetapkan tindakan default menggunakan rantai ketika ada aturan eksplisit pertandingan. Dalam INPUT
rantai yang diatur untuk MENERIMA semua lalu lintas.
Aturan pertama dalam rantai INPUT adalah aturan yang menarik, mengirimkan semua lalu lintas (sumber 0.0.0.0/0 dan tujuan 0.0.0.0/0) yang ditujukan untuk port TCP 22 ( tcp dpt:22
) port default untuk SSH ke target kustom ( fail2ban-SSH
) . Seperti namanya menunjukkan aturan ini dikelola oleh fail2ban (produk keamanan yang antara lain memindai file log sistem untuk kemungkinan penyalahgunaan dan memblokir alamat IP dari pelaku).
Aturan itu akan dibuat oleh commandline iptables yang mirip iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
atau ditemukan di output iptables-save as -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Seringkali Anda akan menemukan salah satu dari notasi tersebut dalam dokumentasi.
Penghitung menunjukkan bahwa aturan ini telah cocok dengan 784'000 paket dan 65 Megabita data.
Lalu lintas yang cocok dengan aturan pertama ini kemudian diproses oleh fail2ban-SSH
rantai yang, sebagai rantai non-standar, terdaftar di bawah rantai OUTPUT.
Rantai itu terdiri dari dua aturan, satu untuk setiap pelaku (sumber ip-address 117.253.221.166 atau 58.218.211.166) yang diblokir (dengan a reject-with icm-port-unreachable
).
-A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable
Paket SSH yang bukan berasal dari host yang diblokir belum diizinkan atau tidak diizinkan dan akan sekarang setelah rantai kustom selesai akan diperiksa berdasarkan aturan kedua dalam rantai INPUT.
Semua paket yang tidak diperuntukkan untuk port 22 melewati aturan pertama dalam rantai INPUT dan juga akan dievaluasi dalam aturan INPUT # 2.
Aturan INPUT nomor 2 membuat ini dimaksudkan sebagai firewall statefull , yang melacak koneksi. Itu memiliki beberapa keuntungan, hanya paket-paket untuk koneksi baru yang perlu diperiksa terhadap aturan-set lengkap, tetapi begitu paket-paket tambahan yang dimiliki oleh koneksi yang dibuat atau yang terkait diterima tanpa pengecekan lebih lanjut.
Aturan input # 2 cocok dengan semua koneksi dan paket yang terbuka dan terkait yang cocok dengan aturan itu tidak perlu dievaluasi lebih lanjut.
Catatan: perubahan aturan dalam konfigurasi firewall stateful hanya akan berdampak pada koneksi baru, bukan koneksi yang dibuat.
Sebaliknya, filter paket sederhana menguji setiap paket terhadap aturan-penuh, tanpa melacak status koneksi. Dalam firewall seperti itu tidak ada kata kunci negara yang akan digunakan.
Aturan INPUT # 3 cukup membosankan, semua lalu lintas yang terhubung ke lo
antarmuka loopback ( atau 127.0.0.1) diperbolehkan.
Aturan INPUT 4, 5 dan 6 digunakan untuk membuka port TCP 22, 80 dan 443 (port default untuk resp. SSH, HTTP, dan HTTPS) dengan memberikan akses ke koneksi BARU (koneksi yang ada sudah diizinkan oleh aturan INPUT 2).
Dalam firewall stateless aturan-aturan itu akan muncul tanpa atribut negara:
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
atau
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Aturan INPUT terakhir, # 7 adalah aturan yang memblokir semua lalu lintas yang TIDAK diberikan akses dalam aturan INPUT 1-7. Konvensi yang cukup umum: semua yang tidak diizinkan ditolak. Secara teori aturan ini bisa dihilangkan dengan menetapkan KEBIJAKAN standar untuk MENOLAK.
Selidiki selalu seluruh rantai.
4. Kenali lingkungan Anda
4.1. Pengaturan dalam firewall perangkat lunak tidak akan memengaruhi pengaturan keamanan yang dipelihara di tempat lain dalam jaringan, yaitu meskipun membuka layanan jaringan dengan iptables
daftar kontrol akses yang tidak dimodifikasi pada router atau firewall lain di jaringan Anda mungkin masih memblokir lalu lintas ...
4.2. Ketika tidak ada layanan yang mendengarkan Anda tidak akan dapat terhubung dan mendapatkan koneksi yang ditolak kesalahan , terlepas dari pengaturan firewall. Karena itu:
- Konfirmasikan bahwa suatu layanan mendengarkan (pada antarmuka jaringan / ip-address yang benar) dan menggunakan nomor port yang Anda harapkan
[sudo] netstat -plnut
atau gunakan secara alternatif ss -tnlp
.
- Jika layanan Anda belum berjalan, ikuti pendengar sederhana dengan misalnya netcat:
[sudo] nc -l -p 123
atau openssl s_server -accept 1234 [options]
jika Anda memerlukan pendengar TLS / SSL (centang man s_server
opsi).
- Verifikasi bahwa Anda dapat terhubung dari server itu sendiri yaitu
telnet <IP of Server> 123
atau echo "Hello" | nc <IP of Server> 123
atau saat menguji layanan aman TLS / SSL openssl s_client -connect <IP of Server>:1234
, sebelum mencoba yang sama dari host jarak jauh.
4.3. Pahami protokol yang digunakan oleh layanan Anda. Anda tidak dapat mengaktifkan / menonaktifkan layanan yang tidak Anda mengerti. Contohnya:
- apakah TCP atau UDP digunakan atau keduanya (seperti halnya dengan DNS)?
- apakah layanan menggunakan port default tetap (misalnya sesuatu seperti port TCP 80 untuk server web)?
- alternatifnya adalah nomor port dinamis yang dipilih dapat bervariasi (yaitu layanan RPC seperti NFS klasik yang mendaftar dengan Portmap)?
- FTP yang terkenal bahkan menggunakan dua port , baik nomor port tetap dan dinamis ketika dikonfigurasikan untuk menggunakan mode pasif ...
- deskripsi layanan, port dan protokol
/etc/services
tidak harus sesuai dengan layanan aktual menggunakan port.
4.4. Filter paket kernel bukan satu-satunya hal yang dapat membatasi konektivitas jaringan:
- SELinux mungkin juga membatasi layanan jaringan.
getenforce
akan mengkonfirmasi jika SELinux sedang berjalan.
- Meskipun menjadi Pembungkus TCP sedikit tidak jelas masih merupakan alat yang kuat untuk menegakkan keamanan jaringan. Periksa dengan
ldd /path/to/service |grep libwrap
dan /hosts.[allow|deny]
file kontrol.
5. INPUT
atau FORWARD
Rantai
Konsep rantai dijelaskan secara lebih menyeluruh di sini, tetapi singkatnya adalah:
The INPUT
chain adalah di mana Anda membuka dan / atau port jaringan dekat untuk layanan yang berjalan secara lokal, pada host mana Anda mengeluarkan perintah iptables.
The FORWARD
chain adalah di mana Anda menerapkan aturan lalu lintas filter yang akan diteruskan oleh kernel untuk sistem lain, sistem yang sebenarnya, tetapi juga wadah Docker dan Virtual Server tamu server ketika mesin Linux Anda bertindak sebagai jembatan, router, hypervisor dan / atau tidak alamat jaringan terjemahan dan penerusan porta.
Kesalahpahaman yang umum adalah bahwa karena wadah buruh pelabuhan atau tamu KVM berjalan secara lokal, aturan filter yang berlaku harus dalam rantai INPUT, tetapi biasanya tidak demikian.
6. Modul kernel
Karena filter paket berjalan dalam kernel Linux, ia juga dapat dikompilasi sebagai modul dinamis, beberapa modul sebenarnya. Sebagian besar distribusi menyertakan netfilter sebagai modul dan modul netfilter yang diperlukan akan dimuat ke dalam kernel sesuai kebutuhan, tetapi untuk beberapa modul administrator firewall perlu secara manual memastikan mereka dimuat. Ini terutama menyangkut modul pelacakan koneksi, seperti nf_conntrack_ftp
yang dapat dimuat insmod
.
Modul yang saat ini dimuat ke kernel yang berjalan dapat ditampilkan dengan lsmod
.
Metode untuk memastikan modul dimuat terus-menerus di seluruh reboot tergantung pada distribusi Linux.