Có nhiều người bạn đã xây dựng các trang web thương mại nước ngoài muốn hạn chế các IP trong nước truy cập trang web của họ. Cũng có một số người bạn có trang web lưu trữ tài nguyên cần bị chặn khỏi các IP cụ thể vì nhiều lý do. Hầu hết các IP nguồn đều đến từ nước ngoài và bạn muốn ngăn chặn các IP nước ngoài truy cập vào website.
Cho dù lý do là gì thì việc chặn, chặn truy cập IP từ các khu vực, quốc gia cụ thể thường được sử dụng trong việc xây dựng trang web hàng ngày của chúng ta. Nếu bạn đang sử dụng PHP, một phương pháp tương đối đơn giản là thêm mã để xác định IP trong tệp PHP và sử dụng thư viện IP để so sánh. Nếu IP nằm trong phạm vi truy cập bị hạn chế, hãy ngăn nó tiếp tục truy cập.
Nếu trang web là Nginx, bạn có thể sử dụng trực tiếp mô-đun Nginx-ngx_http_geoip_module. Mô-đun này có thể chính xác với IP của quốc gia, tỉnh, thành phố, v.v. và mọi hoạt động nhận dạng và chặn truy cập đều được thực hiện bởi Nginx, vì vậy nó là như vậy. tiết kiệm tài nguyên hơn so với PHP Nhưng Nginx rắc rối hơn khi biên dịch.
Nếu trang web được xây dựng trên VPS hoặc máy chủ độc lập, bạn có thể sử dụng tường lửa Linux trực tiếp và sử dụng quy tắc iptables để chặn truy cập IP từ các quốc gia và tỉnh cụ thể. Tất nhiên, người dùng WordPress không phải lo lắng về cấu hình Nginx, iptables, v.v., vì WordPress đã có nhiều plug-in hạn chế quyền truy cập IP.
Bài viết này sẽ chia sẻ bốn cách thiết lập trang web để chặn và chặn truy cập IP từ các khu vực và quốc gia cụ thể: mã PHP, mô-đun Nginx, tường lửa iptables và plugin WordPress. Nếu bạn luôn gặp rắc rối với nhiều cuộc tấn công độc hại khác nhau trong quá trình xây dựng trang web, bạn có thể thử các phương pháp sau:
- Năm mẹo bảo mật khi sử dụng bảng điều khiển VPS miễn phí – đừng để tin tặc lợi dụng
- Cách bật tăng tốc bộ đệm Nginx fastcgi_cache trong WordPress - Ví dụ về cấu hình Nginx
- Mười mẹo tăng tốc CDN miễn phí của CloudFlare mà bạn có thể không biết-SSLDDOSCache
PS: Cập nhật ngày 25/03/2019, Về vấn đề bảo mật của VPS, nhiều bạn có thể bỏ qua cấu hình SSH của chính VPS Dưới đây là các chiến lược tăng cường: Bảo vệ an ninh máy chủ và máy chủ VPS: Cổng sửa đổi SSH. , thêm Danh sách trắng, chỉ đăng nhập bằng khóa.
PS: Cập nhật ngày 19/03/2020 , nếu website của bạn bị hack, bạn có thể tham khảo các phương pháp sau để giải quyết vấn đề: Trojans website và phân tích khắc phục sự cố hack máy chủ - Phương pháp bảo mật máy chủ và máy chủ VPS.
1. Mã PHP chặn IP cụ thể
Mã PHP tương đối đơn giản. Chỉ cần ném đoạn mã sau vào tệp PHP của bạn để ngăn các IP trong một phạm vi cụ thể truy cập vào trang web. Theo độ chính xác của thư viện IP, nó có thể chính xác đối với các IP ở cấp quốc gia, tỉnh, thành phố. cấp thành phố và các cấp khác Mã Một ví dụ như sau (mã này có thể được sử dụng trong BA):
<?php /** * * test.php(屏蔽国家IP) * */ $verification = '美国';//需要屏蔽国家的IP function get_client_ip() { $ip = $_SERVER['REMOTE_ADDR']; if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } return $ip; } $ip = get_client_ip();//获取访客IP $antecedents = $_SERVER['HTTP_REFERER'];//访客来路地址 $result = file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip);//IP数据库来自淘宝。 $address = json_decode($result,true); //判断访客是否属于美国,是否来自百度,是否来自谷歌 if($address['data']['country'] == $verification && strpos($antecedents, 'baidu') === false && strpos($antecedents, 'google') === false){ sleep(10);//设置一个10秒等待。 header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); header('Retry-After: 3600000'); exit; } /****** 如果需要阻止某一个省份的IP访问,使用以下代码*********/ <?php /** * * test.php(屏蔽地方IP) * */ $verification = '江西省';//需要屏蔽省份的IP function get_client_ip() { $ip = $_SERVER['REMOTE_ADDR']; if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } return $ip; } $ip = get_client_ip();//获取访客IP $antecedents = $_SERVER['HTTP_REFERER'];//访客来路地址 $result = file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip);//IP数据库来自淘宝。 $address = json_decode($result,true); //判断访客是否属于江西省,是否来自百度,是否来自谷歌 if($address['data']['region'] == $verification && strpos($antecedents, 'baidu') === false && strpos($antecedents, 'google') === false){ sleep(99999999);//设置一个999999秒的等待。 Header("HTTP/1.1 204 No Content"); exit; }
2. Mô-đun Nginx-ngx_http_geoip_module
Tải xuống thư viện IP:
- HTTPS://Dev.马Xiumin’s.com/Geo IP/legacy/geohlit/
2.1 Cấm truy cập từ IP quốc gia cụ thể
Mô-đun ngx_http_geoip_module cho phép Nginx thực hiện các nhu cầu khác nhau dựa trên IP của khách truy cập. Ở đây chúng tôi sử dụng mô-đun ngx_http_geoip_module để ngăn các địa chỉ IP cụ thể truy cập vào trang web.
Đầu tiên là biên dịch ngx_http_geoip_module thành Nginx. Nếu bạn đang sử dụng bảng chùa BT, bạn có thể sử dụng lệnh sau:
#安装geoip库 yum -y install epel-release yum -y install geoip-devel #先查看一下本机的Nginx配置情况 [root@cs ~]# nginx -V nginx version: nginx/1.14.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.0.2l 25 May 2017 TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 --with-ld-opt=-ljemalloc #开始下载Nginx,这里用的是1.15.1,你也可以下载其它的版本 wget http://nginx.org/download/nginx-1.15.1.tar.gz tar -xzvf nginx-1.15.1.tar.gz cd nginx-1.15.1 #下面的命令只是在上面的Nginx -v得到的配置详情后加上了--with-http_geoip_module,目的是为了保持原来的配置不变同时又增加新的模块 ./configure --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 --with-ld-opt=-ljemalloc --with-http_geoip_module #只编译不安装 make
Nếu bạn đang sử dụng tập lệnh LNMP hoặc Oneinstack, bạn có thể tham khảo tại đây: Oneinstack. Kích hoạt mô-đun Nginx-ngx_http_geoip_module. Vô hiệu hóa Nginx trước.
Sau đó thay thế Nginx mới và xem mô-đun Geoip đã được tải chưa. Lệnh như sau:
mv /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx-lala.im cp objs/nginx /www/server/nginx/sbin/nginx ldd /www/server/nginx/sbin/nginx
Đi tới bảng chùa của bạn, nhấp vào Nginx, sửa đổi tệp cấu hình và thêm mã sau:
geoip_country /usr/share/GeoIP/GeoIP.dat;
Hoạt động như sau:
Bây giờ hãy khởi động Nginx, bạn có thể thêm quy tắc vào cấu hình Nginx của trang web. Ví dụ: bạn có thể trả về một lỗi được chỉ định hoặc truy cập IP trực tiếp vào một trang hoặc trang web khác từ một quốc gia cụ thể.
#返回403 502 404等错误 location / { default_type text/html; charset utf-8; if ($geoip_country_code = CN) { return 403; } } #导向另一个网站目录 location / { default_type text/html; charset utf-8; if ($geoip_country_code = CN) { root /home/www/wzfou.com-cn/; } }
Điều này là để thêm cấu hình trang web.
Hiệu ứng cuối cùng như sau:
2.2 Chỉ cho phép truy cập IP từ các quốc gia được chỉ định
Cách làm tương tự như trên. Đầu tiên giới thiệu thư viện IP trong cấu hình chính Nginx, sau đó thêm mã chặn bất kỳ IP quốc gia nào nhưng cho phép các IP quốc gia được chỉ định trong cấu hình Nginx của trang web.
# 引入IP库 geoip_country /usr/share/GeoIP/GeoIP.dat; geoip_city /usr/share/GeoIP/GeoLiteCity.dat; map $geoip_country_code $allowed_country { default no; CN yes; } # 在配置中阻止IP if ($allowed_country = no) { return 403; }
3. tường lửa iptables
Trước tiên, hãy làm quen với cách sử dụng iptables và ipset:
1. iptables chứa một số bảng, mỗi bảng bao gồm các chuỗi. Mặc định là bảng bộ lọc, bảng được sử dụng phổ biến nhất là bảng bộ lọc và bảng còn lại được sử dụng phổ biến hơn là bảng nat. Nói chung, chặn IP là thêm quy tắc vào chuỗi INPUT của bảng bộ lọc.
2. Khi so khớp các quy tắc, hãy so khớp từng quy tắc một từ đầu đến cuối danh sách quy tắc.
3. ipset cung cấp một phương thức để biến thao tác O(n) này thành O(1): đặt IP cần xử lý thành một tập hợp và đặt quy tắc iptables cho tập hợp này. Giống như iptable, bộ IP là một thứ gì đó trong nhân Linux và lệnh ipset là một công cụ để vận hành chúng.
iptables chỉ cho phép IP được chỉ định truy cập vào cổng được chỉ định của máy. Lệnh như sau:
1、在tcp协议中,禁止所有的ip访问本机的3306端口。 iptables -I INPUT -p tcp –dport 3306 -j DROP 2、允许123.456.789访问本机的3306端口 iptables -I INPUT -s 123.456.789 -p tcp –dport 3306 -j ACCEPT 以此类推………………………………… 封掉一个IP段: iptables -I INPUT -s 121.0.0.0/8 -j DROP 以上命令的顺序不能错 然后保存iptables # service iptables save 重启防火墙 #service iptables restart
Cách xóa, xóa, đóng và lưu quy tắc iptables:
#CentOS 7请停止firewalld并安装iptables-services systemctl stop firewalld systemctl mask firewalld #安装 iptables-services yum install iptables-services ################ 保存 iptables 规则 service iptables save 重启 iptables service iptables restart ################# 执行清除命令 iptables -F时可能会断开与服务器的连接,如果想清空的话,先执行 /sbin/iptables -P INPUT ACCEPT 然后执行 /sbin/iptables -F 如果关闭防火墙,执行 /etc/init.d/iptables stop 或者是 services iptables stop ####################### iptables 规则若重启后消失,请用以下方法 步骤1:备份 iptables-save > /etc/iptables.up.rules.bak 步骤2:删除规则 vim /etc/sysconfig/iptables 或 vim /etc/iptables.up.rules 手动删除即可。 步骤3:导入新规则 iptables-restore < /etc/sysconfig/iptables 最后,重启VPS就可以生效了。
3.1 Chặn quyền truy cập IP từ các quốc gia được chỉ định bằng một cú nhấp chuột
- HTTPS://GitHub.com/III i III1/block-IPS-from-countries
Nguyên tắc là tải xuống phân đoạn IP của quốc gia được chỉ định, sau đó thêm phân đoạn IP vào quy tắc iptables và thực hiện trực tiếp lệnh sau:
wget https://raw.githubusercontent.com/iiiiiii1/Block-IPs-from-countries/master/block-ips.sh chmod +x block-ips.sh ./block-ips.sh
Sau đó, bạn sẽ được yêu cầu chọn chặn IP hoặc bỏ chặn IP.
Sau khi chọn chặn IP, bạn sẽ được yêu cầu nhập mã quốc gia. Vui lòng kiểm tra tại đây: http://www.ipdeny.com/ipblocks. Ví dụ: đối với Hoa Kỳ, hãy đảm bảo điền IP của chúng tôi. lệnh cấm trên toàn nước Mỹ
Nếu bạn muốn bỏ chặn nó, hãy thực hiện lại lệnh và chọn 2.
3.2 Chỉ cho phép truy cập IP quốc gia được chỉ định bằng một cú nhấp chuột
Ở trên, chúng tôi đã triển khai chặn truy cập IP bằng một cú nhấp chuột từ một quốc gia cụ thể, nhưng nhiều người muốn cho phép trang web của họ chỉ được truy cập bởi IP từ một quốc gia nhất định và cấm truy cập vào những người khác. Trong trường hợp này, chúng tôi có thể sử dụng cách sau. yêu cầu:
wget https://do.wzfou.net/wzfou/block-any.sh chmod +x block-ips.sh ./block-ips.sh
Đoạn mã trên chỉ cho phép truy cập IP trong nước và sẽ ghi các quy tắc vào: /etc/rc.d/rc.local. Các quy tắc iptables sẽ được nhập lại mỗi khi hệ thống được khởi động lại. cần chỉnh sửa: /etc/rc.d/rc.local xóa đoạn code tự chạy khởi động tương ứng. Mã block-any.sh
như sau:
#! /bin/bash #判断是否具有root权限 root_need() { if [[ $EUID -ne 0 ]]; then echo "Error:This script must be run as root!" 1>&2 exit 1 fi } #检查系统分支及版本(主要是:分支->>版本>>决定命令格式) check_release() { if uname -a | grep el7 ; then release="centos7" elif uname -a | grep el6 ; then release="centos6" yum install ipset -y elif cat /etc/issue |grep -i ubuntu ; then release="ubuntu" apt install ipset -y fi } #安装必要的软件(wget),并下载中国IP网段文件(最后将局域网地址也放进去) get_china_ip() { #安装必要的软件(wget) rpm --help >/dev/null 2>&1 && rpm -qa |grep wget >/dev/null 2>&1 ||yum install -y wget ipset >/dev/null 2>&1 dpkg --help >/dev/null 2>&1 && dpkg -l |grep wget >/dev/null 2>&1 ||apt-get install wget ipset -y >/dev/null 2>&1 #该文件由IPIP维护更新,大约一月一次更新(也可以用我放在国内的存储的版本,2018-9-8日版) [ -f china_ip_list.txt ] && mv china_ip_list.txt china_ip_list.txt.old wget https://github.com/17mon/china_ip_list/blob/master/china_ip_list.txt cat china_ip_list.txt |grep 'js-file-line">' |awk -F'js-file-line">' '{print $2}' |awk -F'<' '{print $1}' >> china_ip.txt rm -rf china_ip_list.txt #wget https://qiniu.wsfnk.com/china_ip.txt #放行局域网地址 echo "192.168.0.0/18" >> china_ip.txt echo "10.0.0.0/8" >> china_ip.txt echo "172.16.0.0/12" >> china_ip.txt } #只允许国内IP访问 ipset_only_china() { echo "ipset create whitelist-china hash:net hashsize 10000 maxelem 1000000" > /etc/ip-black.sh for i in $( cat china_ip.txt ) do echo "ipset add whitelist-china $i" >> /etc/ip-black.sh done echo "iptables -I INPUT -m set --match-set whitelist-china src -j ACCEPT" >> /etc/ip-black.sh #拒绝非国内和内网地址发起的tcp连接请求(tcp syn 包)(注意,只是屏蔽了入向的tcp syn包,该主机主动访问国外资源不用影响) echo "iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 0 -j DROP" >> /etc/ip-black.sh #拒绝非国内和内网发起的ping探测(不影响本机ping外部主机) echo "iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP" >> /etc/ip-black.sh #echo "iptables -A INPUT -j DROP" >> /etc/ip-black.sh rm -rf china_ip.txt } run_setup() { chmod +x /etc/rc.local sh /etc/ip-black.sh rm -rf /etc/ip-black.sh #下面这句主要是兼容centos6不能使用"-f"参数 ipset save whitelist-china -f /etc/ipset.conf || ipset save whitelist-china > /etc/ipset.conf [ $release = centos7 ] && echo "ipset restore -f /etc/ipset.conf" >> /etc/rc.local [ $release = centos6 ] && echo "ipset restore < /etc/ipset.conf" >> /etc/rc.local echo "iptables -I INPUT -m set --match-set whitelist-china src -j ACCEPT" >> /etc/rc.local echo "iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 0 -j DROP" >> /etc/rc.local echo "iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP" >> /etc/rc.local #echo "iptables -A INPUT -j DROP" >> /etc/rc.local } main() { check_release get_china_ip ipset_only_china case "$release" in centos6) run_setup ;; centos7) chmod +x /etc/rc.d/rc.local run_setup ;; ubuntu) sed -i '/exit 0/d' /etc/rc.local run_setup echo "exit 0" >> /etc/rc.local ;; esac } main
Nếu bạn muốn loại trừ một số IP và cho phép các IP này tiếp tục truy cập dưới dạng ngoại lệ, bạn có thể sử dụng lệnh iptables -I để thêm quy tắc iptables hoặc thêm quy tắc iptables theo cách thủ công. thực hiện là từ trên xuống dưới.
3.3 Được đặt thủ công để chỉ cho phép truy cập IP từ các quốc gia cụ thể
Cài đặt thủ công cũng giống như phương pháp cài đặt bằng một cú nhấp chuột ở trên. Chỉ cần làm theo từng lệnh sau.
1、安装ipset #Debian/Ubuntu系统 apt-get -y install ipset #CentOS系统 yum -y install ipset CentOS 7还需要关闭firewall防火墙: systemctl stop firewalld.service systemctl disable firewalld.service 2、清空之前的规则 #防止设置不生效,建议清空下之前的防火墙规则 iptables -P INPUT ACCEPT iptables -F 3、创建新规则 #创建一个名为cnip的规则 ipset -N cnip hash:net #下载国家IP段,这里以中国为例,其它国家IP下载参考:http://www.ipdeny.com/ipblocks/ wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone #将IP段添加到cnip规则中 for i in $(cat /root/cn.zone ); do ipset -A cnip $i; done 4、设置IP段白名单 #放行IP段 iptables -A INPUT -p tcp -m set --match-set cnip src -j ACCEPT #关掉所有端口 iptables -P INPUT DROP 这时候就只有指定国家的IP能访问服务器了。 #如果你在国内,网站不允许被国内人访问,建议别关所有端口,这样你的S-S-H会上不去,我们可以只关闭80/443端口。 #关闭指定端口,比如80/443 iptables -A INPUT -p tcp --dport 80 -j DROP iptables -A INPUT -p tcp --dport 443 -j DROP 这时候其他国家的IP是无法访问你服务器的80/443端口,等于无法访问你的网站,其它端口还是可以访问的。 5、删除规则 #将参数里的-A改成-D就是删除规则了,如 iptables -D INPUT -p tcp -m set --match-set cnip src -j ACCEPT iptables -D INPUT -p tcp --dport 443 -j DROP
4. WordPress chặn IP cụ thể
Plugin WordPress
- HTTPS://WordPress.org/plugins/word Volume/
- HTTPS://WordPress.org/plugins/all-in-one-Tôi sợ-security-安定-firewall/
- HTTPS://WordPress.org/plugins/IP-geoh-block/
Ba plugin bảo mật WordPress trên đều có cài đặt chặn truy cập IP, có thể chặn dựa trên nguồn, quốc gia, phạm vi và tên miền của IP. (Bấm vào để phóng to)
IP Geo Block chuyên nghiệp hơn một chút. Ngoài việc chặn các địa chỉ IP cụ thể, nó còn có thể chặn hoặc ngăn các địa chỉ IP khác nhau truy cập vào các trang khác nhau. (Bấm vào để phóng to)
5. Tóm tắt
Cách đơn giản nhất để một trang web chặn IP của một quốc gia cụ thể là mã PHP được giới thiệu trong bài viết này, mã này đề cập đến thư viện IP của Taobao, độ chính xác rất cao và cũng có thể chính xác đối với tỉnh, thành phố. có thể điều chỉnh nó theo nhu cầu của bạn. Điểm bất lợi là nó không hỗ trợ HTTPS và chỉ có thể chạy bằng PHP.
Trên thực tế, cái được sử dụng phổ biến nhất là iptables, chặn trực tiếp truy cập IP theo cách của tường lửa Linux. Nó không tiêu tốn tài nguyên và chặn nó một cách rõ ràng và hoàn toàn. Mô-đun Geo IP của Nginx có nhiều ứng dụng. Kết hợp với Nginx, bạn có thể hiển thị các nội dung khác nhau cho những người dùng IP khác nhau.