Saya ingin membuat beberapa aturan iptables sederhana untuk menolak semua koneksi masuk dan mengizinkan keluar. Bagaimana saya bisa melakukan itu?
17
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 masukINPUT
):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.
sumber
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:
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:
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 jalankannetfilter-persistent save
untuk memperbarui aturan persisten.sumber
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)sumber