De nombreux amis ont créé des sites Web de commerce extérieur et souhaitent empêcher l'accès à leurs sites Web aux adresses IP nationales. Il existe également des amis dont les sites Web stockent des ressources qui doivent être bloquées à partir d'adresses IP spécifiques pour diverses raisons. Certains amis ont été témoins d'attaques. La plupart des adresses IP sources proviennent de l’étranger et vous souhaitez empêcher les adresses IP étrangères d’accéder au site Web.

Quelle qu'en soit la raison, le blocage et le blocage de l'accès IP à partir de régions et de pays spécifiques sont souvent utilisés dans la création quotidienne de nos sites Web. Si vous utilisez PHP, une méthode relativement simple consiste à ajouter le code pour déterminer l'adresse IP dans le fichier PHP et à utiliser la bibliothèque IP à des fins de comparaison. Si l'adresse IP se situe dans la plage d'accès restreint, empêchez-la de continuer à accéder.

Si le site Web est Nginx, vous pouvez utiliser directement le module Nginx-ngx_http_geoip_module. Ce module peut être précis par rapport à l'adresse IP du pays, de la province, de la ville, etc., et toutes les identifications et blocages d'accès sont effectués par Nginx, c'est donc le cas. plus économe en ressources que PHP mais Nginx est plus difficile à compiler.

Si le site Web est construit sur un VPS ou un serveur indépendant, vous pouvez utiliser directement le pare-feu Linux et utiliser les règles iptables pour bloquer l'accès IP de pays et de provinces spécifiques. Bien entendu, les utilisateurs de WordPress n’ont pas à se soucier de la configuration de Nginx, iptables, etc., car WordPress dispose déjà de divers plug-ins qui restreignent l’accès IP.

Cet article partagera quatre méthodes pour bloquer les sites Web et bloquer les paramètres d'accès IP dans des régions et des pays spécifiques : code PHP, module Nginx, pare-feu iptables et plug-in WordPress. Si vous êtes toujours dérangé par diverses attaques malveillantes pendant le processus de construction d'un site Web, vous pouvez essayer les méthodes suivantes :

  1. Cinq conseils de sécurité pour utiliser un panneau de contrôle VPS gratuit – ne laissez pas les pirates en profiter
  2. WordPress active la méthode d'accélération du cache Nginx fastcgi_cache - Exemple de configuration Nginx
  3. Dix conseils d'accélération CDN gratuits CloudFlare que vous ne connaissez peut-être pas -SSLDDOSCache

PS : mis à jour le 25 mars 2019 Concernant les problèmes de sécurité du VPS, de nombreux amis peuvent ignorer la configuration SSH du VPS lui-même. Voici les stratégies de renforcement : Protection de la sécurité de l'hôte et du serveur VPS : port de modification SSH. , ajoutez la liste blanche, connexion par clé uniquement.

PS : mis à jour le 19 mars 2020 , si votre site Web a été piraté, vous pouvez vous référer aux méthodes suivantes pour résoudre le problème : Analyse de dépannage des chevaux de Troie de sites Web et du piratage de serveur – Méthodes de sécurité de l'hôte et du serveur VPS.

1. Le code PHP bloque une adresse IP spécifique

Le code PHP est relativement simple. Insérez simplement le code suivant dans votre fichier PHP pour empêcher les adresses IP d'une plage spécifique d'accéder au site Web. Selon l'exactitude de la bibliothèque IP, il peut être précis pour les adresses IP au niveau national, provincial ou national. niveaux municipal et autres Le code Un exemple est le suivant (ce code peut être utilisé pendant 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.Module Nginx-ngx_http_geoip_module

Téléchargement de la bibliothèque IP :

  1. HTTPS://Dev.马Xiumin's.com/Geo IP/legacy/geohlit/

2.1  Interdire l'accès à partir d'adresses IP de pays spécifiques

Le module ngx_http_geoip_module permet à Nginx de mettre en œuvre différents besoins en fonction de l'adresse IP du visiteur. Ici, nous utilisons le module ngx_http_geoip_module pour empêcher des adresses IP spécifiques d'accéder au site Web.

La première consiste à compiler ngx_http_geoip_module dans Nginx. Si vous utilisez le panneau Pagoda BT, vous pouvez utiliser la commande suivante :

#安装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

Si vous utilisez le script LNMP ou Oneinstack, vous pouvez vous référer ici : Oneinstack. Activez le module Nginx-ngx_http_geoip_module. Désactivez d'abord Nginx.

Remplacez ensuite le nouveau Nginx et voyez si le module geoip a été chargé. La commande est la suivante :

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

Accédez à votre panneau Pagoda, cliquez sur Nginx, modifiez le fichier de configuration et ajoutez le code suivant :

geoip_country /usr/share/GeoIP/GeoIP.dat;

L'opération est la suivante :

Maintenant, démarrez Nginx, vous pouvez ajouter des règles à la configuration Nginx du site Web. Par exemple, vous pouvez renvoyer une erreur spécifiée ou diriger l'accès IP à une autre page ou un autre site Web à partir d'un exemple de code de pays spécifique :

#返回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/;
}
}

Il s'agit d'ajouter la configuration du site Web.

L'effet final est le suivant :

2.2  Autoriser uniquement l'accès IP à partir des pays spécifiés

