Gần đây, khi Qiufu đang bảo trì trang web của khách hàng, khách hàng đã yêu cầu chặn quyền truy cập từ IP nước ngoài. Theo nhật ký, hầu hết các IP tấn công đều đến từ nước ngoài và người dùng mục tiêu là trong nước nên chỉ IP trong nước mới được phép truy cập. trang web. Có thể chặn phần lớn các cuộc tấn công CC và DDoS. Sau khi thử nghiệm thực tế, người ta thấy rằng hiệu quả vẫn tốt và chi phí cho việc tấn công lại đã tăng lên rất nhiều.

Tuy nhiên, một vấn đề sau đó đã được phát hiện. Sau khi sử dụng Cloudflare CDN, các địa chỉ IP mà trang web thu được đều từ các nút CDN của Cloudflare. Không thể lấy được địa chỉ IP của người dùng thực và hiệu quả phòng thủ đã giảm đi rất nhiều. May mắn thay, Cloudflare đã nghĩ đến điều này cho chúng tôi bằng cách đưa địa chỉ IP của khách truy cập vào tiêu đề   X-Forwarded-For và tiêu đề CF-Connecting-IP.

Với tiêu đề X-Forwarded-For, bạn có thể sử dụng mô-đun ngx_http_realip_module nếu là Nginx hoặc mô-đun mod_remoteip nếu là Apache để lấy IP thực của người dùng. Bài viết này sẽ chia sẻ cách biên dịch và kích hoạt mô-đun ngx_http_realip_module và mô-đun mod_remoteip để lấy địa chỉ IP thực của người dùng.

Nói chung, các nhà sản xuất CDN đã áp dụng các giao thức tiêu chuẩn như X-Forwarded-For và X-Real_IP, do đó việc truy cập để lấy IP thực của người dùng được giới thiệu trong bài viết này về cơ bản có thể áp dụng được cho các nhà sản xuất CDN khác. Để biết thêm thông tin về các phương pháp tăng tốc và tối ưu hóa máy chủ cũng như tăng tốc CDN, đây là:

  1. Cloudflare Quản lý quyền truy cập của đối tác Tăng tốc động Railgun cho phép CDN của Cloudflare
  2. Hướng dẫn ứng dụng tăng tốc CDN Youpaiyun - phản chiếu bằng một cú nhấp chuột, CDN động tĩnh và SSL miễn phí
  3. Cách bật tăng tốc bộ đệm Nginx fastcgi_cache trong WordPress - Ví dụ về cấu hình Nginx

1. Nginx biên dịch ngx_http_realip_module

1.1  Biên dịch Oneinstack

Nếu bạn đang sử dụng gói một cú nhấp chuột Oneinstack, bạn có thể sử dụng lệnh sau để biên dịch 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  Biên dịch LNMP

Nếu bạn đang sử dụng gói một cú nhấp chuột LNMP, hãy tìm lnmp.conf trong thư mục cài đặt lnmp và chỉnh sửa nó, thêm realip vào Nginx_Modules_Options, lưu và thực thi ./upgrade.sh nginx chỉ cần nâng cấp Nginx. Lệnh như sau:

Nginx_Modules_Options='--with-http_realip_module'

1.3 Bảng chùa BT

Nếu bạn đang sử dụng bảng BT chùa, bạn có thể sử dụng lệnh sau để biên dịch 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. Cài đặt Nginx set_real_ip_from

Sau khi biên dịch ngx_http_realip_module, bây giờ chúng ta chỉ cần thêm code set_real_ip_from vào file cấu hình Nginx. Ví dụ như sau:

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;

Nếu bạn đang sử dụng CDN miễn phí của CloudFlare, vui lòng thêm đoạn mã sau vào tệp cấu hình Nginx của bạn.

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

Nói chung, địa chỉ IP của CloudFlare sẽ không thay đổi. Bạn có thể tìm thấy nó ở đây: https://www.cloudflare.com/ips/, nhưng để đề phòng, wzfou.com khuyên bạn nên đặt địa chỉ IP tự động cập nhật CloudFlare. tác vụ theo lịch trình sẽ tự động thêm IP mới nhất vào tệp cấu hình Nginx. mã hiển thị như dưới đây:

#在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ô-đun mod_remoteip cấu hình Apache

3.1  apache 2.4

Không cần cài đặt mô-đun mod_remoteip đi kèm với apache 2.4. Hãy làm theo các bước dưới đây:

#启用模块

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 cần cài đặt mô-đun mod_remoteip. Phương pháp này như sau:

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. Trang web chỉ cho phép truy cập IP từ Cloudflare CDN

Ở trên, chúng tôi đã lấy được địa chỉ IP thực của người dùng bằng cách cài đặt các mô-đun ngx_http_realip_module và mod_remoteip, nhưng đôi khi chúng tôi cần sử dụng chức năng bảo vệ bảo mật của Cloudflare để ngăn chặn các cuộc tấn công CC hoặc DDoS, tức là chỉ cho phép IP Cloudflare CDN truy cập vào quyền truy cập của chúng tôi.

Các ví dụ mã của Nginx trực tiếp từ chối và cho phép truy cập IP như sau:

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

Nếu chúng ta chỉ cho phép IP của Cloudflare CDN truy cập vào trang web thì chúng ta có thể thêm trực tiếp IP của Cloudflare CDN vào phạm vi cho phép trong cấu hình 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;

Tự động cập nhật IP Cloudflare CDN. Việc thêm IP Cloudflare CDN theo cách thủ công vào cấu hình Nginx rất đơn giản và thuận tiện. Tuy nhiên, khi IP Cloudflare CDN thay đổi, bạn phải xử lý thủ công. Chúng tôi có thể tạo một tập lệnh để thường xuyên cập nhật IP Cloudflare CDN. thêm nó vào cấu hình Nginx, mã như sau:

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. Tóm tắt

Sau khi sử dụng khả năng tăng tốc CDN, IP người dùng mà trang web của chúng tôi thu được sẽ trở thành IP của CDN. Nếu muốn lấy IP thực của người dùng, chúng tôi phải sử dụng các chức năng chế độ của Nginx và Apache. Tất nhiên, nếu bạn đang sử dụng PHP, chẳng hạn như WordPress, chỉ cần thêm đoạn mã sau trực tiếp vào tệp cấu hình WordPress của bạn.

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

Một lời nhắc đặc biệt ở đây là nếu bạn kích hoạt tính năng tăng tốc động Cloudflare Railgun (quản lý truy cập Cloudflare Partner của Mining Station cung cấp dịch vụ miễn phí này) thì hãy nhớ thêm IP máy chủ Railgun vào cấu hình, vì sau khi kích hoạt Railgun, website sẽ lấy IP tất cả các địa chỉ thu được đều từ máy chủ Railgun.

Để lại một câu trả lời