Ci sono molti amici che hanno creato siti web di commercio estero che vogliono limitare l'accesso ai loro siti web da parte di IP nazionali. Ci sono anche alcuni amici i cui siti web memorizzano risorse che devono essere bloccate da IP specifici per vari motivi. Alcuni amici hanno subito attacchi. La maggior parte degli IP di origine provengono dall'estero e desideri impedire agli IP stranieri di accedere al sito web.

Indipendentemente dal motivo, il blocco e il blocco dell'accesso IP da regioni e paesi specifici vengono spesso utilizzati nella creazione quotidiana del nostro sito Web. Se stai utilizzando PHP, un metodo relativamente semplice è aggiungere il codice per determinare l'IP nel file PHP e utilizzare la libreria IP per il confronto. Se l'IP rientra nell'intervallo di accesso limitato, impediscigli di continuare ad accedere.

Se il sito web è Nginx, puoi utilizzare direttamente il modulo Nginx-ngx_http_geoip_module. Questo modulo può essere accurato per l'IP del paese, provincia, città, ecc. e tutta l'identificazione e il blocco dell'accesso vengono eseguiti da Nginx. maggiore risparmio di risorse rispetto a PHP, ma Nginx è più problematico da compilare.

Se il sito web è costruito su un VPS o su un server indipendente, puoi utilizzare direttamente il firewall Linux e utilizzare le regole di iptables per bloccare l'accesso IP da paesi e province specifici. Naturalmente gli utenti di WordPress non devono preoccuparsi di Nginx, iptables e altri problemi di configurazione, perché WordPress dispone già di diversi plug-in che limitano l’accesso IP.

Questo articolo condividerà quattro metodi per bloccare i siti Web e bloccare le impostazioni di accesso IP in regioni e paesi specifici: codice PHP, modulo Nginx, firewall iptables e plug-in WordPress. Se sei sempre turbato da vari attacchi dannosi durante il processo di costruzione del sito web, puoi provare i seguenti metodi:

  1. Cinque suggerimenti per la sicurezza per l'utilizzo di un pannello di controllo VPS gratuito: non lasciare che gli hacker ne traggano vantaggio
  2. WordPress abilita il metodo di accelerazione della cache Nginx fastcgi_cache - Esempio di configurazione Nginx
  3. Dieci suggerimenti gratuiti per l'accelerazione CDN di CloudFlare che potresti non conoscere: SSLDDOSCache

PS: aggiornato il 25 marzo 2019, Per quanto riguarda i problemi di sicurezza del VPS, molti amici potrebbero ignorare la configurazione SSH del VPS stesso. Ecco le strategie di rafforzamento: Protezione della sicurezza dell'host e del server VPS: porta di modifica SSH , aggiungi Whitelist, solo accesso tramite chiave.

PS: aggiornato il 19 marzo 2020 , se il tuo sito web è stato violato, puoi fare riferimento ai seguenti metodi per risolvere il problema: Analisi della risoluzione dei problemi di hacking del server e del trojan del sito web - Metodi di sicurezza avanzati per host e server VPS.

1. Il codice PHP blocca un IP specifico

