雷池+frp 批量设置proxy_protocol实现真实IP透传

打印 上一主题 下一主题

主题 655|帖子 655|积分 1965

需求

内网部署safeline,通过frp让外网访问内部web网站服务,让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器:192.168.2.103
frp client 配置

frpc只必要在https上添加transport.proxyProtocolVersion = "v2"即可,例如
  1. root@safeline:~# cat /etc/frp/frpc.toml
  2. [[proxies]]
  3. name = "web1"
  4. type = "https"
  5. localIP = "192.168.2.103"
  6. localPort = 443
  7. subdomain = "web1"
  8. transport.proxyProtocolVersion = "v2"
  9. [[proxies]]
  10. name = "web2"
  11. type = "https"
  12. localIP = "192.168.2.103"
  13. localPort = 443
  14. subdomain = "web2"
  15. transport.proxyProtocolVersion = "v2"
复制代码
生存并且重启frp服务
safeline配置

safeline不支持web界面添加proxy_protocol支持,无法正常搭配frp显示真实IP,必要直接修改配置文件
1. 修改proxy_params 配置文件

/data/safeline/resources/nginx/proxy_params配置文件不会随着safeline重启而重置,我们在这里给配置全局开启proxy_protocol。
这里注意必要修改set_real_ip_from 服务器的 IP 地址;,改为自己frps服务器的ip地址
  1. root@safeline:/data/safeline/resources/nginx# cat /data/safeline/resources/nginx/proxy_params
  2. # 内网地址范围
  3. set_real_ip_from 192.168.0.0/16;  # 覆盖 192.168.0.0 到 192.168.255.255
  4. set_real_ip_from 172.16.0.0/12;   # 覆盖 172.16.0.0 到 172.31.255.255
  5. set_real_ip_from 10.0.0.0/8;      # 覆盖 10.0.0.0 到 10.255.255.255
  6. # 公网 frps 服务器的 IP 地址
  7. set_real_ip_from 服务器的 IP 地址;
  8. real_ip_header proxy_protocol;
  9. # 其他代理设置
  10. proxy_set_header X-Real-IP $realip_remote_addr;
  11. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  12. proxy_set_header X-Forwarded-Proto $scheme;
  13. proxy_headers_hash_max_size 1024;
  14. proxy_headers_hash_bucket_size 128;
  15. proxy_http_version 1.1;
  16. proxy_set_header Upgrade $http_upgrade;
  17. proxy_set_header Connection $connection_upgrade;
  18. proxy_hide_header X-Powered-By;
  19. # 添加条件判断以兼容非 proxy_protocol 连接
  20. set $proxy_x_forwarded_for $proxy_add_x_forwarded_for;
  21. set $proxy_x_real_ip $remote_addr;
  22. if ($proxy_protocol_addr) {
  23.     set $proxy_x_forwarded_for "$proxy_protocol_addr, $proxy_x_forwarded_for";
  24.     set $proxy_x_real_ip $proxy_protocol_addr;
  25. }
  26. proxy_set_header X-Forwarded-For $proxy_x_forwarded_for;
  27. proxy_set_header X-Real-IP $proxy_x_real_ip;
复制代码
2. 创建config-proxy_protocol.sh脚本

我们要给/data/safeline/resources/nginx/sites-enabled目录下全部的IF_backend文件,在监听部门上添加proxy_protocol支持,其中增长一个白名单域名,白名单中的域名不做任何更改,该脚本可实现批量添加或者移除全部proxy_protocol
我们把脚本放在/data/safeline/resources/nginx/sites-enabled目录下,即/data/safeline/resources/nginx/sites-enabled/config-proxy_protocol.sh
1)创建脚本
  1. vim /data/safeline/resources/nginx/sites-enabled/config-proxy_protocol.sh
