Sumber alamat IP daftar putih di CentOS 7

23

Saya ingin mengatur firewall CentOS 7 sehingga, semua permintaan yang masuk akan diblokir kecuali dari alamat IP asal yang saya masukkan dalam daftar putih. Dan untuk alamat IP Daftar Putih, semua port harus dapat diakses.

Saya dapat menemukan beberapa solusi (tidak yakin apakah mereka akan bekerja) untuk iptablestetapi menggunakan CentOS 7 firewalld. Saya tidak dapat menemukan sesuatu yang serupa untuk dicapai dengan firewall-cmdperintah.

Antarmuka berada di Public Zone. Saya juga sudah memindahkan semua layanan ke zona Publik.

Krishnandu Sarkar
sumber

Jawaban:

44

Saya akan melakukan ini dengan menambahkan sumber ke zona. Pertama checkout sumber mana yang tersedia untuk zona Anda:

firewall-cmd --permanent --zone=public --list-sources

Jika tidak ada, Anda dapat mulai menambahkannya, ini adalah "daftar putih" Anda

firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32

(Itu menambahkan /24IP keseluruhan dan tunggal, sehingga Anda memiliki referensi untuk subnet dan IP tunggal)

Tetapkan rentang port yang ingin Anda buka:

firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp

Ini hanya melakukan port 1 hingga 22. Anda dapat memperluas ini, jika mau.

Sekarang, muat ulang apa yang telah Anda lakukan.

firewall-cmd --reload

Dan periksa pekerjaan Anda:

 firewall-cmd --zone=public --list-all

Catatan samping / editorial: Tidak masalah tapi saya suka zona "tepercaya" untuk satu set IP yang terdaftar di firewalld. Anda dapat membuat penilaian lebih lanjut dengan membaca saran redhat tentang memilih zona .

Lihat juga:


Jika Anda ingin DROPpaket di luar sumber ini, berikut adalah contoh untuk menjatuhkan yang di luar yang /24saya gunakan sebagai contoh sebelumnya, Anda dapat menggunakan aturan kaya untuk ini , saya percaya. Ini konseptual, saya belum mengujinya (lebih jauh daripada melihat bahwa centos 7 menerima perintah), tetapi, harus cukup mudah untuk melakukan pcap dan melihat apakah berperilaku seperti yang Anda harapkan

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
dougBTV
sumber
Terima kasih banyak untuk menjawabnya. Tidak dapat memilih karena kekurangan reputasi. Tetapi bagaimana saya menjatuhkan semua IP lain kecuali yang saya tambahkan menggunakan sumber?
Krishnandu Sarkar
Terima kasih @ KrishnanduSarkar - Anda benar, secara default seharusnya ICMP menolak. Tapi, saya pikir Anda bisa menambahkan aturan kaya untuk menjatuhkan paket. Saya menambahkan contoh pada jawaban saya yang menurut saya akan berhasil. Terima kasih mengenai upvote, saya mengerti, jika jawaban berhasil, pertimbangkan untuk menerima jawaban.
dougBTV
Jawaban yang bagus, saya telah menggunakan iptables sampai sekarang.
Tensigh
(!) Jawaban ini tidak akan berfungsi seperti yang diharapkan untuk konfigurasi FirewallD default saat ini (antarmuka ditetapkan ke zona publik secara default).
dess
25

Bahkan jika jawaban telah diterima dan dipilih, saya tidak berpikir itu adalah jawaban yang benar. Saya gagal menemukan penjelasan yang jelas dalam dokumentasi, tetapi dari perilaku yang diterapkan sepertinya:

  1. antarmuka dan sumber digunakan sebagai penyeleksi - zona mana yang harus diaktifkan
  2. keduanya diabaikan untuk zona default (selalu aktif)

Jadi jawabannya adalah:

  1. mengunci zona default, katakan "publik" - tidak ada port terbuka atau layanan yang tersedia
  2. di zona lain, katakan "bekerja" - tentukan sumber dan buka porta

Misalnya, dengan asumsi zona default bersifat publik dan tidak memiliki port terbuka, tambahkan sumber dan rentang port ke zona "berfungsi":

$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp

sekarang periksa zona aktif (zona default selalu aktif):

$ sudo firewall-cmd --get-active-zones

Anda akan mendapatkan:

work
  sources: 192.168.0.0/24

jadi aturan zona "kerja" akan berlaku untuk subnet tertentu. Anda akan memiliki serangkaian port terbuka untuk "daftar putih" = subnet seperti yang diminta. Dan tentu saja menggunakan --permanentopsi dalam --add-xxxpernyataan untuk membuat perilaku tetap.