Il codice PHP è relativamente semplice: basta inserire il seguente codice nel file PHP per impedire agli IP all'interno di un intervallo specifico di accedere al sito Web. In base alla precisione della libreria IP, può essere accurato rispetto all'IP e al codice nazionale. livelli provinciale, comunale e altri. Un esempio è il seguente (questo codice può essere utilizzato durante il 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. Modulo Nginx-ngx_http_geoip_module

Download della libreria IP:

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

2.1  Vietare l'accesso da IP di paesi specifici

Il modulo ngx_http_geoip_module consente a Nginx di implementare diverse esigenze in base all'IP del visitatore Qui utilizziamo il modulo ngx_http_geoip_module per impedire a indirizzi IP specifici di accedere al sito web.

Il primo è compilare ngx_http_geoip_module in Nginx. Se stai utilizzando il pannello Pagoda BT, puoi utilizzare il seguente 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

Se utilizzi lo script LNMP o Oneinstack, puoi fare riferimento qui: Oneinstack. Abilita il modulo Nginx-ngx_http_geoip_module. Disabilitare prima Nginx.

Quindi sostituisci il nuovo Nginx e verifica se il modulo geoip è stato caricato. Il comando è il seguente:

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

Vai al pannello Pagoda, fai clic su Nginx, modifica il file di configurazione e aggiungi il seguente codice:

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

L'operazione è la seguente:

Ora avvia Nginx, puoi aggiungere regole alla configurazione Nginx del sito Web. Ad esempio, puoi restituire un errore specificato o indirizzare l'accesso IP a un'altra pagina o sito Web da un paese specifico. Esempio di codice:

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

Questo serve per aggiungere la configurazione del sito web.

L'effetto finale è il seguente:

2.2  Consenti l'accesso IP solo da paesi specificati

Il metodo è lo stesso di cui sopra. Innanzitutto introdurre la libreria IP nella configurazione principale di Nginx, quindi aggiungere il codice che blocca qualsiasi IP nazionale ma consente gli IP nazionali specificati nella configurazione Nginx del sito Web. L'esempio è il seguente:

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

Innanzitutto, familiarizza con l'utilizzo di iptables e ipset:

1. iptables contiene diverse tabelle, ciascuna tabella è composta da catene. Quella predefinita è la tabella filter, quella più comunemente usata è la tabella filter e l'altra più comunemente usata è la tabella nat. In genere, il blocco IP consiste nell'aggiungere regole alla catena INPUT della tabella dei filtri.

2. Quando si abbinano le regole, abbinarle una per una dall'inizio alla fine dell'elenco delle regole.

3. ipset fornisce un metodo per trasformare questa operazione O(n) in O(1): inserire l'IP da elaborare in un set e impostare una regola iptables per questo set. Come iptable, i set IP sono qualcosa nel kernel Linux e il comando ipset è uno strumento per gestirli.

iptables consente solo all'IP specificato di accedere alla porta specificata della macchina. Il comando è il seguente:

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

Come eliminare, cancellare, chiudere e salvare le regole di 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  Blocca l'accesso IP da paesi specifici con un clic

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

Il principio è scaricare il segmento IP del paese specificato, quindi aggiungere il segmento IP alle regole di iptables ed eseguire direttamente il seguente comando:

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

Ti verrà quindi chiesto di scegliere se bloccare l'IP o sbloccare l'IP.

Dopo aver scelto di bloccare l'IP, ti verrà chiesto di inserire il codice del paese. Controlla qui: http://www.ipdeny.com/ipblocks. Ad esempio, per gli Stati Uniti, inseriscici divieto per tutti gli Stati Uniti.

Se vuoi sbloccarlo, esegui nuovamente il comando e seleziona 2.

3.2  Consenti solo l'accesso IP del paese specificato con un clic

Sopra abbiamo implementato il blocco con un clic dell'accesso IP da un paese specifico, ma molte persone vogliono consentire l'accesso al proprio sito Web solo agli IP di un determinato paese e vietare l'accesso ad altri. In questo caso, possiamo utilizzare quanto segue comando:

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

Il codice sopra consente solo l'accesso IP domestico e scriverà le regole in: /etc/rc.d/rc.local Le regole iptables verranno reimportate ogni volta che il sistema viene riavviato è necessario modificare: /etc/rc.d/rc.local eliminare il corrispondente codice di avvio automatico. Il codice block-any.sh è il seguente:

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

Se desideri escludere alcuni IP e consentire a questi IP di continuare ad accedere come eccezioni, puoi utilizzare il comando iptables -I per aggiungere regole iptables o aggiungere regole iptables manualmente. Fai attenzione a mettere le regole in alto, perché l'ordine di l'esecuzione di iptables avviene dall'alto verso il basso.

3.3  Impostato manualmente per consentire solo l'accesso IP da paesi specifici

L'impostazione manuale è uguale al metodo di impostazione con un clic sopra. Basta seguire i seguenti comandi uno per 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 blocca IP specifici

Plug-in WordPress

  1. HTTPS://WordPress.org/plugins/word volume/
  2. HTTPS://WordPress.org/plugins/all-in-one-Ho paura-security-安定-firewall/
  3. HTTPS://WordPress.org/plugins/IP-geoh-block/

I tre plug-in di sicurezza WordPress sopra menzionati dispongono tutti di impostazioni per bloccare l'accesso IP, che può essere bloccato in base alla fonte, al Paese, all'intervallo e al nome di dominio dell'IP. (Clicca per ingrandire)

IP Geo Block è leggermente più professionale. Oltre a bloccare indirizzi IP specifici, può anche bloccare o impedire a diversi indirizzi IP di accedere a pagine diverse. (Clicca per ingrandire)

5. Riepilogo

Il modo più semplice per un sito Web di bloccare l'IP di un paese specifico è il codice PHP introdotto in questo articolo, che fa riferimento alla libreria IP di Taobao. La precisione è molto elevata e può anche essere accurata per la provincia e la città puoi regolarlo in base alle tue esigenze. Lo svantaggio è che non supporta HTTPS e può essere eseguito solo in PHP.

In effetti, quello più comunemente usato è iptables, che blocca direttamente l'accesso IP come fa il firewall Linux. Non consuma risorse e lo blocca in modo pulito e completo. Il modulo Geo IP di Nginx ha un'ampia gamma di applicazioni. In combinazione con Nginx, puoi visualizzare contenuti diversi a diversi utenti IP.

lascia un commento