Als Qiufu kürzlich die Website eines Kunden pflegte, beantragte dieser, den Zugriff von ausländischen IPs zu blockieren. Den Protokollen zufolge kamen die meisten angreifenden IPs aus dem Ausland und die Zielbenutzer waren Inländer, sodass nur inländische IPs darauf zugreifen durften Die Website kann die überwiegende Mehrheit der CC- und DDoS-Angriffe blockieren. Nach tatsächlichen Tests wurde festgestellt, dass die Wirkung immer noch gut ist und die Kosten für einen erneuten Angriff stark gestiegen sind.

Später wurde jedoch ein Problem entdeckt. Die von der Website erhaltenen IP-Adressen stammten nicht von den CDN-Knoten von Cloudflare, und die Verteidigungswirkung wurde erheblich verringert. Glücklicherweise hat Cloudflare bereits für uns daran gedacht, indem es die IP-Adresse des Besuchers in den Header   X-Forwarded-For und den Header CF-Connecting-IP eingefügt hat.

Mit dem X-Forwarded-For-Header können Sie das Modul ngx_http_realip_module verwenden, wenn es sich um Nginx handelt, oder das Modul mod_remoteip, wenn es sich um Apache handelt, um die echte IP des Benutzers zu erhalten. In diesem Artikel erfahren Sie, wie Sie die Module ngx_http_realip_module und mod_remoteip kompilieren und aktivieren, um die echte IP-Adresse des Benutzers zu erhalten.

Im Allgemeinen haben CDN-Anbieter Standardprotokolle wie X-Forwarded-For und X-Real_IP übernommen, sodass der in diesem Artikel vorgestellte Zugriff zum Erhalten der echten IP des Benutzers grundsätzlich auch auf andere CDN-Anbieter anwendbar ist. Weitere Informationen zur CDN-Beschleunigung sowie zu Methoden zur Serveroptimierung und -beschleunigung finden Sie hier:

  1. Cloudflare-Partnerzugriffsverwaltung Cloudflare CDN-fähige dynamische Railgun-Beschleunigung
  2. Youpaiyun CDN-Beschleunigungsanwendungs-Tutorial – Ein-Klick-Spiegelung, statisches dynamisches CDN und kostenloses SSL
  3. WordPress aktiviert die Nginx-Cache-Beschleunigungsmethode fastcgi_cache – Nginx-Konfigurationsbeispiel

1. Nginx kompiliert ngx_http_realip_module

1.1  Oneinstack-Kompilierung

Wenn Sie das One-Click-Paket Oneinstack verwenden, können Sie den folgenden Befehl zum Kompilieren von ngx_http_realip_module verwenden:

#下编译安装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  LNMP-Kompilierung

Wenn Sie das LNMP-Ein-Klick-Paket verwenden, suchen Sie lnmp.conf im lnmp-Installationsverzeichnis und bearbeiten Sie es, fügen Sie realip zu Nginx_Modules_Options hinzu, speichern Sie es und führen Sie es aus ./upgrade.sh nginx um einfach Nginx zu aktualisieren. Der Befehl lautet wie folgt:

Nginx_Modules_Options='--with-http_realip_module'

1.3  BT-Pagodentafel

Wenn Sie das BT Pagoda-Panel verwenden, können Sie den folgenden Befehl verwenden, um ngx_http_realip_module zu kompilieren:

#宝塔面板安装模块

#先查看一下本机的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. Nginx-Einstellungen set_real_ip_from

Nach dem Kompilieren von ngx_http_realip_module müssen wir jetzt nur noch den set_real_ip_from-Code zur Nginx-Konfigurationsdatei hinzufügen. Das Beispiel lautet wie folgt:

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;

Wenn Sie das kostenlose CDN CloudFlare verwenden, fügen Sie bitte den folgenden Code zu Ihrer Nginx-Konfigurationsdatei hinzu.

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

Im Allgemeinen ändert sich die IP-Adresse von CloudFlare nicht. Sie finden sie hier: https://www.cloudflare.com/ips/, aber für alle Fälle empfiehlt wzfou.com, eine IP-Adresse festzulegen, die CloudFlare automatisch aktualisiert Die geplante Aufgabe fügt der Nginx-Konfigurationsdatei automatisch die neueste IP hinzu. Code wie folgt anzeigen:

#在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. Apache-Konfiguration mod_remoteip-Modul

3.1  Apache 2.4

Das mit Apache 2.4 gelieferte Modul mod_remoteip muss nicht installiert werden. Führen Sie die folgenden Schritte aus:

#启用模块

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 muss das Modul mod_remoteip installieren. Die Methode lautet wie folgt:

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. Die Website erlaubt nur den IP-Zugriff über Cloudflare CDN

Oben haben wir die tatsächliche IP-Adresse des Benutzers erhalten, indem wir die Module ngx_http_realip_module und mod_remoteip installiert haben. Manchmal müssen wir jedoch die Sicherheitsschutzfunktion von Cloudflare verwenden, um CC- oder DDoS-Angriffe zu verhindern, dh nur Cloudflare CDN IP den Zugriff auf unseren Zugriff ermöglichen.

Die Codebeispiele für das direkte Verweigern und Zulassen des IP-Zugriffs durch Nginx lauten wie folgt:

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;
}

Wenn wir nur der IP von Cloudflare CDN den Zugriff auf die Website erlauben, können wir die IP von Cloudflare CDN direkt zum zulässigen Bereich in der Nginx-Konfiguration hinzufügen.

#直接加入
# 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;

Cloudflare CDN-IP automatisch aktualisieren. Es ist einfach und bequem, die Cloudflare-CDN-IP manuell zur Nginx-Konfiguration hinzuzufügen. Sobald sich die Cloudflare-CDN-IP ändert, müssen Sie dies jedoch manuell tun. Wir können ein Skript erstellen, um die Cloudflare-CDN-IP regelmäßig zu aktualisieren Fügen Sie es der Nginx-Konfiguration hinzu. Der Code lautet wie folgt:

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. Zusammenfassung

Nach der Verwendung der CDN-Beschleunigung wird die von unserer Website erhaltene Benutzer-IP zur CDN-IP. Wenn wir die echte IP des Benutzers erhalten möchten, müssen wir die Modusfunktionen von Nginx und Apache verwenden. Wenn Sie PHP wie WordPress verwenden, fügen Sie natürlich einfach den folgenden Code direkt zu Ihrer WordPress-Konfigurationsdatei hinzu.

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

Eine besondere Erinnerung hier ist, dass Sie, wenn Sie die dynamische Beschleunigung von Cloudflare Railgun aktivieren (das Cloudflare-Partnerzugriffsmanagement von Mining Station bietet diesen kostenlosen Dienst an), daran denken, die IP des Railgun-Servers zur Konfiguration hinzuzufügen, da die Website nach der Aktivierung von Railgun die IP erhält Die erhaltenen Adressen stammen alle vom Railgun-Server.

Hinterlasse eine Antwort