Pada gilirannya, port atau layanan apa pun yang Anda miliki di zona "publik" (default) akan berlaku untuk semua antarmuka dan alamat sumber.

$ sudo firewall-cmd --list-all-zones

public (default)
interfaces:
sources:
services:
ports: 
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

work (active)
interfaces: 
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Sistem yang sama berfungsi untuk antarmuka. Katakan dengan menambahkan antarmuka "ens3" ke zona "kerja":

$ sudo firewall-cmd --zone=work --add-interface=ens3

Anda akan menggunakan aturan zona "kerja" untuk setiap permintaan dari antarmuka tertentu - pemilih yang lebih kasar daripada "sumber".

Normunds Kalnberzins
sumber
4
Ini jawaban terbaik. Bagian yang paling penting adalah penjelasan bahwa pengaturan antarmuka memperluas akses (jika sumber diatur). Saya punya masalah bahwa port dapat diakses walaupun saya memiliki sourcesdaftar putih. Alasannya adalah bahwa zona memiliki antarmuka yang ditetapkan.
pinkeen
1
Agar benar, jawaban ini perlu menghapus semua layanan standar dari publiczona, jika ada (layanan ini akan tersedia untuk semua alamat karena antarmuka ditetapkan ke publiczona secara default). Atau ubah zona default ke yang lain: blockatau drop(ini adalah praktik umum). Atau ubah publictarget zona menjadi %%REJECT%%atau DROP.
dess
6

Penafian: Saya belum benar-benar mencoba apa yang saya sarankan, di sini, tapi itu cukup dekat dengan pengaturan firewalld terakhir yang saya lakukan, jadi saya akan pergi dari itu. Firewalld memberi Anda beberapa zona pra-konfigurasi, hanya untuk tujuan ini. Ada satu yang disebut "drop", yang menjatuhkan apa pun yang masuk, dan satu disebut "tepercaya", yang memungkinkan koneksi apa pun (yaitu, jadi Anda bahkan tidak perlu membuka port individual, saya pikir). Triknya adalah mendapatkan zona yang tepat untuk memicu apa yang Anda inginkan.

Firewalld akan menerapkan aturan untuk zona berdasarkan prioritas berikut:

  • Jika IP sumber cocok dengan IP sumber terikat ke zona, ia menggunakan itu.
  • Jika IP sumber tidak cocok dengan zona tertentu, ia memeriksa untuk melihat apakah ada zona yang dikonfigurasi untuk antarmuka paket masuk. Jika ada, gunakan itu.
  • Terakhir, jika tidak ada yang cocok, itu menggunakan zona default.

Jadi, pertama-tama, Anda ingin mengikat IP tepercaya Anda ke zona "tepercaya":

firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4

Lalu, atur zona default Anda ke "drop" atau ikat antarmuka Anda ke sana:

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0

dan kemudian buat perubahan berlaku (peringatan: ini mungkin akan menjatuhkan koneksi Anda jika Anda melakukan ini melalui jaringan dan Anda tidak menambahkan IP sumber Anda ke zona tepercaya):

firewall-cmd --reload

Tentu saja, Anda juga bisa menguji ini sementara dengan menghilangkan "--permanent" (dan kemudian Anda tidak perlu --muat ulang, juga).

Jemenake
sumber
blockjuga dapat digunakan (alih-alih drop) jika Anda ingin memberi tahu host lain bahwa Anda tidak berbicara dengan mereka ....
Gert van den Berg
5

Saya mengoperasikan firewall saya dengan cara ini. Inilah metode pilihan saya untuk mencapai apa yang Anda inginkan.

# firewall-cmd --list-all

Anda akan melihat zona default Anda bersifat publik dan layanan yang diaktifkan adalah dhcpv6-client dan ssh. Kami tidak ingin ada layanan publik yang tersedia, kan? Hanya IP yang masuk daftar putih yang diotorisasi. Jadi mari kita hapus dua layanan publik.

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

Sekarang, mari masuk daftar putih IP tertentu yang memberikan akses ke port apa pun.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

Sekarang, mari masuk daftar putih IP lain, yang kami hanya ingin memiliki akses ke akses SSH, http, dan https. Tidak ada port lain.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'

Jika Anda terhubung melalui SSH, pastikan untuk mengotorisasi IP Anda sebelum menerapkan set aturan baru Anda. Saat siap menerapkan aturan baru.

#firewall-cmd --reload
Sagaponack FX
sumber
2

Anda dapat mengelola dengan mudah dengan Aturan Kaya.

