Recientemente, cuando Qiufu estaba manteniendo el sitio web de un cliente, el cliente solicitó que se bloqueara el acceso desde IP extranjeras. Según los registros, la mayoría de las IP atacantes procedían del extranjero y los usuarios objetivo eran nacionales, por lo que solo se permitía el acceso a IP nacionales. el sitio web. Puede bloquear la gran mayoría de los ataques CC y DDoS. Después de pruebas reales, se descubrió que el efecto sigue siendo bueno y el costo de atacar nuevamente ha aumentado mucho.
Sin embargo, más tarde se descubrió un problema después de usar Cloudflare CDN, las direcciones IP obtenidas por el sitio web eran todas de los nodos CDN de Cloudflare. No se pudieron obtener las direcciones IP de los usuarios reales y el efecto de defensa se redujo considerablemente. Afortunadamente, Cloudflare ya ha pensado en esto al incluir la dirección IP del visitante en el encabezado X-Forwarded-For y en el encabezado CF-Connecting-IP.
Con el encabezado X-Forwarded-For, puedes usar el módulo ngx_http_realip_module si es Nginx, o el módulo mod_remoteip si es Apache para obtener la IP real del usuario. Este artículo compartirá cómo compilar y habilitar el módulo ngx_http_realip_module y el módulo mod_remoteip para obtener la dirección IP real del usuario.
En términos generales, los fabricantes de CDN han adoptado protocolos estándar como X-Forwarded-For y X-Real_IP, por lo que el acceso para obtener la IP real del usuario presentado en este artículo es básicamente aplicable a otros fabricantes de CDN. Para obtener más información sobre la aceleración de CDN y la optimización del servidor y los métodos de aceleración, aquí están:
- Gestión de acceso de socios de Cloudflare Aceleración dinámica Railgun habilitada para CDN de Cloudflare
- Tutorial de la aplicación de aceleración Youpaiyun CDN: duplicación con un clic, CDN dinámico estático y SSL gratuito
- WordPress habilita el método de aceleración de caché Nginx fastcgi_cache: ejemplo de configuración de Nginx
1. Nginx compila ngx_http_realip_module
1.1 compilación de una sola pila
Si está utilizando el paquete de un clic Oneinstack, puede usar el siguiente comando para compilar 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 compilación LNMP
Si está utilizando el paquete de un solo clic de LNMP, busque lnmp.conf en el directorio de instalación de lnmp y edítelo, agregue realip a Nginx_Modules_Options
, guarde y ejecute ./upgrade.sh nginx
Simplemente actualice Nginx. El comando es el siguiente:
Nginx_Modules_Options='--with-http_realip_module'
1.3 Panel Pagoda BT
Si está utilizando el panel BT Pagoda, puede usar el siguiente comando para compilar 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. Configuración de Nginx set_real_ip_from
Después de compilar ngx_http_realip_module, ahora solo necesitamos agregar el código set_real_ip_from al archivo de configuración de Nginx. El ejemplo es el siguiente:
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 está utilizando CDN gratuito de CloudFlare, agregue el siguiente código a su archivo de configuración de 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
En términos generales, la dirección IP de CloudFlare no cambiará. Puede encontrarla aquí: https://www.cloudflare.com/ips/, pero por si acaso, wzfou.com recomienda configurar una dirección IP que actualice CloudFlare automáticamente. La tarea programada agrega automáticamente la última IP al archivo de configuración de Nginx. El código se muestra a continuación:
#在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. Módulo mod_remoteip de configuración de Apache
3.1 apache 2.4
No es necesario instalar el módulo mod_remoteip que viene con Apache 2.4. Siga los pasos a continuación:
#启用模块 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 necesita instalar el módulo mod_remoteip. El método es el siguiente:
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. El sitio web solo permite el acceso IP desde Cloudflare CDN
Arriba obtuvimos la dirección IP real del usuario instalando los módulos ngx_http_realip_module y mod_remoteip, pero a veces necesitamos usar la función de protección de seguridad de Cloudflare para evitar ataques CC o DDoS, es decir, solo permitir que la IP CDN de Cloudflare acceda a nuestro acceso.
Los ejemplos de código en los que Nginx niega y permite directamente el acceso IP son los siguientes:
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 solo permitimos que la IP de Cloudflare CDN acceda al sitio web, podemos agregar directamente la IP de Cloudflare CDN al rango permitido en la configuración de 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;
Actualizar automáticamente la IP CDN de Cloudflare. Es simple y conveniente agregar manualmente la IP de CDN de Cloudflare a la configuración de Nginx. Sin embargo, una vez que la IP de CDN de Cloudflare cambia, debe manejarlo manualmente. Podemos crear un script para actualizar periódicamente la IP de CDN de Cloudflare. agréguelo a la configuración de Nginx, el código es el siguiente:
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. Resumen
Después de usar la aceleración CDN, la IP del usuario obtenida por nuestro sitio web se convierte en la IP del CDN. Si queremos obtener la IP real del usuario, debemos usar las funciones de modo de Nginx y Apache. Por supuesto, si está utilizando PHP, como WordPress, simplemente agregue el siguiente código directamente a su archivo de configuración de WordPress.
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(‘,’,$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; }
Un recordatorio especial aquí es que si habilita la aceleración dinámica de Cloudflare Railgun (la administración de acceso de Cloudflare Partner de Mining Station proporciona este servicio gratuito), recuerde agregar la IP del servidor Railgun a la configuración, porque después de habilitar Railgun, el sitio web obtendrá la IP. Las direcciones obtenidas son todas del servidor Railgun.