Tetapkan beberapa port firewall untuk hanya menerima koneksi jaringan lokal?

18

Bagaimana cara mengatur firewall pada sistem di LAN sehingga beberapa port hanya terbuka untuk koneksi dari jaringan area lokal, dan bukan dari dunia luar?

Sebagai contoh, saya memiliki kotak yang menjalankan Scientific Linux 6.1 (distro berbasis RHEL), dan saya ingin server SSH-nya hanya menerima koneksi dari localhost atau LAN. Bagaimana saya melakukan ini?

hpy
sumber

Jawaban:

24

Dengan iptables kernel benar-benar kosong ( iptables -F), ini akan melakukan apa yang Anda minta:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

Ini mengatakan bahwa semua alamat LAN diizinkan untuk berbicara dengan port TCP 22, bahwa localhost mendapatkan pertimbangan yang sama (ya, 127. * bukan hanya 127.0.0.1), dan paket dari setiap alamat lain yang tidak cocok dengan dua aturan pertama tersebut secara tidak resmi dimasukkan ke dalam yang sedikit ember . Anda dapat menggunakan REJECTalih-alih DROPjika Anda menginginkan penolakan aktif (TCP RST) alih-alih menjadikan port TCP 22 lubang hitam untuk paket.

Jika LAN Anda tidak menggunakan blok 192.168.0. *, Anda secara alami perlu mengubah IP dan mask pada baris pertama untuk mencocokkan skema IP LAN Anda.

Perintah-perintah ini mungkin tidak melakukan apa yang Anda inginkan jika firewall Anda sudah memiliki beberapa aturan yang dikonfigurasi. (Katakan iptables -Lsebagai root untuk mencari tahu.) Yang sering terjadi adalah bahwa salah satu aturan yang ada mengambil paket yang Anda coba filter, sehingga menambahkan aturan baru tidak berpengaruh. Meskipun Anda dapat menggunakan -Ialih-alih -Adengan iptablesperintah untuk menyambungkan aturan baru ke tengah-tengah rantai alih-alih menambahkannya, biasanya lebih baik untuk mengetahui bagaimana rantai diisi pada boot sistem dan memodifikasi proses itu sehingga aturan baru Anda selalu diinstal di urutan yang benar.

RHEL 7+

Pada sistem tipe RHEL terbaru, cara terbaik untuk melakukannya adalah dengan menggunakan firewall-cmdatau yang setara dengan GUI. Ini memberitahu firewallddaemon OS apa yang Anda inginkan, yang sebenarnya mengisi dan memanipulasi apa yang Anda lihat iptables -L.

RHEL 6 dan Sebelumnya

Pada sistem tipe RHEL yang lebih lama, cara termudah untuk memodifikasi rantai firewall saat memesan adalah mengedit /etc/sysconfig/iptables. Alat firewall GUI dan TUI OS agak sederhana, jadi setelah Anda mulai menambahkan aturan yang lebih rumit seperti ini, lebih baik kembali ke file konfigurasi lama yang bagus. Hati-hati, setelah Anda mulai melakukan ini, Anda berisiko kehilangan perubahan jika Anda pernah menggunakan alat firewall OS untuk memodifikasi konfigurasi, karena mungkin tidak tahu bagaimana berurusan dengan aturan buatan tangan seperti ini.

Tambahkan sesuatu seperti ini ke file itu:

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

Di mana Anda menambahkannya adalah bagian yang sulit. Jika Anda menemukan baris dalam file itu bicarakan --dport 22, cukup ganti dengan tiga baris di atas. Kalau tidak, mungkin harus pergi sebelum baris pertama yang ada berakhir -j ACCEPT. Secara umum, Anda harus terbiasa dengan cara iptables bekerja, di mana titik penyisipan yang benar akan terlihat jelas.

Simpan file itu, lalu katakan service iptables restartuntuk memuat ulang aturan firewall. Pastikan untuk melakukan ini saat masuk ke konsol, jika Anda merasa suntingan! Anda tidak ingin mengunci diri dari mesin saat masuk melalui SSH.

Kesamaan dengan perintah di atas bukan kebetulan. Sebagian besar file ini terdiri dari argumen untuk iptablesperintah. Perbedaan relatif terhadap di atas adalah bahwa iptablesperintah dijatuhkan dan INPUTnama rantai menjadi rantai khusus RHEL-khusus RH-Firewall-1-INPUT. (Jika Anda ingin memeriksa file lebih detail, Anda akan melihat sebelumnya di file di mana mereka pada dasarnya mengubah nama INPUTrantai. Mengapa? Tidak bisa mengatakan.)

Warren Young
sumber
4

