Cấu hình firewalld và ipset (tạo country blacklist cho firewalld)

Case: bọn trung quốc scan nhiều quá, nên mong muốn block hết IP từ trung quốc lại. Với các hệ thống chuyên nghiệp, FW đời mới hiện nay có thể làm một cách dễ dàng với tính năng GeoIP. Vậy còn các webmaster cá nhân, đơn vị nhỏ chỉ với 1 server public ra ngoài? Họ có thể lựa chọn các giải pháp của cloudflare, akamai, .v. Hoặc cây nhà lá vườn hơn là tận dụng firewalld của centos 7 để làm việc này. Dưới dây là hướng dẫn cách thực hiện:

Bước 1: tạo blacklist cho firewalld
firewall-cmd --permanent --new-ipset=blacklist --type=hash:net --option=family=inet --option=hashsize=4096 --option=maxelem=200000


–permanent : lưu cấu hình vĩnh viễn vào firewalld, nếu không có, sau khi khởi động lại firewall thì lệnh này sẽ mất hiệu lực
–new-ipset : tên của danh sách IP, ở đây chúng ta đặt là blacklist cho dễ quản lý, k thích có thể dùng tên khác như là danhsachden chẳng hạn
–type : kiểu lưu trữ, net dành cho subnet, nếu là 1 IP đơn lẻ thì dùng ip (–type=hash:ip)
–option=family : IPv4 or IPv6 network, inet is for IPv4
–option=hashsize : the initial hash size of the list
–option=maxelem : Số lượng phần tử tối đa của list, ở đây để 200k

Bước 2: tiếp theo chúng ta cần danh sách cái subnet tương ứng với đám IP cần block, ở đây là danh sách các subnet tương ứng với vùng Trung Quốc (CN)_
May thay, trên mạng có sẵn rồi, ở trang ipdeny có đủ toàn bộ thông tin này cho chúng ta. Download về mà xài thôi
wget http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz
tar -vxzf all-zones.tar.gz

cd vào thư mục vừa giải nén, sẽ thấy cả loạt các file text .zone tương ứng với từng quốc gia. Add file của Trung Quốc vào list đã tạo ở trên:
firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=./cn.zone
Chỗ đường dẫn file cn.zone nhớ sửa cho đúng, mình đang đứng trong folder chứa nó nên chỉ là ./ thôi

Bước 3: Chuyển cái list đã add IP ở 2 bước trên sang vùng drop của firewalld
firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist
firewall-cmd --reload

Như vậy, IP source tương ứng với ipset:blacklist sẽ bị firwalld drop 1 cách tự động.
Muốn thêm vùng cần chặn vào thì chỉ cần cho các subnet vào file text theo format của đám .zone đã download ở trên. sau đó
firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=đường dẫn file
Muốn remove 1 số ông khỏi cái list đen đó, thì cũng chỉ add hết subnet cần remove vào 1 file text, ví dụ /tmp/remove_ip.txt
Sau đó chạy:
firewall-cmd --permanent --ipset=test --remove-entries-from-file=/tmp/remove_ip.txt
firewall-cmd --reload

—–

Trick:
Đôi khi cần chặn gấp 1 subnet nào đó. Ngoài cách dùng file như trên, có thể sử dụng script:
firewall-cmd --permanent --ipset=blacklist --add-entry=$1
firewall-cmd --ipset=blacklist --add-entry=$1
firewall-cmd --reload

Lưu lại dưới tên /bin/ban (nhớ chmod +x cho nó nhé)
Mỗi lần cần chặn ai đó, ví dụ chặn khẩn cấp thằng 10.0.5.0/24
Chỉ cần gõ lệnh:
ban 10.0.5.0/24
Nhanh và gọn
Chúc các bạn thành công! (k thành công cũng thành nhân)