Langkah pertama

firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0

Langkah Kedua - Tambahkan Aturan Kaya

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'

Semua port dapat diakses oleh 192.168.2.2 setelah Anda menambahkan aturan kaya dan memblokir setiap port dari sumber lain.

Jika Anda akan menambahkan port atau layanan dengan perintah di bawah ini maka itu akan dapat diakses oleh semua sumber.

firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080

Jika Anda ingin membuka port spesifik untuk Ip tertentu daripada perintah di bawah ini

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'
Ranjeet Ranjan
sumber
2

Jawaban teratas dari dougBTV salah. Saya tidak dapat menjawab jawabannya karena saya belum memiliki poin perwakilan yang diperlukan sehingga saya akan menjelaskan di sini:

Dia menggunakan zona default "publik". Dia mengikat jaringan ke zona itu dan kemudian membuka port di zona itu. Tetapi, pada konfigurasi default, semua lalu lintas melewati zona default, bukan hanya jaringan sumber yang Anda hubungkan dengannya. Jadi perintah --add-source-nya tidak membuat perbedaan dan perintah -add-port-nya kini telah memungkinkan seluruh dunia untuk mengakses port-port tersebut.

Jawaban ke-2 dari Normunds Kalnberzins benar. Anda ingin membuat zona terpisah, ikat jaringan / IP Anda ke zona itu, dan buka port di zona itu.

Atau, Anda dapat meninggalkan semuanya di zona default dan menggunakan aturan kaya firewalld untuk mengizinkan akses dari IP tertentu:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'

Ini memungkinkan semua lalu lintas dari 192.168.2.2 ke semua port dan karena saya belum menentukan zona ini akan diterapkan ke zona default "publik" (gunakan --get-default-zone untuk memverifikasi apa zona default Anda dan - get-active-zone untuk melihat zona mana yang sedang digunakan).

Untuk mengizinkan akses dari IP ini hanya ke port tertentu yang akan saya lakukan:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'

Praktik terbaik adalah menjalankan perintah-perintah ini tanpa --permanent (atau --perm singkatnya) yang mempengaruhi firewall yang sedang berjalan. Setelah menguji apakah aturan Anda berfungsi, jalankan lagi dengan --perm yang ditambahkan sehingga diingat pada firewalld berikutnya yang dimuat ulang.

Devhen
sumber
1

Hanya untuk menambah jawaban Normunds:

$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp

Untuk memblokir semua lalu lintas lainnya:

$ sudo firewall-cmd --set-default-zone=drop

Peringatan: jika Anda mengakses dari mesin jarak jauh, ini dapat memutuskan sesi login Anda. Jika Anda tidak mendapatkan pengaturan IP zona 'berfungsi' dengan benar, Anda tidak akan dapat terhubung ke server Anda.

Untuk memuat ulang firewall:

$ sudo firewall-cmd --reload

Saya tidak tahu bagaimana cara menambahkan dua IP yang berbeda dengan '--add-rich-rule'.

SongLiAtDuke
sumber
Untuk konfigurasi FirewallD default saat ini, itu mungkin tidak cukup. Lihat komentar saya untuk jawaban Normunds untuk detailnya.
dess
untuk beberapa IP gunakan buat ipsetseperti firewall-cmd --permanent --new-ipset=blacklist --type=hash:iptambah ips ke ipset dengan firewall-cmd --ipset=blacklist --add-entry=192.168.1.4maka Anda bisa menggunakanfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye
0

Saya terkejut jawaban zona tepercaya bukanlah jawaban yang dipilih. Zona tepercaya memiliki "target: ACCEPT" default sedangkan sisanya "target: default". Meskipun benar-benar tidak masalah itu tampaknya menjadi metode yang dimaksudkan karena nama dan nilai target default.

Cara mengunci kotak dengan cepat sehingga hanya Anda yang dapat mengaksesnya:

firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones

Setelah mendaftar semua zona, Anda akan melihat sesuatu seperti ini:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  sources: 1.2.3.4 5.6.7.8/24
  masquerade: no

drop (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: eth1
  masquerade: no

Catatan: Saya menghapus baris dengan nilai nol / hilang. Yang penting adalah bahwa dipercaya dan drop keduanya (aktif) dan drop memiliki antarmuka publik Anda.

Apa yang dilakukan untuk iptables untuk demonstrasi:

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination
IN_trusted  all  --  1.2.3.4         0.0.0.0/0
IN_trusted  all  --  5.6.7.8/24        0.0.0.0/0
Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
Kirin
sumber