Récemment, lorsque Qiufu gérait le site Web d'un client, celui-ci a demandé que l'accès des adresses IP étrangères soit bloqué. Selon les journaux, la plupart des adresses IP attaquantes provenaient de l'étranger et les utilisateurs cibles étaient nationaux, de sorte que seules les adresses IP nationales étaient autorisées à y accéder. le site Web. Peut bloquer la grande majorité des attaques CC et DDoS. Après des tests réels, il a été constaté que l'effet est toujours bon et que le coût d'une nouvelle attaque a considérablement augmenté.

Cependant, un problème a été découvert plus tard : après avoir utilisé Cloudflare CDN, les adresses IP obtenues par le site Web provenaient toutes des nœuds CDN de Cloudflare. Les adresses IP des utilisateurs réels n'ont pas pu être obtenues et l'effet de défense a été considérablement réduit. Heureusement, Cloudflare y a déjà pensé pour nous en incluant l'adresse IP du visiteur dans l'en-tête   X-Forwarded-For et l'en-tête CF-Connecting-IP.

Avec l'en-tête X-Forwarded-For, vous pouvez utiliser le module ngx_http_realip_module s'il s'agit de Nginx, ou le module mod_remoteip s'il s'agit d'Apache pour obtenir la véritable adresse IP de l'utilisateur. Cet article expliquera comment compiler et activer les modules ngx_http_realip_module et mod_remoteip pour obtenir la véritable adresse IP de l'utilisateur.

De manière générale, les fabricants de CDN ont adopté des protocoles standards tels que X-Forwarded-For et X-Real_IP, de sorte que l'accès pour obtenir la véritable adresse IP de l'utilisateur présenté dans cet article est fondamentalement applicable aux autres fabricants de CDN. Pour plus d'informations sur l'accélération CDN et les méthodes d'optimisation et d'accélération du serveur, voici :

  1. Gestion des accès des partenaires Cloudflare Accélération dynamique Railgun compatible Cloudflare CDN
  2. Tutoriel d'application d'accélération Youpaiyun CDN - mise en miroir en un clic, CDN dynamique statique et SSL gratuit
  3. WordPress active la méthode d'accélération du cache Nginx fastcgi_cache - Exemple de configuration Nginx

1. Nginx compile ngx_http_realip_module

1.1  Compilation Oneinstack

Si vous utilisez le package en un clic Oneinstack, vous pouvez utiliser la commande suivante pour compiler ngx_http_realip_module :

#下编译安装nginx的时候,都编译安装的哪些模块
[root@wzfoume ~]# nginx -V 
nginx version: nginx/1.14.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC) 
built with OpenSSL 1.1.1a  20 Nov 2018
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.1.1a --with-pcre=../pcre-8.42 --with-pcre-jit --with-ld-opt=-ljemalloc

#进入到oneinstack的nginx安装目录下,如果没有请先解压
[root@wzfoume src]# cd /root/oneinstack/src
[root@wzfoume src]# tar xzf nginx-1.14.2.tar.gz
[root@wzfoume src]# cd /root/oneinstack/src/nginx-1.14.2
[root@wzfoume nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.1.1a --with-pcre=../pcre-8.42 --with-pcre-jit --with-ld-opt=-ljemalloc --with-http_realip_module

make

#如果出现错误,应该是依赖路径不对,请cd ..到上一个目录解压相应的软件
tar xzf pcre-8.42.tar.gz
tar xzf openssl-1.0.2q.tar.gz
tar xzf openssl-1.1.1a.tar.gz

#编译完成,备份原先配置,然后替换nginx二进制文件
mv /usr/local/nginx/sbin/nginx{,_`date +%F`}  #备份nginx
cp objs/nginx /usr/local/nginx/sbin

#查看是否已经把http_realip_module模块加入进去
nginx -V

1.2 Compilation LNMP

Si vous utilisez le package LNMP en un clic, recherchez lnmp.conf dans le répertoire d'installation de lnmp et modifiez-le, ajoutez realip à Nginx_Modules_Options, enregistrez et exécutez ./upgrade.sh nginx pour simplement mettre à niveau Nginx. La commande est la suivante :

Nginx_Modules_Options='--with-http_realip_module'

1.3  Panneau Pagode BT

Si vous utilisez le panneau BT Pagoda, vous pouvez utiliser la commande suivante pour compiler ngx_http_realip_module :

#宝塔面板安装模块

#先查看一下本机的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_realip_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_realip_module
#只编译不安装
make

#先停用Nginx,然后替换新的Nginx并查看模块是否已经加载。命令如下:
mv /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx-wzfou.backup
cp objs/nginx /www/server/nginx/sbin/nginx
nginx -V

#重启Nginx

2. Paramètres Nginx set_real_ip_from

Après avoir compilé ngx_http_realip_module, il ne nous reste plus qu'à ajouter le code set_real_ip_from au fichier de configuration Nginx. L'exemple est le suivant :

set_real_ip_from 222.222.222.222;  #这里是需要填写具体的CDN服务器IP地址,可添加多个
set_real_ip_from 222.222.111.111; 
real_ip_header  X-Forwarded-For;
real_ip_recursive on;

Si vous utilisez le CDN gratuit CloudFlare, veuillez ajouter le code suivant à votre fichier de configuration Nginx.

location / {
 set_real_ip_from 103.21.244.0/22;
 set_real_ip_from 103.22.200.0/22;
 set_real_ip_from 103.31.4.0/22;
 set_real_ip_from 104.16.0.0/12;
 set_real_ip_from 108.162.192.0/18;
 set_real_ip_from 131.0.72.0/22;
 set_real_ip_from 141.101.64.0/18;
 set_real_ip_from 162.158.0.0/15;
 set_real_ip_from 172.64.0.0/13;
 set_real_ip_from 173.245.48.0/20;
 set_real_ip_from 188.114.96.0/20;
 set_real_ip_from 190.93.240.0/20;
 set_real_ip_from 197.234.240.0/22;
 set_real_ip_from 198.41.128.0/17;
 set_real_ip_from 199.27.128.0/21;
 set_real_ip_from 2400:cb00::/32;
 set_real_ip_from 2606:4700::/32;
 set_real_ip_from 2803:f800::/32;
 set_real_ip_from 2405:b500::/32;
 set_real_ip_from 2405:8100::/32;
 set_real_ip_from 2c0f:f248::/32;
 set_real_ip_from 2a06:98c0::/29;
 # use any of the following two
 real_ip_header CF-Connecting-IP;
 #real_ip_header X-Forwarded-For;
 }

#不要忘记重启nginx
service nginx restart

De manière générale, l'adresse IP de CloudFlare ne changera pas. Vous pouvez la trouver ici : https://www.cloudflare.com/ips/, mais juste au cas où, wzfou.com recommande de définir une adresse IP qui met automatiquement à jour CloudFlare. La tâche planifiée ajoute automatiquement la dernière adresse IP au fichier de configuration Nginx. le code s'affiche comme ci-dessous :

#在nginx配置目录创建cloudflare_ip.conf文件
touch /usr/local/nginx/conf/cloudflare_ip.conf

#修改原有的vhost配置,将原来第五步配置的信息改为
include cloudflare_ip.conf;

#创建自更新脚本update_cloudflare_ip.sh(假定该文件放在 /root 目录下),内容如下:

#!/bin/bash
echo "#Cloudflare" > /usr/local/nginx/conf/cloudflare_ip.conf;
for i in `curl https://www.cloudflare.com/ips-v4`; do
        echo "set_real_ip_from $i;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
done
for i in `curl https://www.cloudflare.com/ips-v6`; do
        echo "set_real_ip_from $i;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
done
echo "" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "# use any of the following two" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "real_ip_header CF-Connecting-IP;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "#real_ip_header X-Forwarded-For;" >> /usr/local/nginx/conf/cloudflare_ip.conf;


#配置crontab 每周一的上午5点更新
0 5 * * 1 /bin/bash /root/update_cloudflare_ip.sh

3. Module mod_remoteip de configuration Apache

3.1 apache 2.4

Le module mod_remoteip fourni avec Apache 2.4 n'a pas besoin d'être installé. Suivez les étapes ci-dessous :

#启用模块

vim /usr/local/apache/conf/httpd.conf

Include conf/extra/httpd-remoteip.conf

#添加如下内容
vim /usr/local/apache/conf/extra/httpd-remoteip.conf

LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1/24
#CloudFlare IP Ranges
RemoteIPInternalProxy 103.21.244.0/22
RemoteIPInternalProxy 103.22.200.0/22
RemoteIPInternalProxy 103.31.4.0/22
RemoteIPInternalProxy 104.16.0.0/12
RemoteIPInternalProxy 108.162.192.0/18
RemoteIPInternalProxy 131.0.72.0/22
RemoteIPInternalProxy 141.101.64.0/18
RemoteIPInternalProxy 162.158.0.0/15
RemoteIPInternalProxy 172.64.0.0/13
RemoteIPInternalProxy 173.245.48.0/20
RemoteIPInternalProxy 188.114.96.0/20
RemoteIPInternalProxy 190.93.240.0/20
RemoteIPInternalProxy 197.234.240.0/22
RemoteIPInternalProxy 198.41.128.0/17 #你的CDN的IP,可以重复添加

#修改日志格式,在日志格式中加上%a,然后重启apache即可

LogFormat "%h %a %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %a %l %u %t "%r" %>s %b" common
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %I %O" combined

3.2 apache 2.2

Apache 2.2 doit installer le module mod_remoteip. La méthode est la suivante :

wget https://github.com/ttkzw/mod_remoteip-httpd22/raw/master/mod_remoteip.c
/usr/local/apache/bin/apxs -i -c -n mod_remoteip.so mod_remoteip.c

#启用模块
vim /usr/local/apache/conf/httpd.conf

Include conf/extra/httpd-remoteip.conf

#添加如下内容,然后重启apache即可
vim /usr/local/apache/conf/extra/httpd-remoteip.conf

LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1 #你的CDN的IP,可以重复添加

4. Le site Web autorise uniquement l'accès IP depuis Cloudflare CDN

Ci-dessus, nous avons obtenu la véritable adresse IP de l'utilisateur en installant les modules ngx_http_realip_module et mod_remoteip, mais nous devons parfois utiliser la fonction de protection de sécurité de Cloudflare pour empêcher les attaques CC ou DDoS, c'est-à-dire autoriser uniquement Cloudflare CDN IP à accéder à notre accès.

Les exemples de code de Nginx refusant et autorisant directement l'accès IP sont les suivants :

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    #Railgun IP
    deny  all;
}

Si nous autorisons uniquement l'adresse IP de Cloudflare CDN à accéder au site Web, nous pouvons directement ajouter l'adresse IP de Cloudflare CDN à la plage autorisée dans la configuration nginx.

#直接加入
# https://www.cloudflare.com/ips
# IPv4
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 104.16.0.0/12;
allow 108.162.192.0/18;
allow 131.0.72.0/22;
allow 141.101.64.0/18;
allow 162.158.0.0/15;
allow 172.64.0.0/13;
allow 173.245.48.0/20;
allow 188.114.96.0/20;
allow 190.93.240.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;

# IPv6
allow 2400:cb00::/32;
allow 2405:8100::/32;
allow 2405:b500::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2c0f:f248::/32;
allow 2a06:98c0::/29;

Mettre à jour automatiquement l'adresse IP Cloudflare CDN. Il est simple et pratique d'ajouter manuellement l'adresse IP Cloudflare CDN à la configuration Nginx. Cependant, une fois l'adresse IP Cloudflare CDN modifiée, vous devez la gérer manuellement. Nous pouvons créer un script pour mettre à jour régulièrement et automatiquement l'adresse IP Cloudflare CDN. ajoutez-le à la configuration Nginx, le code est le suivant :

touch /usr/local/nginx/conf/allow_ip.conf
#修改网站nginx配置,加入以下代码:
include /usr/local/nginx/conf/allow_ip.conf;

vim /data/script/allow_cf_ip.sh
#!/bin/bash
echo "#Cloudflare" > /usr/local/nginx/conf/allow_ip.conf;
for i in `curl https://www.cloudflare.com/ips-v4`; do
     echo "allow $i;" >> /usr/local/nginx/conf/allow_ip.conf;
done
for i in `curl https://www.cloudflare.com/ips-v6`; do
       echo "allow $i;" >> /usr/local/nginx/conf/allow_ip.conf;
done


#添加定时任务
0 5 * * 1 /bin/bash /data/script/allow_cf_ip.sh

5. Résumé

Après avoir utilisé l'accélération CDN, l'IP de l'utilisateur obtenue par notre site Web devient l'IP du CDN. Si nous voulons obtenir la véritable IP de l'utilisateur, nous devons utiliser les fonctions de mode de Nginx et Apache. Bien entendu, si vous utilisez PHP, comme WordPress, ajoutez simplement le code suivant directement dans votre fichier de configuration WordPress.

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$list = explode(‘,’,$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}

Un rappel spécial ici est que si vous activez l'accélération dynamique Cloudflare Railgun (la gestion des accès Cloudflare Partner de Mining Station fournit ce service gratuit), n'oubliez pas d'ajouter l'adresse IP du serveur Railgun à la configuration, car après avoir activé Railgun, le site Web obtiendra l'adresse IP. les adresses obtenues proviennent toutes du serveur Railgun.

Laisser une réponse