Tolak semua koneksi masuk dengan iptables?

17

Saya ingin membuat beberapa aturan iptables sederhana untuk menolak semua koneksi masuk dan mengizinkan keluar. Bagaimana saya bisa melakukan itu?

poliglot
sumber

Jawaban:

24

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.

Yohann
sumber
2
Ketika saya melakukan baris pertama dari aturan Anda, saya terputus dari SSH
holms
7
Pertanyaannya adalah "tolak semua koneksi yang masuk" dan bukan "tolak semua koneksi yang masuk kecuali SSH" :)
Yohann
Saya membaca peringatan @holms tentang aturan pertama terlambat ...
DenisKolodin
Perhatikan bahwa ini tidak berpengaruh pada Traffic ipv6. Baca jawaban saya di bawah ini jika Anda mengaktifkan ipv6.
bhelm
13

Jika Anda bekerja dari jarak jauh melalui SSH, Anda mungkin ingin menambahkan ini ( -Isisipkan 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.

Miphix
sumber
2

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-persistentmemulihkan aturan setelah reboot. Aturan tidak disimpan secara otomatis saat shutdown, jadi jalankan netfilter-persistent saveuntuk memperbarui aturan persisten.

bhelm
sumber
1

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 statemodul, 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 DROPuntuk menyimpan lalu lintas keluar Anda (itu tidak akan mengirim suar penolakan)

Offenso
sumber