Alat tingkat rendah untuk pengaturan firewall di Linux adalah iptables . Ada juga alat tingkat tinggi yang tersedia. Saya tidak tahu apakah Scientific Linux memiliki alat firewall yang direkomendasikan.

Menurut halaman web ini (saya belum memverifikasi bahwa ini berlaku untuk 6.1), service iptables saveakan menyimpan aturan firewall saat ini, dan aturan yang disimpan ini dimuat saat boot. Jadi, Anda perlu mengatur aturan yang Anda inginkan melalui iptablesperintah (atau cara lain), kemudian jalankan service iptables saveuntuk membuat pengaturan Anda tetap ada.

Posting blog Scott Pack adalah awal untuk menjatuhkan paket "aneh" yang biasanya tidak diperlukan dan memiliki risiko tinggi menjadi bagian dari serangan. Selain itu, Anda ingin menutup semua port yang masuk, dan hanya membuka yang Anda butuhkan. Sesuatu seperti ini:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Gilles, bukankah kamu salah membaca pertanyaan sedikit? Saya mengerti bahwa kotak Scientific Linux adalah salah satu komputer di LAN, tetapi bukan firewall.
rozcietrzewiacz
@Gilles Ya, kotak itu adalah salah satu komputer di LAN.
hpy
@rozcietrzewiacz Saya mengerti bahwa firewall ada di mesin yang sama dengan server. Saya setuju bahwa pertanyaannya ambigu sampai batas tertentu, tetapi karena penyuan hanya menyebutkan OS dari satu mesin, saya menganggap semuanya terjadi pada mesin itu. Kalau tidak, ini tidak akan menjadi pertanyaan unix, ini akan menjadi pertanyaan admin jaringan yang tidak ditentukan.
Gilles 'SANGAT berhenti menjadi jahat'
1

Cara yang disukai untuk melakukannya adalah dengan iptables. Sepertinya sudah cukup dicakup oleh orang lain, jadi, hanya untuk kelengkapan, saya akan menunjukkan metode kontrol akses alternatif yang tersedia untuk banyak daemon di sebagian besar distro Linux. Metode kontrol akses disediakan oleh libwrapperpustakaan.

Untuk memeriksa apakah daemon favorit Anda memiliki libwrapdukungan, coba jalankan yang berikut:

ldd `which sshd` | grep libwrap

Jika Anda mendapatkan hasil yang tidak kosong, seperti

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

maka Anda pasti baik untuk pergi.

Ini hampir pasti bahwa sshddaemon Anda memang memiliki libwrapdukungan, dan karena itu harus berkonsultasi dengan /etc/hosts.allowdan /etc/hosts.denyfile untuk kontrol akses. Dengan asumsi jaringan LAN lokal 192.168.100.0/24Anda, Anda dapat menolak akses ke sshdsemua klien kecuali yang ada di host lokal atau pada LAN lokal dengan memasukkan yang berikut ke dalam /etc/hosts.denyfile Anda :

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

Perhatikan bahwa metode ini sebenarnya tidak membuka atau menutup port, per se. Itu hanya memberi tahu daemon yang menggunakan metode kontrol akses ini apakah akan menerima atau menolak upaya koneksi dari klien yang cocok dengan pola yang diberikan.

Untuk detail lengkap, lihat halaman manual, mulai dengan hosts_access(5).

Steven Monday
sumber
1

Jika Anda memiliki firewall berbasis linux sendiri, sebaiknya setup iptables, seperti yang dijelaskan di sini. Jika tidak dan firewall adalah router Anda, maka kemungkinan besar konfigurasi default sudah mencegah akses dari luar, kecuali jika Anda secara eksplisit mengaktifkan penerusan port (seperti yang baru-baru ini saya jelaskan dalam menjawab pertanyaan ini ).

Untuk keamanan tambahan di atas itu, Anda dapat menggunakan subnet terpisah untuk koneksi in-LAN. Untuk melakukannya, untuk setiap komputer tambahkan alamat IP kedua yang hanya akan digunakan dalam LAN dan bukan oleh router. Katakanlah seluruh LAN sekarang menggunakan 192.168.0.xxxalamat dan router (gateway, firewall) 192.168.0.1. Jadi tambahkan alamat kedua untuk setiap komputer - misalnya:

ifconfig eth0:0 192.168.5.1/24

Selanjutnya, edit sshdkonfigurasi untuk hanya menggunakan alamat ini (sehingga tidak mengizinkan koneksi datang 192.168.0.xxx) - edit /etc/ssh/sshd_configdan modifikasi ListenAddresske salah satu subnet baru Anda ( 192.168.5.1dalam contoh di atas). Itu dia! Jika Anda tidak mengkonfigurasi gateway untuk merutekan komunikasi subnet itu, ia harus dipisahkan dari luar.

rozcietrzewiacz
sumber