Jawaban:
Coba ini dengan akses root:
# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Perhatikan bahwa ini akan secara brutal memotong semua koneksi yang sedang berjalan - ini termasuk hal-hal seperti koneksi SSH yang dapat Anda gunakan untuk mengelola server. Gunakan ini hanya jika Anda memiliki akses ke konsol lokal.
Lihat jawaban Miphix untuk cara menambahkan pengecualian untuk SSH.
Jika Anda bekerja dari jarak jauh melalui SSH, Anda mungkin ingin menambahkan ini ( -I
sisipkan sebelum semua aturan lain masuk INPUT
):
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
Jika layanan SSH Anda mendengarkan di port lain, Anda harus menggunakan port itu alih-alih 22
.
Jika tidak, Anda mungkin kehilangan akses secara tidak sengaja.
Ketahuilah bahwa jawaban lain tidak mencakup IPv6! Jika sistem Anda menerima lalu lintas IPv6, tidak ada aturan iptables tunggal yang akan berlaku untuk lalu lintas IPv6.
daripada menggunakan iptables / ip6tables secara langsung, saya sarankan menggunakan iptables-restore dan simpan. Alat-alat ini memungkinkan untuk menentukan konfigurasi iptables dengan beberapa aturan dan dengan mudah memuatnya dengan satu perintah.
buat file (saya beri nama iptables.rules) dengan konten berikut:
*filter
# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]
# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]
# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]
# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# do not block localhost
-A INPUT -i lo -j ACCEPT
# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT
# allow some incoming ports for services that should be public available
-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
# commit changes
COMMIT
Catatan saya telah menambahkan beberapa contoh tambahan jika Anda ingin mengizinkan ICMP dan lalu lintas ke port tertentu.
sekarang Anda dapat memuatnya dengan perintah-perintah ini:
iptables-restore < iptables.rules
ip6tables-restore < iptables.rules
Sekarang aturan Anda juga mencakup ipv6 dan mudah dikelola.
Catatan tambahan untuk pengguna Debian: jika Anda puas dengan aturan Anda, Anda bisa apt install iptables-persistent
memulihkan aturan setelah reboot. Aturan tidak disimpan secara otomatis saat shutdown, jadi jalankan netfilter-persistent save
untuk memperbarui aturan persisten.
Kedua jawaban di atas entah bagaimana benar, tetapi mereka tidak cukup akurat untuk menjawab asal. (Maaf saya tidak punya cukup reputasi untuk menambahkan komentar, jadi tulis jawaban lengkap).
Saya kasus saya, saya bertemu server apache kelebihan beban, over-floate dengan cron jobs, cpu pemanfaatan berlebihan. Batas utas disimpan dalam database SQL, tetapi saya memenuhi batas koneksinya. Saya ingin membatasi koneksi apache yang masuk dari host lokal (bagian ini opsional), tetapi tetap gunakan semua koneksi lainnya. Termasuk yang sudah mapan.
Saya melakukannya dengan perintah
sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT
Artinya: untuk setiap paket tcp yang masuk di port 80, muat state
modul, dan jika ini adalah paket pertama (koneksi masuk) tolak. Untuk localhost, Anda mungkin hanya menggunakan-s 127.0.0.0/8
Dan untuk penggunaan di dunia nyata, dalam beberapa kasus Anda mungkin menambahkan 'INVALID' ke negara bagian NEW,INVALID
, karena orang dapat mengirim paket "jahat", mencoba memintas aturan Anda. Dan juga ganti dengan -j DROP
untuk menyimpan lalu lintas keluar Anda (itu tidak akan mengirim suar penolakan)