复制代码
2) 脚本内容如下,请注意要修改成自己的主域名子域名
  1. #!/bin/bash
  2. # 主域名 ;改为自己的主域名,例如 ttxs.com
  3. main_domain="ttxs.com"
  4. # 白名单子域名列表,如:op1.ttxs.com、op2.ttxs.com
  5. whitelist_subdomains=(
  6.     "op1"
  7.     "op2"
  8. )
  9. # 帮助函数
  10. show_help() {
  11.     echo "用法:$0 [true|false]"
  12.     echo "  true  - 添加 proxy_protocol 支持"
  13.     echo "  false - 移除 proxy_protocol 支持"
  14.     echo "  ?     - 显示此帮助信息"
  15. }
  16. # 检查参数
  17. case "$1" in
  18.     true|false) action=$1 ;;
  19.     ""|"?") show_help; exit 0 ;;
  20.     *) echo "错误:参数必须是 true 或 false。"; exit 1 ;;
  21. esac
  22. # 修改配置函数
  23. modify_config() {
  24.     local file=$1
  25.     local add_proxy=$2
  26.     local changed=false
  27.     while IFS= read -r line; do
  28.         if [[ $line =~ listen.*:443 ]]; then
  29.             if $add_proxy && [[ ! $line =~ proxy_protocol ]]; then
  30.                 line="${line/ssl http2;/ssl http2 proxy_protocol;}"
  31.                 changed=true
  32.             elif ! $add_proxy && [[ $line =~ proxy_protocol ]]; then
  33.                 line="${line/ proxy_protocol/}"
  34.                 changed=true
  35.             fi
  36.         fi
  37.         echo "$line"
  38.     done < "$file" > "${file}.tmp"
  39.     if $changed; then
  40.         mv "${file}.tmp" "$file"
  41.         if $add_proxy; then
  42.             echo "已添加 proxy_protocol 支持: $file"
  43.         else
  44.             echo "已移除 proxy_protocol 支持: $file"
  45.         fi
  46.     else
  47.         rm "${file}.tmp"
  48.         if $add_proxy; then
  49.             echo "已支持 proxy_protocol,无需修改: $file"
  50.         else
  51.             echo "无 proxy_protocol 支持,无需修改: $file"
  52.         fi
  53.     fi
  54. }
  55. # 主处理逻辑
  56. for file in IF_backend_*; do
  57.     [ -f "$file" ] || continue
  58.     server_name=$(grep "server_name" "$file" | awk '{print $2}' | tr -d ';\n' | sed 's/on$//')
  59.     subdomain=${server_name%%.*}
  60.    
  61.     if [[ " ${whitelist_subdomains[*]} " =~ " $subdomain " ]]; then
  62.         echo "白名单域名,跳过修改: $file ($server_name)"
  63.         continue
  64.     fi
  65.    
  66.     case "$action" in
  67.         true)  modify_config "$file" true ;;
  68.         false) modify_config "$file" false ;;
  69.         *)     modify_config "$file" true ;; # 默认添加支持
  70.     esac
  71. done
  72. # 测试并重新加载 Nginx 配置
  73. echo "测试 Nginx 配置..."
  74. if docker exec safeline-tengine nginx -t; then
  75.     echo "重新加载 Nginx 配置..."
  76.     docker exec safeline-tengine nginx -s reload
  77.     echo "操作完成"
  78. else
  79.     echo "Nginx 配置测试失败,未重新加载配置"
  80.     exit 1
  81. fi
复制代码
3)给脚本添加执行权限
  1. chmod +x /data/safeline/resources/nginx/sites-enabled/config-proxy_protocol.sh
复制代码
3. 执行脚本进行批量修改

执行脚本,可传入参数true或false 用法
  1. root@safeline:/data/safeline/resources/nginx/sites-enabled# bash config-proxy_protocol.sh
  2. 用法:config-proxy_protocol.sh [true|false]
  3.   true  - 添加 proxy_protocol 支持
  4.   false - 移除 proxy_protocol 支持
  5.   ?     - 显示此帮助信息
复制代码

1)执行批量添加proxy_protocol示例
  1. bash config-proxy_protocol.sh true
复制代码

2)批量取消proxy_protocol添加示例
  1. bash config-proxy_protocol.sh false
复制代码

因为我们添加有白名单,而全部的防护站点都是监听同一个443端口,所以当有站点加白没有添加protocol支持的时候,执行会打印如下告警
  1. nginx: [warn] protocol options redefined for 0.0.0.0:443 in /etc/nginx/sites-enabled/IF_backend_3:13
复制代码
寄义是:”protocol options redefined” 表示在 Nginx 配置中,对于同一个监听地址和端口(在这个例子中是 0.0.0.0:443),协议选项被重复界说了。我们忽略这个报警即可。
当我们不做白名单,全部站点都添加proxy_protocol,那就不会打印这个告警了
如果重启服务器或者服务,IF_backend文件被重置,那么直接执行一下该脚本即可
4. 测试

上面都配置好之后,访问配置好的域名,发现小地图已经正常显示归属地,配置成功

—百川论坛转发,作者:つ微凉徒眸意浅挚半

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表