Bagaimana cara memblokir semua port kecuali 80.443 dengan iptables? [duplikat]

14

Memblokir semua port (masuk dan keluar) mudah tetapi sulit dengan kata "kecuali". Saya tidak tahu aturan apa pun yang memenuhi syarat.

PS: Saya tahu pertanyaan ini bukan hal yang baru. Tetapi pada kenyataannya, saya tidak menemukan bantuan apa pun. Jadi, tolong bantu saya!

pengguna71169
sumber
Tidak bisakah Anda menutup SEMUA port dan kemudian BUKA satu port di baris berikutnya?
sinni800
Saya melakukan ini: iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -I INPUT -p tcp --dport 80 -j MENERIMA ------ Ini tidak berhasil!
user71169

Jawaban:

24

Pertama! adalah simbol BUKAN.

iptables -A INPUT -p tcp -m tcp -m multiport ! --dports 80,443 -j DROP

Kedua, aturan yang Anda tulis mungkin tidak memiliki hasil yang diharapkan. Anda menjatuhkan semuanya termasuk respons terhadap koneksi pada port 80. Oleh karena itu, Anda tidak akan dapat terhubung dengan kata itu untuk keperluan server web.

Aturan-aturan ini memungkinkan koneksi TERKAIT dan DIDIRIKAN sehingga server web harus berfungsi, jika itu sebenarnya yang Anda coba lakukan.

iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -j ACCEPT
<insert further allowed list here>
iptables -A INPUT -m conntrack -j ACCEPT  --ctstate RELATED,ESTABLISHED
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -j DROP
cybernard
sumber
2
Bukankah !seharusnya lolos seperti ini \!, jika shell Bash digunakan?
Cristian Ciupitu
@CristianCiupitu Tidak seharusnya tidak perlu melarikan diri. Anda mungkin memiliki sesuatu yang aneh terjadi, tetapi pada bash saya, saya tidak perlu menghindarinya.
cybernard
Saya memeriksa output "iptables -nvL" untuk melihat paket-paket yang terhubung. Tampaknya berhasil, aturan Anda. Tapi saya tidak dapat memeriksa Ini benar-benar berfungsi atau tidak kecuali menggunakan beberapa aplikasi yang menggunakan port tersebut. Aplikasi menggunakan port tidak berarti hanya menggunakan port itu. Jadi, ada yang menyarankan untuk memeriksa?
user71169
1
@cybernard, ya, Anda benar. Dataran !tidak perlu diloloskan. Maaf tentang alarm salah.
Cristian Ciupitu
3
@MohammadShahid Rules tidak permanen secara otomatis, reboot dan itu akan hilang dan Anda dapat masuk. Anda perlu menambahkan 22 ke daftar port jika Anda ingin mempertahankan koneksi ssh.
cybernard
5
# Set the default policy of the INPUT chain to DROP
iptables -P INPUT DROP

# Accept incomming TCP connections from eth0 on port 80 and 443
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

Ini akan memberi Anda apa yang Anda butuhkan

Fazer87
sumber
3
Ingatlah jika Anda terhubung melalui SSH, Anda harus membuka port TCP 22
Maximilian Ast
Ya jangan lupa tentang port SSH Anda, mungkin sebaiknya tambahkan port SSH Anda sebelum Anda menetapkan kebijakan default untuk dihapus. ;)
James Little
3

Anda dapat mengatur tindakan default Anda ke DROP, dan kemudian membuat aturan pengecualian untuk mengizinkan 80 dan 443, seperti:

# Setting default policies:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Exceptions to default policy
iptables -A INPUT -p tcp --dport 80 -j ACCEPT       # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT      # HTTPS

iptables akan melalui daftar 'pengecualian' sampai menemukan kecocokan. Kemudian akan melakukan tindakan yang ditentukan oleh -jparameter (MENERIMA dalam hal ini). Jika tidak menemukan kecocokan, itu akan kembali ke kebijakan default dan menjatuhkan paket.

Perhatikan bahwa dengan solusi ini setiap sub-domain akan dikunci. Misalnya dengan metode ini Anda akan membuatnya berfungsi di www.mydomain.com baik-baik saja tetapi subdomain Anda katakanlah www.sub.mydomain.com tidak akan terbuka untuk kesalahan DNS.

mtak
sumber
Itu harus bekerja tetapi tidak. Saya sangat bingung.
user71169
Apa yang tidak berhasil? Apakah ini mengizinkan semua paket yang masuk, atau tidak ada? Bisakah Anda memperbarui pertanyaan Anda dengan output iptables -nvL?
mtak
Mengapa memilih bawah? Saya menjalankan ini dalam produksi jadi saya 100% yakin itu berfungsi.
mtak
Maaf! Ini bukan saya, seseorang yang melakukannya :)) Yap, Anda yakin seperti saya tetapi ini tidak berhasil. Itu sebabnya saya harus mengajukan pertanyaan.
user71169
2
Jangan lakukan ini lagi ssh.
Ashesh