Hay muchos amigos que han creado sitios web de comercio exterior que quieren restringir el acceso a sus sitios web mediante IP nacionales. También hay algunos amigos cuyos sitios web almacenan recursos que deben bloquearse desde IP específicas por varias razones. La mayoría de las IP de origen provienen del extranjero y desea evitar que las IP extranjeras accedan al sitio web.

No importa cuál sea el motivo, el bloqueo y el bloqueo del acceso IP desde regiones y países específicos se utilizan a menudo en la creación diaria de nuestro sitio web. Si está utilizando PHP, un método relativamente simple es agregar el código para determinar la IP en el archivo PHP y usar la biblioteca de IP para comparar. Si la IP está dentro del rango de acceso restringido, evite que continúe accediendo.

Si el sitio web es Nginx, puede usar directamente el módulo Nginx-ngx_http_geoip_module. Este módulo puede ser preciso con respecto a la IP del país, provincia, ciudad, etc., y toda la identificación y bloqueo de acceso los realiza Nginx, por lo que es así. ahorra más recursos en comparación con PHP, pero Nginx es más problemático de compilar.

Si el sitio web está construido en un VPS o un servidor independiente, puede usar el firewall de Linux directamente y usar reglas de iptables para bloquear el acceso IP desde países y provincias específicos. Por supuesto, los usuarios de WordPress no tienen que preocuparse por la configuración de Nginx, iptables, etc., porque WordPress ya tiene varios complementos que restringen el acceso a IP.

Este artículo compartirá cuatro métodos para bloquear sitios web y bloquear configuraciones de acceso IP en regiones y países específicos: código PHP, módulo Nginx, firewall iptables y complemento de WordPress. Si siempre le preocupan varios ataques maliciosos durante el proceso de construcción del sitio web, puede probar los siguientes métodos:

  1. Cinco consejos de seguridad para usar un panel de control VPS gratuito: no dejes que los piratas informáticos se aprovechen
  2. WordPress habilita el método de aceleración de caché Nginx fastcgi_cache: ejemplo de configuración de Nginx
  3. Diez consejos de aceleración de CDN gratuitos de CloudFlare que quizás no conozcas: SSLDDOSCache

PD: Actualizado el 25 de marzo de 2019, Con respecto a los problemas de seguridad del VPS, muchos amigos pueden ignorar la configuración SSH del propio VPS. Estas son las estrategias de fortalecimiento: Protección de seguridad del servidor y del host VPS: puerto de modificación SSH. , agregue Lista blanca, solo inicio de sesión con clave.

PD: Actualizado el 19 de marzo de 2020 , si su sitio web ha sido pirateado, puede consultar los siguientes métodos para resolver el problema: Troyanos de sitios web y análisis de solución de problemas de piratería de servidores: métodos de seguridad del servidor y host VPS.

1. El código PHP bloquea una IP específica

