Existem muitos amigos que criaram sites de comércio exterior que desejam restringir o acesso de seus sites por IPs nacionais. Existem também alguns amigos cujos sites armazenam recursos que precisam ser bloqueados de IPs específicos por vários motivos. A maioria dos IPs de origem vem do exterior e você deseja evitar que IPs estrangeiros acessem o site.
Não importa qual seja o motivo, bloquear e bloquear o acesso IP de regiões e países específicos é frequentemente usado na construção diária de nossos sites. Se você estiver usando PHP, um método relativamente simples é adicionar o código para determinar o IP no arquivo PHP e usar a biblioteca IP para comparação. Se o IP estiver dentro da faixa de acesso restrito, evite que ele continue acessando.
Se o site for Nginx, você pode usar diretamente o módulo Nginx-ngx_http_geoip_module Este módulo pode ser preciso para o IP do país, província, cidade, etc., e toda identificação e bloqueio de acesso são realizados pelo Nginx, portanto é. mais economia de recursos em comparação com PHP. Mas o Nginx é mais difícil de compilar.
Se o site for construído em um VPS ou servidor independente, você pode usar o firewall Linux diretamente e usar regras de iptables para bloquear o acesso IP de países e províncias específicos. Claro, os usuários do WordPress não precisam se preocupar com Nginx, iptables e outros problemas de configuração, porque o WordPress já possui vários plug-ins que restringem o acesso IP.
Este artigo compartilhará quatro métodos para bloquear sites e bloquear configurações de acesso IP em regiões e países específicos: código PHP, módulo Nginx, firewall iptables e plug-in WordPress. Se você sempre se depara com vários ataques maliciosos durante o processo de construção do site, você pode tentar os seguintes métodos:
- Cinco dicas de segurança para usar um painel de controle VPS gratuito – não deixe que hackers aproveitem
- WordPress habilita o método de aceleração de cache Nginx fastcgi_cache - exemplo de configuração Nginx
- Dez dicas de aceleração de CDN grátis do CloudFlare que você talvez não conheça-SSLDDOSCache
PS: Atualizado em 25 de março de 2019, Em relação às questões de segurança do VPS, muitos amigos podem ignorar a configuração SSH do próprio VPS. Aqui estão as estratégias de fortalecimento: Host VPS e proteção de segurança do servidor: porta de modificação SSH. , adicione Lista de permissões, somente login com chave.
PS: Atualizado em 19 de março de 2020 , se o seu site foi invadido, você pode consultar os seguintes métodos para resolver o problema: Trojan de site e análise de solução de problemas de hacking de servidor - Host VPS e métodos de segurança aprimorados do servidor.
1. O código PHP bloqueia IP específico
O código PHP é relativamente simples. Basta inserir o código a seguir em seu arquivo PHP para evitar que IPs dentro de um intervalo específico acessem o site. De acordo com a precisão da biblioteca IP, ele pode ser preciso para o IP e o código nacional. níveis provinciais, municipais e outros. Um exemplo é o seguinte (este código pode ser usado 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
Download da biblioteca IP:
- HTTPS://Dev.马Xiumin's.com/Geo IP/legacy/geohlit/
2.1 Proibir acesso de IPs de países específicos
O módulo ngx_http_geoip_module permite que o Nginx implemente diferentes necessidades com base no IP do visitante. Aqui usamos o módulo ngx_http_geoip_module para evitar que endereços IP específicos acessem o site.
A primeira é compilar ngx_http_geoip_module no Nginx. Se estiver usando o painel Pagoda BT, você pode usar o seguinte 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 você estiver usando script LNMP ou Oneinstack, pode consultar aqui: Oneinstack. Habilite o módulo Nginx-ngx_http_geoip_module. Desative o Nginx primeiro.
Em seguida, substitua o novo Nginx e veja se o módulo geoip foi carregado. O comando é o seguinte:
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
Vá para o painel Pagoda, clique em Nginx, modifique o arquivo de configuração e adicione o seguinte código:
geoip_country /usr/share/GeoIP/GeoIP.dat;
A operação é a seguinte:
Agora inicie o Nginx, você pode adicionar regras à configuração do Nginx do site. Por exemplo, você pode retornar um erro especificado ou acessar IP direto para outra página ou site de um 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/; } }
Isso é para adicionar a configuração do site.
O efeito final é o seguinte:
2.2 Permitir apenas acesso IP de países específicos
O método é o mesmo acima. Primeiro introduza a biblioteca IP na configuração principal do Nginx e, em seguida, adicione o código que bloqueia qualquer IP nacional, mas permite IPs nacionais especificados na configuração Nginx do site.
# 引入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
Primeiro, familiarize-se com o uso do iptables e do ipset:
Primeiro, iptables contém várias tabelas, cada tabela é composta por cadeias. O padrão é a tabela de filtros, a mais comumente usada é a tabela de filtros e a outra mais comumente usada é a tabela nat. Geralmente, o bloqueio de IP consiste em adicionar regras à cadeia INPUT da tabela de filtros.
2. Ao combinar regras, combine-as uma por uma, do início ao fim da lista de regras.
3. ipset fornece um método para transformar esta operação O(n) em O(1): coloque o IP a ser processado em um conjunto e defina uma regra iptables para este conjunto. Assim como o iptable, os conjuntos de IP são algo no kernel do Linux, e o comando ipset é uma ferramenta para operá-los.
iptables permite apenas que o IP especificado acesse a porta especificada da máquina. O comando é o seguinte:
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
Como excluir, limpar, fechar e salvar regras do 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 Bloqueie o acesso IP de países específicos com um clique
- HTTPS://GitHub.com/III e III1/block-IPS-from-countries
O princípio é baixar o segmento IP do país especificado, adicionar o segmento IP às regras do iptables e executar diretamente o seguinte comando:
wget https://raw.githubusercontent.com/iiiiiii1/Block-IPs-from-countries/master/block-ips.sh chmod +x block-ips.sh ./block-ips.sh
Em seguida, você será solicitado a escolher se deseja bloquear ou desbloquear o IP.
Depois de escolher bloquear o IP, você será solicitado a inserir o código do país. Verifique aqui: http://www.ipdeny.com/ipblocks. Por exemplo, para os Estados Unidos, certifique-se de preencher o IP. proibição para todos os EUA.
Se quiser desbloqueá-lo, execute o comando novamente e selecione 2.
3.2 Permitir apenas acesso IP do país especificado com um clique
Acima, implementamos o bloqueio de acesso de IP de um país específico com um clique, mas muitas pessoas desejam permitir que seu site seja acessado apenas por IPs de um determinado país e proibir o acesso a outros. comando:
wget https://do.wzfou.net/wzfou/block-any.sh chmod +x block-ips.sh ./block-ips.sh
O código acima permite apenas acesso IP doméstico e irá escrever as regras em: /etc/rc.d/rc.local As regras do iptables serão reimportadas sempre que o sistema for reiniciado. precisa editar: /etc/rc.d/rc.local exclua o código de execução automática de inicialização correspondente. O código block-any.sh
é o seguinte:
#! /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 você deseja excluir alguns IPs e permitir que esses IPs continuem acessando como exceções, você pode usar o comando iptables -I para adicionar regras de iptables, ou adicionar regras de iptables manualmente. A execução do iptables é de cima para baixo.
3.3 Definido manualmente para permitir acesso IP apenas de países específicos
A configuração manual é igual ao método de configuração com um clique acima. Basta seguir os seguintes comandos um por um.
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 bloqueia IPs específicos
Plug-in WordPress
- HTTPS://WordPress.org/plugins/word volume/
- HTTPS://WordPress.org/plugins/all-in-one-Tenho medo-security-安定-firewall/
- HTTPS://WordPress.org/plugins/IP-geoh-block/
Todos os três plug-ins de segurança do WordPress acima têm configurações para bloquear o acesso IP, que pode ser bloqueado com base na origem, país, intervalo e nome de domínio do IP. (Clique para ampliar)
O IP Geo Block é um pouco mais profissional. Além de bloquear endereços IP específicos, ele também pode bloquear ou impedir que diferentes endereços IP acessem páginas diferentes. (Clique para ampliar)
5. Resumo
A maneira mais simples de um site bloquear o IP de um país específico é o código PHP apresentado neste artigo, que se refere à biblioteca Taobao IP. A precisão é muito alta e também pode ser precisa para a província e a cidade. pode ajustá-lo de acordo com suas necessidades. A desvantagem é que ele não suporta HTTPS e só pode rodar em PHP.
Na verdade, o mais comumente usado é o iptables, que bloqueia diretamente o acesso IP no caminho do firewall do Linux. Não consome recursos e o bloqueia de forma limpa e completa. O módulo Geo IP do Nginx possui uma ampla gama de aplicações. Combinado com o Nginx, você pode exibir diferentes conteúdos para diferentes usuários de IP.