跳转至

Nginx使用

使用了Cloudflare后看日志获取不到真实IP

官方参考文档

1.最简的在nginx配置文件http段配置

set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For
# 是否递归地排除直至得到用户ip,默认off
real_ip_recursive on;
#real_ip_header CF-Connecting-IP; 
#real_ip_header  CF-Connecting-IPv6;

2.优化一下,从Cloudflare那里获取IP

http配置

real_ip_header X-Forwarded-For;
real_ip_recursive on;
include vhost/cloudflare_ips.conf;

编写sh脚本

#!/bin/bash

# IPv4 和 IPv6 地址列表的网址
URL_V4="https://www.cloudflare.com/ips-v4"
URL_V6="https://www.cloudflare.com/ips-v6"

# 配置文件路径
CONF_FILE="/usr/local/nginx/conf/vhost/cloudflare_ips.conf"

# 使用curl获取IPv4地址列表,并使用awk格式化输出
curl -s $URL_V4 | awk '{print "set_real_ip_from " $1 ";"}' > $CONF_FILE

# 检查IPv4地址列表获取是否成功
if [ $? -ne 0 ]; then
    echo "获取IPv4地址列表失败,请检查网络连接或URL地址。"
    exit 1
fi

# 使用curl获取IPv6地址列表,并追加到配置文件
curl -s $URL_V6 | awk '{print "set_real_ip_from " $1 ";"}' >> $CONF_FILE

# 检查IPv6地址列表获取是否成功
if [ $? -ne 0 ]; then
    echo "获取IPv6地址列表失败,请检查网络连接或URL地址。"
    exit 1
fi

echo "IP列表已更新,正在测试nginx配置..."

# 测试nginx配置
sudo nginx -t
if [ $? -eq 0 ]; then
    echo "nginx配置测试通过,正在重新加载..."
    sudo nginx -s reload

    # 检查nginx是否成功重新加载
    if [ $? -eq 0 ]; then
        echo "nginx配置已成功重新加载。"
    else
        echo "nginx配置重新加载失败,请检查错误信息。"
    fi
else
    echo "nginx配置测试失败,请检查配置文件。"
fi

添加定时任务

0 8 * * * /data/tools/cloudflare_ips.sh

给与权限

chmod 755 /data/tools/cloudflare_ips.sh

仅运行Cloudflare的IP访问

获取Cloudflare的IP

#!/bin/bash

# IPv4 和 IPv6 地址列表的网址
URL_V4="https://www.cloudflare.com/ips-v4"
URL_V6="https://www.cloudflare.com/ips-v6"

# 配置文件路径
# 设置真实IP文件
CONF_FILE="/usr/local/nginx/conf/vhost/cloudflare_ips.conf"
# 设置允许访问的IP文件
ALLOW_IP_CONF_FILE="/usr/local/nginx/conf/vhost/allow_cloudflare_ips.conf"

# 使用curl获取IPv4地址列表,并使用awk格式化输出
curl -s $URL_V4 | awk '{print "set_real_ip_from " $1 ";"}' > $CONF_FILE
curl -s $URL_V4 | awk '{print "allow " $1 ";"}' > $ALLOW_IP_CONF_FILE

# 检查IPv4地址列表获取是否成功
if [ $? -ne 0 ]; then
    echo "获取IPv4地址列表失败,请检查网络连接或URL地址。"
    exit 1
fi

# 使用curl获取IPv6地址列表,并追加到配置文件
curl -s $URL_V6 | awk '{print "set_real_ip_from " $1 ";"}' >> $CONF_FILE
curl -s $URL_V6 | awk '{print "allow " $1 ";"}' >> $ALLOW_IP_CONF_FILE

# 检查IPv6地址列表获取是否成功
if [ $? -ne 0 ]; then
    echo "获取IPv6地址列表失败,请检查网络连接或URL地址。"
    exit 1
fi

echo "IP列表已更新,正在测试nginx配置..."

# 测试nginx配置
nginx -t
if [ $? -eq 0 ]; then
    echo "nginx配置测试通过,正在重新加载..."
    nginx -s reload

    # 检查nginx是否成功重新加载
    if [ $? -eq 0 ]; then
        echo "nginx配置已成功重新加载。"
    else
        echo "nginx配置重新加载失败,请检查错误信息。"
    fi
else
    echo "nginx配置测试失败,请检查配置文件。"
fi

修改Nginx配置

location / {
  include /usr/local/nginx/conf/vhost/allow_cloudflare_ips.conf;
  deny all;
  try_files $uri $uri/ /index.php?$args;
}

注意事项

仅允许Cloudflare的IP的访问,就不能设置set_real_ip_from,如果设置就会拿真实IP进行匹配,导致访问被拦截。

如果要获取真实IP,可以修改Nginx日志格式,如:

http {
        # 其他配置
        # ...
        log_format json escape=json '{"@timestamp":"$time_iso8601",'
                            '"server_addr":"$server_addr",'
                            '"remote_addr":"$remote_addr",'
                            '"real_ip":"$http_cf_connecting_ip",'
                            '"scheme":"$scheme",'
                            '"request_method":"$request_method",'
                            '"request_uri": "$request_uri",'
                            '"request_length": "$request_length",'
                            '"uri": "$uri", '
                            '"request_time":$request_time,'
                            '"body_bytes_sent":$body_bytes_sent,'
                            '"bytes_sent":$bytes_sent,'
                            '"status":"$status",'
                            '"upstream_time":"$upstream_response_time",'
                            '"upstream_host":"$upstream_addr",'
                            '"upstream_status":"$upstream_status",'
                            '"host":"$host",'
                            '"http_referer":"$http_referer",'
                            '"http_user_agent":"$http_user_agent"'
                            '}';

        # 其他配置
        # ...

        server {
            # 其他配置
            # ...
            access_log /data/wwwlogs/wiki.lyricn.com_nginx.log json;
        }
    }