El código PHP es relativamente simple. Simplemente agregue el siguiente código a su archivo PHP para evitar que las IP dentro de un rango específico accedan al sitio web. De acuerdo con la precisión de la biblioteca de IP, puede ser preciso para las IP a nivel nacional, provincial y. niveles municipales y otros. El código Un ejemplo es el siguiente (este código se puede utilizar durante 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ódulo Nginx-ngx_http_geoip_module

Descarga de la biblioteca IP:

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

2.1  Prohibir el acceso desde IP de países específicos

El módulo ngx_http_geoip_module permite a Nginx implementar diferentes necesidades según la IP del visitante. Aquí utilizamos el módulo ngx_http_geoip_module para evitar que direcciones IP específicas accedan al sitio web.

El primero es compilar ngx_http_geoip_module en Nginx. Si está utilizando el panel Pagoda BT, puede utilizar el siguiente comando:

#安装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 está utilizando el script LNMP o Oneinstack, puede consultar aquí: Oneinstack. Habilite el módulo Nginx-ngx_http_geoip_module. Primero deshabilite Nginx.

Luego reemplace el nuevo Nginx y vea si se ha cargado el módulo geoip. El comando es el siguiente:

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

Vaya a su panel de Pagoda, haga clic en Nginx, modifique el archivo de configuración y agregue el siguiente código:

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

El funcionamiento es el siguiente:

Ahora inicie Nginx, puede agregar reglas a la configuración de Nginx del sitio web. Por ejemplo, puede devolver un error específico o acceder IP directamente a otra página o sitio web desde un país específico.

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

Esto es para agregar la configuración del sitio web.

El efecto final es el siguiente:

2.2  Solo permitir el acceso IP desde países específicos

El método es el mismo que el anterior. Primero introduzca la biblioteca de IP en la configuración principal de Nginx y luego agregue código que bloquee cualquier IP nacional pero permita IP nacionales específicas en la configuración de Nginx del sitio 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. cortafuegos de iptables

Primero, familiarícese con el uso de iptables e ipset:

1. iptables contiene varias tablas, cada tabla se compone de cadenas. La predeterminada es la tabla de filtro, la más utilizada es la tabla de filtro y la otra más utilizada es la tabla nat. Generalmente, el bloqueo de IP consiste en agregar reglas a la cadena de ENTRADA de la tabla de filtros.

2. Cuando haga coincidir reglas, hágalas coincidir una por una desde el principio hasta el final de la lista de reglas.

3. ipset proporciona un método para convertir esta operación O(n) en O(1): coloque la IP a procesar en un conjunto y establezca una regla de iptables para este conjunto. Al igual que iptable, los conjuntos de IP son algo en el kernel de Linux y el comando ipset es una herramienta para operarlos.

iptables solo permite que una IP especificada acceda al puerto especificado de la máquina. El comando es el siguiente:

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ómo eliminar, borrar, cerrar y guardar reglas de 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  Bloquear el acceso IP de países específicos con un solo clic

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

El principio es descargar el segmento IP del país especificado, luego agregar el segmento IP a las reglas de iptables y ejecutar directamente el siguiente comando:

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

Luego se le pedirá que elija si desea bloquear la IP o desbloquearla.

Después de elegir bloquear la IP, se le pedirá que ingrese el código de país. Verifique aquí: http://www.ipdeny.com/ipblocks. Por ejemplo, para Estados Unidos, asegúrese de completar la IP. prohibición para todo Estados Unidos.

Si desea desbloquearlo, ejecute el comando nuevamente y seleccione 2.

3.2  Permitir solo el acceso IP del país especificado con un clic

Arriba hemos implementado el bloqueo con un solo clic del acceso a IP desde un país específico, pero muchas personas quieren permitir que solo accedan a su sitio web IP de un determinado país y prohibir el acceso a otros. En este caso, podemos usar lo siguiente. dominio:

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

El código anterior solo permite el acceso a IP nacionales y escribirá las reglas en: /etc/rc.d/rc.local Las reglas de iptables se volverán a importar cada vez que se reinicie el sistema. Necesita editar: / etc/rc.d/rc.local elimine el código de ejecución automática de inicio correspondiente. El código block-any.sh es el siguiente:

#! /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 desea excluir algunas IP y permitir que estas IP continúen accediendo como excepciones, puede usar el comando iptables -I para agregar reglas de iptables, o agregar reglas de iptables manualmente. Tenga cuidado de colocar las reglas en la parte superior debido al orden de iptables. la ejecución es de arriba a abajo.

3.3  Configurado manualmente para permitir solo el acceso IP desde países específicos

La configuración manual es la misma que el método de configuración con un clic anterior. Simplemente siga los siguientes comandos uno por uno.

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 bloquea IP específicas

complemento de WordPress

  1. HTTPS://WordPress.org/plugins/volumen de palabras/
  2. HTTPS://WordPress.org/plugins/all-in-one-Tengo miedo-seguridad-安定-firewall/
  3. HTTPS://WordPress.org/plugins/IP-geoh-block/

Los tres complementos de seguridad de WordPress anteriores tienen configuraciones para bloquear el acceso a la IP, que se puede bloquear según la fuente, el país, el rango y el nombre de dominio de la IP. (Click para agrandar)

IP Geo Block es un poco más profesional. Además de bloquear direcciones IP específicas, también puede bloquear o evitar que diferentes direcciones IP accedan a diferentes páginas. (Click para agrandar)

5. Resumen

La forma más sencilla para que un sitio web bloquee la IP de un país específico es el código PHP presentado en este artículo, que hace referencia a la biblioteca de IP de Taobao. La precisión es muy alta y también puede ser precisa para la provincia y la ciudad. Puedes ajustarlo según tus necesidades. La desventaja es que no soporta HTTPS y sólo se ejecuta en PHP.

De hecho, el más utilizado es iptables, que bloquea directamente el acceso IP a la manera del firewall de Linux. No consume recursos y lo bloquea de forma limpia y completa. El módulo Geo IP de Nginx tiene una amplia gama de aplicaciones. Combinado con Nginx, puede mostrar contenido diferente a diferentes usuarios de IP.

Deja una respuesta