La méthode est la même que ci-dessus. Introduisez d'abord la bibliothèque IP dans la configuration principale de Nginx, puis ajoutez du code qui bloque toute adresse IP nationale mais autorise les adresses IP nationales spécifiées dans la configuration Nginx du site Web. L'exemple est le suivant :

 # 引入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. pare-feu iptables

Tout d’abord, familiarisez-vous avec l’utilisation d’iptables et d’ipset :

1. iptables contient plusieurs tables, chaque table est composée de chaînes. La valeur par défaut est la table de filtrage, la plus couramment utilisée est la table de filtrage et l'autre plus couramment utilisée est la table nat. Généralement, le blocage IP consiste à ajouter des règles à la chaîne INPUT de la table de filtrage.

2. Lorsque vous faites correspondre des règles, faites-les correspondre une par une du début à la fin de la liste des règles.

3. ipset fournit une méthode pour transformer cette opération O(n) en O(1) : placez l'IP à traiter dans un ensemble et définissez une règle iptables pour cet ensemble. Comme iptable, les ensembles IP font partie du noyau Linux et la commande ipset est un outil pour les faire fonctionner.

iptables autorise uniquement l'adresse IP spécifiée à accéder au port spécifié de la machine. La commande est la suivante :

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

Comment supprimer, effacer, fermer et enregistrer les règles 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  Bloquer l'accès IP depuis les pays spécifiés en un seul clic

  1. HTTPS://GitHub.com/III et III1/block-IPS-from-countries

Le principe est de télécharger le segment IP du pays spécifié, puis d'ajouter le segment IP aux règles iptables, et d'exécuter directement la commande suivante :

wget https://raw.githubusercontent.com/iiiiiii1/Block-IPs-from-countries/master/block-ips.sh
chmod +x block-ips.sh
./block-ips.sh

Il vous sera ensuite demandé de choisir si vous souhaitez bloquer l'IP ou débloquer l'IP.

Après avoir choisi de bloquer l'adresse IP, il vous sera demandé de saisir le code du pays. Veuillez vérifier ici : http://www.ipdeny.com/ipblocks. Par exemple, pour les États-Unis, assurez-vous de compléter l'adresse IP. interdiction pour l’ensemble des États-Unis.

Si vous souhaitez le débloquer, exécutez à nouveau la commande et sélectionnez 2.

3.2  Autoriser uniquement l'accès IP du pays spécifié en un seul clic

Ci-dessus, nous avons mis en œuvre le blocage en un clic de l'accès IP à partir d'un pays spécifique, mais de nombreuses personnes souhaitent autoriser l'accès à leur site Web uniquement aux adresses IP d'un certain pays et interdire l'accès aux autres. Dans ce cas, nous pouvons utiliser ce qui suit. commande:

wget https://do.wzfou.net/wzfou/block-any.sh
chmod +x block-ips.sh
./block-ips.sh

Le code ci-dessus autorise uniquement l'accès IP national et écrira les règles dans : /etc/rc.d/rc.local Les règles iptables seront réimportées à chaque redémarrage du système. besoin de modifier : /etc/rc.d/rc.local supprimer le code de démarrage automatique correspondant. Le code block-any.sh est le suivant :

#! /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

Si vous souhaitez exclure certaines IP et permettre à ces IP de continuer à accéder en tant qu'exceptions, vous pouvez utiliser la commande iptables -I pour ajouter des règles iptables, ou ajouter des règles iptables manuellement. Attention à mettre les règles en haut à cause de l'ordre des iptables. l'exécution se fait de haut en bas.

3.3  Défini manuellement pour autoriser uniquement l'accès IP à partir de pays spécifiques

Le réglage manuel est le même que la méthode de réglage en un clic ci-dessus. Suivez simplement les commandes suivantes une par une.

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 bloque des adresses IP spécifiques

Plugin WordPress

  1. HTTPS://WordPress.org/plugins/word volume/
  2. HTTPS://WordPress.org/plugins/all-in-one-I'm warn-security-安定-firewall/
  3. HTTPS://WordPress.org/plugins/IP-geoh-block/

Les trois plug-ins de sécurité WordPress ci-dessus disposent tous de paramètres permettant de bloquer l'accès IP, qui peuvent être bloqués en fonction de la source, du pays, de la plage et du nom de domaine de l'IP. (Cliquez pour agrandir)

IP Geo Block est légèrement plus professionnel. En plus de bloquer des adresses IP spécifiques, il peut également bloquer ou empêcher différentes adresses IP d'accéder à différentes pages. Il est très puissant. (Cliquez pour agrandir)

5. Résumé

Le moyen le plus simple pour un site Web de bloquer l'adresse IP d'un pays spécifique est le code PHP présenté dans cet article, qui fait référence à la bibliothèque IP Taobao. La précision est très élevée et peut également être précise par rapport à la province et à la ville. peut l'ajuster selon vos besoins. L’inconvénient est qu’il ne prend pas en charge HTTPS et ne fonctionne qu’en PHP.

En fait, le plus couramment utilisé est iptables, qui bloque directement l'accès IP à la manière du pare-feu Linux. Il ne consomme pas de ressources et le bloque proprement et complètement. Le module Geo IP de Nginx dispose d'une large gamme d'applications. Combiné avec Nginx, vous pouvez afficher différents contenus à différents utilisateurs IP.

Laisser une réponse