Block IP cho site chạy trên VPS VULTR cài CenOS, domain dùng cloudflare
Sau nhiều tháng tìm hiểu, thử đủ mọi cách tìm được trên google cũng như tham khảo ý kiến trên các diễn đàn tin học nhưng đều thất bại.
Hôm nay mình đã tìm giải pháp và xin viết lên đây cho những ai đang cần để tham khảo.
Vì site chạy trên VPS nên không dùng được cách chặn IP theo kiểu .htaccess (cách này dùng tốt với share host).
Vì domain dùng cloudflare nên không dùng được cách chặn IP bằng CSF Firewall.
Vậy dùng cách gì? Dùng firewall của cloudflare.
Bước 1: Lấy dải địa chỉ IP cần chặn (ví dụ VN, chọn VN vì dễ test nhất)
http://www.ip2location.com/blockvisitorsbycountry.aspx
Step 1: Choose IPv4 or IPv6
Chọn IPv4 hoặc IPv6
Step 2: Select the countries from the list you want to block
Chọn VN
Step 3: Choose the output format
CIDR
Click Download sẽ được file .txt chứa dải IP của VN (mở file này bằng notepad++ cho dễ đọc)
Bước 2: Đăng nhập Cloudflare -> Firewall -> Access Rules
Access Rules của Cloudflare có:
+ Block: Không cho phép vào site
+ Whitelist: Cho phép vào site
+ Challenge: Cho phép vào site nhưng có Capcha
Các bạn dễ dàng nhìn thấy chú thích: "Enter an IP, IP range, or two letter country code"
Vậy muốn block VN thì ta chỉ cần nhập VN, chọn Block và click nút ADD là xong. Bạn thử đi, sẽ không được vì Cloudflare chỉ chấp nhận Challenge khi ta nhập VN.
Vậy chỉ còn cách duy nhất và cũng thủ công nhất là lấy từng dải IP ở trên (516 dải) nhập vào, chon Block và click nút ADD.
10 dải IP đầu tiên:
1.52.0.0/14
5.198.248.176/28
14.0.16.0/20
14.160.0.0/11
14.224.0.0/11
23.235.218.160/29
27.0.12.0/22
27.2.0.0/15
27.64.0.0/12
27.118.16.0/20
Thử nhập vào dải thứ nhất: 1.52.0.0/14
Ồ không được rồi, bào lỗi "An IP range (CIDR) must be a /16 or /24"
Mấy tháng trước mình cũng dừng lại ở bước này đây (nếu là các bạn học bên cntt thì chắc sẽ biết ngay phải làm gì, mình ngoài nghề nên chịu chết). Và cách đây ít hôm không biết có quả gì rơi trúng đầu không mà đã nảy ra ý tưởng: sao không biến dải 1.52.0.0/14 về thành các dải /16 hoặc /24
Bài toán đặt ra là thế, Google thôi: CIDR to IP range
http://www.ipaddressguide.com/cidr
Nhập 1.52.0.0/14 và Caculator được:
CIDR Range 1.52.0.0/14
Netmask 255.252.0.0
Wildcard Bits 0.3.255.255
First IP 1.52.0.0
Last IP 1.55.255.255
Total Host 262144
Bây giờ nhập tiếp 1.52.0.0/16 và Caculator được:
CIDR Range 1.52.0.0/16
Netmask 255.255.0.0
Wildcard Bits 0.0.255.255
First IP 1.52.0.0
Last IP 1.52.255.255
Total Host 65536
Bây giờ nhập tiếp 1.53.0.0/16 và Caculator được:
CIDR Range 1.53.0.0/16
Netmask 255.255.0.0
Wildcard Bits 0.0.255.255
First IP 1.53.0.0
Last IP 1.53.255.255
Total Host 65536
Bây giờ nhập tiếp 1.54.0.0/16 và Caculator được:
CIDR Range 1.54.0.0/16
Netmask 255.255.0.0
Wildcard Bits 0.0.255.255
First IP 1.54.0.0
Last IP 1.54.255.255
Total Host 65536
Bây giờ nhập tiếp 1.55.0.0/16 và Caculator được:
CIDR Range 1.55.0.0/16
Netmask 255.255.0.0
Wildcard Bits 0.0.255.255
First IP 1.55.0.0
Last IP 1.55.255.255
Total Host 65536
Các bạn so sánh First IP và Last IP của dải đầu tiên với 4 dải bên dưới sẽ thấy dải
1.52.0.0/14 = 1.52.0.0/16 + 1.53.0.0/16 + 1.54.0.0/16 + 1.55.0.0/16
Vậy đã giải được bài toán biến dải /14 thành các dải /16
Để ý thêm một chút các bạn sẽ tìm ra cách biến từ 1.52.0.0/14 thành các dải /16 như sau:
16 - 14 = 2
(2 ^ 2) - 1 = 3 => 52+3=55 => 1.55.0.0/16 là dải cuối cùng
1.52.0.0/14 = 1.52.0.0/16 + 1.53.0.0/16 + 1.54.0.0/16 + 1.55.0.0/16
Ví dụ khác: biến dải 14.160.0.0/11 thành các dải /16
16 - 11 = 5
(2 ^ 5) - 1 = 31 => 160+31=191 => 14.191.0.0/16 là dải cuối cùng
14.160.0.0/11 = 14.160.0.0/16 + 14.161.0.0/16 + 14.162.0.0/16 + 14.163.0.0/16 + ... + 14.191.0.0/16
Với các dải nhỏ hơn /16 thì biến đổi về các dải /16. Với các dải lớn hơn /16 nhưng nhỏ hơn /24 thì biến đổi về các dải /24. Với các dải là /16 hoặc /24 thì không cần biến đổi.
516 dải IP VN biến đổi về các dải /16 và /24 thì sẽ thành bao nhiêu dải?
Một gợi ý nhỏ là chỉ nên biến đổi các dải nhỏ hơn /16 về các dải /16 như vậy là cũng chặn được trên 90% rồi.
Trên đây là cách làm của mình và hiện tại mình cũng chỉ mò được mỗi cách này thôi. Bạn nào có cao kiến hơn xin comment bên dưới để mọi người cùng học tập.
Chúc các bạn thành công!
Sau nhiều tháng tìm hiểu, thử đủ mọi cách tìm được trên google cũng như tham khảo ý kiến trên các diễn đàn tin học nhưng đều thất bại.
Hôm nay mình đã tìm giải pháp và xin viết lên đây cho những ai đang cần để tham khảo.
Vì site chạy trên VPS nên không dùng được cách chặn IP theo kiểu .htaccess (cách này dùng tốt với share host).
Vì domain dùng cloudflare nên không dùng được cách chặn IP bằng CSF Firewall.
Vậy dùng cách gì? Dùng firewall của cloudflare.
Bước 1: Lấy dải địa chỉ IP cần chặn (ví dụ VN, chọn VN vì dễ test nhất)
http://www.ip2location.com/blockvisitorsbycountry.aspx
Step 1: Choose IPv4 or IPv6
Chọn IPv4 hoặc IPv6
Step 2: Select the countries from the list you want to block
Chọn VN
Step 3: Choose the output format
CIDR
Click Download sẽ được file .txt chứa dải IP của VN (mở file này bằng notepad++ cho dễ đọc)
Bước 2: Đăng nhập Cloudflare -> Firewall -> Access Rules
Access Rules của Cloudflare có:
+ Block: Không cho phép vào site
+ Whitelist: Cho phép vào site
+ Challenge: Cho phép vào site nhưng có Capcha
Các bạn dễ dàng nhìn thấy chú thích: "Enter an IP, IP range, or two letter country code"
Vậy muốn block VN thì ta chỉ cần nhập VN, chọn Block và click nút ADD là xong. Bạn thử đi, sẽ không được vì Cloudflare chỉ chấp nhận Challenge khi ta nhập VN.
Vậy chỉ còn cách duy nhất và cũng thủ công nhất là lấy từng dải IP ở trên (516 dải) nhập vào, chon Block và click nút ADD.
10 dải IP đầu tiên:
1.52.0.0/14
5.198.248.176/28
14.0.16.0/20
14.160.0.0/11
14.224.0.0/11
23.235.218.160/29
27.0.12.0/22
27.2.0.0/15
27.64.0.0/12
27.118.16.0/20
Thử nhập vào dải thứ nhất: 1.52.0.0/14
Ồ không được rồi, bào lỗi "An IP range (CIDR) must be a /16 or /24"
Mấy tháng trước mình cũng dừng lại ở bước này đây (nếu là các bạn học bên cntt thì chắc sẽ biết ngay phải làm gì, mình ngoài nghề nên chịu chết). Và cách đây ít hôm không biết có quả gì rơi trúng đầu không mà đã nảy ra ý tưởng: sao không biến dải 1.52.0.0/14 về thành các dải /16 hoặc /24
Bài toán đặt ra là thế, Google thôi: CIDR to IP range
http://www.ipaddressguide.com/cidr
Nhập 1.52.0.0/14 và Caculator được:
CIDR Range 1.52.0.0/14
Netmask 255.252.0.0
Wildcard Bits 0.3.255.255
First IP 1.52.0.0
Last IP 1.55.255.255
Total Host 262144
Bây giờ nhập tiếp 1.52.0.0/16 và Caculator được:
CIDR Range 1.52.0.0/16
Netmask 255.255.0.0
Wildcard Bits 0.0.255.255
First IP 1.52.0.0
Last IP 1.52.255.255
Total Host 65536
Bây giờ nhập tiếp 1.53.0.0/16 và Caculator được:
CIDR Range 1.53.0.0/16
Netmask 255.255.0.0
Wildcard Bits 0.0.255.255
First IP 1.53.0.0
Last IP 1.53.255.255
Total Host 65536
Bây giờ nhập tiếp 1.54.0.0/16 và Caculator được:
CIDR Range 1.54.0.0/16
Netmask 255.255.0.0
Wildcard Bits 0.0.255.255
First IP 1.54.0.0
Last IP 1.54.255.255
Total Host 65536
Bây giờ nhập tiếp 1.55.0.0/16 và Caculator được:
CIDR Range 1.55.0.0/16
Netmask 255.255.0.0
Wildcard Bits 0.0.255.255
First IP 1.55.0.0
Last IP 1.55.255.255
Total Host 65536
Các bạn so sánh First IP và Last IP của dải đầu tiên với 4 dải bên dưới sẽ thấy dải
1.52.0.0/14 = 1.52.0.0/16 + 1.53.0.0/16 + 1.54.0.0/16 + 1.55.0.0/16
Vậy đã giải được bài toán biến dải /14 thành các dải /16
Để ý thêm một chút các bạn sẽ tìm ra cách biến từ 1.52.0.0/14 thành các dải /16 như sau:
16 - 14 = 2
(2 ^ 2) - 1 = 3 => 52+3=55 => 1.55.0.0/16 là dải cuối cùng
1.52.0.0/14 = 1.52.0.0/16 + 1.53.0.0/16 + 1.54.0.0/16 + 1.55.0.0/16
Ví dụ khác: biến dải 14.160.0.0/11 thành các dải /16
16 - 11 = 5
(2 ^ 5) - 1 = 31 => 160+31=191 => 14.191.0.0/16 là dải cuối cùng
14.160.0.0/11 = 14.160.0.0/16 + 14.161.0.0/16 + 14.162.0.0/16 + 14.163.0.0/16 + ... + 14.191.0.0/16
Với các dải nhỏ hơn /16 thì biến đổi về các dải /16. Với các dải lớn hơn /16 nhưng nhỏ hơn /24 thì biến đổi về các dải /24. Với các dải là /16 hoặc /24 thì không cần biến đổi.
516 dải IP VN biến đổi về các dải /16 và /24 thì sẽ thành bao nhiêu dải?
Một gợi ý nhỏ là chỉ nên biến đổi các dải nhỏ hơn /16 về các dải /16 như vậy là cũng chặn được trên 90% rồi.
Trên đây là cách làm của mình và hiện tại mình cũng chỉ mò được mỗi cách này thôi. Bạn nào có cao kiến hơn xin comment bên dưới để mọi người cùng học tập.
Chúc các bạn thành công!
Last edited: