Recentemente, quando Qiufu gestiva il sito web di un cliente, il cliente ha richiesto che l'accesso da IP stranieri fosse bloccato. Secondo i registri, la maggior parte degli IP attaccanti provenivano dall'estero e gli utenti presi di mira erano nazionali, quindi solo gli IP nazionali potevano accedere. il sito web. Può bloccare la stragrande maggioranza degli attacchi CC e DDoS. Dopo i test effettivi, si è riscontrato che l'effetto è ancora buono e il costo di un nuovo attacco è aumentato notevolmente.
Tuttavia, in seguito è stato scoperto un problema. Dopo l'utilizzo della CDN di Cloudflare, gli indirizzi IP ottenuti dal sito web provenivano tutti dai nodi della CDN di Cloudflare. Non è stato possibile ottenere gli indirizzi IP degli utenti reali e l'effetto di difesa è stato notevolmente ridotto. Fortunatamente, Cloudflare ci ha già pensato per noi includendo l'indirizzo IP del visitatore nell'intestazione X-Forwarded-For e nell'intestazione CF-Connecting-IP.
Con l'intestazione X-Forwarded-For, puoi utilizzare il modulo ngx_http_realip_module se è Nginx o il modulo mod_remoteip se è Apache per ottenere l'IP reale dell'utente. Questo articolo condividerà come compilare e abilitare il modulo ngx_http_realip_module e il modulo mod_remoteip per ottenere l'indirizzo IP reale dell'utente.
In generale, i fornitori di CDN hanno adottato protocolli standard come X-Forwarded-For e X-Real_IP, quindi l'accesso per ottenere l'IP reale dell'utente introdotto in questo articolo è sostanzialmente applicabile ad altri fornitori di CDN. Per ulteriori informazioni sull'accelerazione CDN e sui metodi di ottimizzazione e accelerazione del server, ecco:
- Gestione degli accessi dei partner Cloudflare Accelerazione dinamica Railgun abilitata per CDN Cloudflare
- Tutorial sull'applicazione di accelerazione CDN Youpaiyun: mirroring con un clic, CDN dinamico statico e SSL gratuito
- WordPress abilita il metodo di accelerazione della cache Nginx fastcgi_cache - Esempio di configurazione Nginx
1. Nginx compila ngx_http_realip_module
1.1 Compilazione in uno stack
Se stai utilizzando il pacchetto con un clic Oneinstack, puoi utilizzare il seguente comando per compilare 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 Compilazione LNMP
Se stai utilizzando il pacchetto LNMP con un clic, trova lnmp.conf nella directory di installazione di lnmp e modificalo, aggiungi realip a Nginx_Modules_Options
, salva ed esegui ./upgrade.sh nginx
per aggiornare semplicemente Nginx. Il comando è il seguente:
Nginx_Modules_Options='--with-http_realip_module'
1.3 Pannello Pagoda BT
Se stai utilizzando il pannello BT Pagoda, puoi utilizzare il seguente comando per compilare 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. Impostazioni Nginx set_real_ip_from
Dopo aver compilato ngx_http_realip_module, ora dobbiamo solo aggiungere il codice set_real_ip_from al file di configurazione Nginx. L'esempio è il seguente:
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;
Se utilizzi la CDN gratuita di CloudFlare, aggiungi il seguente codice al file di configurazione 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
In generale, l'indirizzo IP di CloudFlare non cambierà. Puoi trovarlo qui: https://www.cloudflare.com/ips/, ma per ogni evenienza, wzfou.com consiglia di impostare un indirizzo IP che aggiorni automaticamente CloudFlare l'attività pianificata aggiunge automaticamente l'IP più recente al file di configurazione Nginx. codice mostrato come di seguito:
#在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. Modulo mod_remoteip di configurazione di Apache
3.1 apache 2.4
Non è necessario installare il modulo mod_remoteip fornito con Apache 2.4. Seguire i passaggi seguenti:
#启用模块 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 necessita di installare il modulo mod_remoteip. Il metodo è il seguente:
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. Il sito Web consente solo l'accesso IP da Cloudflare CDN
Sopra abbiamo ottenuto il vero indirizzo IP dell'utente installando i moduli ngx_http_realip_module e mod_remoteip, ma a volte dobbiamo utilizzare la funzione di protezione di sicurezza di Cloudflare per prevenire attacchi CC o DDoS, ovvero consentire solo all'IP CDN di Cloudflare di accedere al nostro accesso.
Gli esempi di codice di Nginx che nega e consente direttamente l'accesso IP sono i seguenti:
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; }
Se consentiamo solo all'IP di Cloudflare CDN di accedere al sito Web, possiamo aggiungere direttamente l'IP di Cloudflare CDN all'intervallo consentito nella configurazione 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;
Aggiorna automaticamente l'IP CDN di Cloudflare. È semplice e conveniente aggiungere manualmente l'IP del CDN di Cloudflare alla configurazione Nginx. Tuttavia, una volta che l'IP del CDN di Cloudflare cambia, è necessario gestirlo manualmente. Possiamo creare uno script per aggiornare regolarmente e automaticamente l'IP del CDN di Cloudflare aggiungilo alla configurazione Nginx, il codice è il seguente:
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. Riepilogo
Dopo aver utilizzato l'accelerazione CDN, l'IP dell'utente ottenuto dal nostro sito Web diventa l'IP CDN. Se vogliamo ottenere l'IP reale dell'utente, dobbiamo utilizzare le funzioni modalità di Nginx e Apache. Naturalmente, se utilizzi PHP, come WordPress, aggiungi semplicemente il seguente codice direttamente al file di configurazione di WordPress.
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(‘,’,$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; }
Un promemoria speciale qui è che se abiliti l'accelerazione dinamica di Cloudflare Railgun (la gestione degli accessi dei partner Cloudflare di Mining Station fornisce questo servizio gratuito), ricordati di aggiungere l'IP del server Railgun alla configurazione, perché dopo aver abilitato Railgun, il sito web otterrà l'IP gli indirizzi ottenuti provengono tutti dal server Railgun.