Konfigurasi ufw di Linux: firewall server dan dasar nftables
Konfigurasi ufw terdiri dari tiga langkah: menetapkan kebijakan default (sudo ufw default deny incoming dan allow outgoing), mengizinkan SSH dan port yang dibutuhkan (sudo ufw allow 22/tcp, sudo ufw allow 443/tcp), lalu mengaktifkan firewall dengan sudo ufw enable. Aturan diperiksa dengan sudo ufw status numbered, dan di balik layar ufw mengelola netfilter melalui iptables atau nftables.
Firewall di Linux menentukan paket jaringan mana yang diizinkan masuk ke server dan mana yang dibuang. Di level kernel, fungsi ini dijalankan oleh subsistem netfilter, sedangkan pengelolaannya dilakukan oleh utilitas seperti iptables dan nftables yang bersifat tingkat rendah, atau ufw (Uncomplicated Firewall) sebagai lapisan di atasnya. Untuk sebagian besar server Ubuntu dan Debian, konfigurasi ufw hanya memakan lima menit: tutup semua yang masuk, buka SSH dan port layanan, lalu aktifkan. Berikut ini skenario langkah demi langkah, kesalahan yang sering terjadi, dan dasar nftables secukupnya untuk memahami apa yang terjadi di balik layar.
Cara kerja firewall di Linux
Penyaringan paket berada di kernel — ini adalah netfilter. Netfilter menyediakan titik-titik intersep (hook): lalu lintas masuk ke host itu sendiri, lalu lintas keluar, dan lalu lintas yang diteruskan (forward). Utilitas pengguna hanya menulis aturan ke kernel untuk titik-titik tersebut.
| Alat | Level | Kapan digunakan |
|---|---|---|
ufw | lapisan di atas, sintaks sederhana | server tunggal di Ubuntu/Debian, aturan standar |
firewalld | lapisan di atas dengan zona | RHEL, Rocky, Fedora |
nftables (nft) | level rendah, modern | aturan kompleks, NAT, kumpulan alamat |
iptables | level rendah, mulai usang | sistem dan skrip lama |
Penting: gunakan satu alat pengelola saja. Jika aturan diubah sekaligus lewat ufw dan secara manual lewat iptables, keduanya akan saling menimpa dan hasilnya tidak bisa diprediksi.
Instalasi dan pemeriksaan ufw
Di Ubuntu, ufw biasanya sudah terpasang tetapi belum aktif. Di Debian, paket ini perlu dipasang terpisah:
$ sudo apt update
$ sudo apt install ufw
$ sudo ufw status
Status: inactive
Status inactive berarti aturan ufw belum diterapkan. Jangan dulu mengaktifkan firewall: izinkan SSH terlebih dahulu, karena jika tidak, di server jarak jauh Anda bisa kehilangan akses sendiri.
Konfigurasi ufw langkah demi langkah di server
Langkah 1. Kebijakan default
Kebijakan default menentukan apa yang dilakukan terhadap paket jika tidak ada aturan yang cocok. Skema yang aman untuk server: lalu lintas masuk dilarang, lalu lintas keluar diizinkan.
$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'
Balasan untuk koneksi keluar Anda sendiri dilewatkan secara otomatis: ufw melacak status koneksi (connection tracking), sehingga tidak perlu membuka port untuk balasan tersebut.
Langkah 2. Izinkan SSH
$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
OpenSSH adalah profil aplikasi. Jika SSH mendengarkan di port non-standar, izinkan port itu secara eksplisit: sudo ufw allow 2222/tcp. Untuk memastikan port mana yang benar-benar didengarkan sshd, gunakan sudo ss -tlnp | grep sshd.
Langkah 3. Buka port layanan
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
Sebutkan protokolnya: tanpa /tcp, ufw akan membuka port untuk TCP sekaligus UDP, dan pintu yang terbuka tanpa perlu hanya menambah risiko.
Langkah 4. Aktifkan firewall
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
ufw langsung berjalan dan akan aktif setiap kali sistem dinyalakan. Jangan tutup sesi SSH yang sedang berjalan: buka sesi kedua dan pastikan koneksi tetap bisa dibuat.
Langkah 5. Periksa aturan
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)
Aturan untuk IPv6 dibuat otomatis oleh ufw jika di /etc/default/ufw tertulis IPV6=yes (nilai default).
Cara membuka port di ufw: semua variasi sintaksis
Perintah ufw allow mendukung bentuk pendek dan bentuk lengkap. Bentuk pendek cocok untuk kasus umum, sedangkan bentuk lengkap dipakai jika perlu menentukan sumber, antarmuka, atau alamat tujuan.
| Tugas | Perintah |
|---|---|
| Port TCP | sudo ufw allow 443/tcp |
| Port UDP | sudo ufw allow 51820/udp |
| Rentang port | sudo ufw allow 6000:6007/tcp |
| Berdasarkan nama layanan | sudo ufw allow https |
| Dari satu IP | sudo ufw allow from 203.0.113.10 |
| Dari subnet ke port tertentu | sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp |
| Pada antarmuka tertentu | sudo ufw allow in on eth1 to any port 3306 proto tcp |
| Larang | sudo ufw deny 23/tcp |
| Tolak dengan balasan | sudo ufw reject 25/tcp |
Perbedaan deny dan reject: deny membuang paket tanpa suara sehingga klien menunggu sampai timeout; reject mengirim balasan bahwa port tertutup. Untuk dunia luar biasanya dipilih deny, sedangkan untuk jaringan internal reject lebih nyaman karena klien langsung melihat errornya.
Akses ke database hanya dari satu server
Tugas yang umum: PostgreSQL atau MySQL tidak boleh terlihat dari internet, tetapi aplikasi di server tetangga harus tetap bisa terhubung.
$ sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp
Rule added
Port 5432 tetap tertutup untuk semua pihak lain berkat kebijakan deny incoming. Sebagai tambahan, atur juga DBMS agar hanya mendengarkan alamat internal — firewall dan pengaturan layanan saling melindungi.
Profil aplikasi
Paket perangkat lunak dapat menyimpan deskripsi port mereka di /etc/ufw/applications.d/. Daftar dan isi profil:
$ sudo ufw app list
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
$ sudo ufw app info "Nginx Full"
Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server
Ports:
80,443/tcp
Mengizinkan profil: sudo ufw allow "Nginx Full". Nama yang mengandung spasi harus ditulis dalam tanda kutip. Profil sendiri bisa dibuat dalam format INI di direktori yang sama, lalu diterapkan dengan sudo ufw app update nama.
Cara menghapus aturan ufw
Cara yang paling andal adalah dengan nomor aturan:
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] OpenSSH ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] OpenSSH (v6) ALLOW IN Anywhere (v6)
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6)
$ sudo ufw delete 2
Deleting:
allow 80/tcp
Proceed with operation (y|n)? y
Rule deleted
Setelah sebuah aturan dihapus, nomor-nomor di bawahnya bergeser, jadi jalankan status numbered lagi sebelum menghapus berikutnya. Cara kedua adalah mengulang aturan dengan kata delete: sudo ufw delete allow 80/tcp; perintah ini sekaligus menghapus varian IPv4 dan IPv6.
Urutan aturan dan penyisipan di awal
ufw memeriksa aturan dari atas ke bawah, dan aturan pertama yang cocok langsung berlaku. Karena itu larangan untuk alamat tertentu harus berada di atas izin yang umum:
$ sudo ufw insert 1 deny from 198.51.100.23
Rule inserted
Jika deny ditambahkan dengan perintah biasa, aturan itu akan berada di akhir daftar setelah allow 443/tcp dan tidak akan berlaku untuk port tersebut.
Perlindungan SSH dari brute force: ufw limit
Aturan limit tetap mengizinkan koneksi, tetapi memblokir alamat yang membuka 6 koneksi atau lebih dalam 30 detik:
$ sudo ufw limit OpenSSH
Rule updated
Ini perlindungan sederhana terhadap serangan tebak kata sandi secara massal. Untuk perlindungan yang lebih serius, tambahkan login hanya dengan kunci dan, jika perlu, fail2ban — fail2ban dapat memblokir alamat melalui ufw.
Log ufw
Pencatatan diaktifkan dengan sudo ufw logging on; tingkatnya adalah low, medium, high, atau full. Catatan masuk ke /var/log/ufw.log (melalui rsyslog) dan ke log kernel:
$ sudo journalctl -k | grep 'UFW BLOCK' | tail -2
Oct 14 10:12:03 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=45.155.205.1 DST=192.0.2.10 PROTO=TCP SPT=51544 DPT=3389
Oct 14 10:12:09 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=89.248.165.7 DST=192.0.2.10 PROTO=TCP SPT=40312 DPT=23
Kolom SRC dan DPT menunjukkan siapa dan ke port mana koneksi dicoba. Jika layanan tidak merespons dan di log ada UFW BLOCK dengan port tersebut, berarti aturan untuk port itu belum ditambahkan.
ufw dan Docker: mengapa port terbuka meski aturan sudah ada
Ini jebakan yang paling terkenal. Saat mempublikasikan port (-p 8080:80), Docker sendiri menambahkan aturan NAT dan rantai DOCKER, dan lalu lintas ke kontainer berjalan melalui forward sehingga melewati aturan masuk ufw. Akibatnya, ufw status tidak menampilkan port 8080, tetapi port itu tetap bisa diakses dari luar.
Cara mengatasinya:
- Publikasikan port hanya di localhost:
-p 127.0.0.1:8080:80, lalu layani ke luar melalui reverse proxy (nginx). - Tambahkan aturan sendiri ke rantai
DOCKER-USER— Docker tidak menimpanya. - Jangan mempublikasikan port kontainer layanan sama sekali, hubungkan mereka melalui jaringan Docker.
Reset dan nonaktifkan
$ sudo ufw disable # matikan, aturan tetap tersimpan
$ sudo ufw reset # hapus semua aturan dan matikan
$ sudo ufw reload # muat ulang konfigurasi
Sebelum reset, ufw menyimpan salinan berkas aturan di /etc/ufw/ dengan akhiran tanggal. Aturan itu sendiri tersimpan di /etc/ufw/user.rules dan user6.rules — berkas tersebut jangan diedit manual, ubah hanya lewat perintah.
Dasar nftables
nftables adalah pengganti modern untuk iptables di kernel Linux. Pada Debian 10+ dan Ubuntu 20.10+, perintah iptables secara default bekerja melalui lapisan kompatibilitas iptables-nft, sehingga aturan ufw juga berakhir di nftables. Untuk melihat semua yang dimuat ke kernel:
$ sudo nft list ruleset
Struktur nftables: sebuah tabel (famili ip, ip6, atau inet untuk keduanya) berisi rantai yang terhubung ke titik netfilter, dan rantai berisi aturan. Berikut firewall minimal untuk server di berkas /etc/nftables.conf:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
ip protocol icmp accept
meta l4proto ipv6-icmp accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
Menerapkan dan mengaktifkan saat boot:
$ sudo nft -c -f /etc/nftables.conf # hanya memeriksa sintaksis
$ sudo systemctl enable --now nftables
Aturan juga bisa ditambahkan saat sistem berjalan, tetapi aturan itu hilang setelah reboot kecuali disimpan ke berkas:
$ sudo nft add rule inet filter input tcp dport 5432 ip saddr 10.0.0.5 accept
$ sudo nft -a list chain inet filter input # -a menampilkan handle aturan
$ sudo nft delete rule inet filter input handle 9
Keunggulan utama nftables adalah set ({ 22, 80, 443 }) dan satu tabel inet untuk IPv4 maupun IPv6. Jangan menjalankan nftables.service sendiri bersamaan dengan ufw: flush ruleset akan menghapus aturan ufw.
Kesalahan umum
- ufw diaktifkan tanpa aturan untuk SSH — akses hilang. Konsol penyedia (VNC/serial) bisa menyelamatkan: jalankan
sudo ufw allow OpenSSHatausudo ufw disable. - Port sudah dibuka, tetapi layanan tidak bisa diakses — layanan mendengarkan di
127.0.0.1, bukan di alamat eksternal. Periksa denganss -tlnp. - Ada firewall di level cloud — banyak penyedia memiliki security group; port juga harus dibuka di sana.
- deny tidak berfungsi — aturan berada di bawah izin yang cocok; gunakan
insert 1.
Kesimpulan
Konfigurasi ufw dasar terdiri dari default deny incoming, izin untuk SSH dan port layanan, ufw enable, serta pemeriksaan dengan status numbered. Untuk akses yang spesifik gunakan aturan dengan from dan port, untuk SSH gunakan limit, dan ingat bahwa Docker melewati ufw. Ketika dibutuhkan NAT atau kumpulan aturan yang kompleks, beralihlah ke nftables. Pengamanan server dengan firewall dibahas dalam praktik pada kursus Linux.
Pertanyaan umum
Apa perbedaan ufw dan iptables?
ufw adalah lapisan di atas dengan sintaks sederhana yang menghasilkan aturan iptables atau nftables secara otomatis. iptables dan nftables adalah alat level rendah yang memberi kontrol penuh, tetapi memerlukan pengetahuan lebih.
Apakah aturan ufw tetap ada setelah reboot?
Ya. Setelah sudo ufw enable, firewall berjalan saat boot, dan aturannya disimpan di /etc/ufw/user.rules dan user6.rules.
Perlukah membuka port untuk koneksi keluar?
Tidak, jika kebijakan allow outgoing aktif. ufw melewatkan balasan untuk koneksi keluar secara otomatis berkat pelacakan status koneksi.
Bagaimana cara mengizinkan ping saat ufw aktif?
Secara default ufw sudah melewatkan ICMP echo-request yang masuk: aturannya ada di /etc/ufw/before.rules. Untuk melarang ping, ubah aturan di berkas itu dari ACCEPT menjadi DROP, lalu jalankan sudo ufw reload.
Apakah ufw tersedia di CentOS dan Rocky Linux?
Di sana alat bawaannya adalah firewalld dengan perintah firewall-cmd. ufw bisa dipasang dari EPEL, tetapi sebaiknya jangan dicampur dengan firewalld.
Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.
Ke kursus