雷池+frp 批量设置proxy_protocol实现真实IP透传
需求
内网部署safeline,通过frp让外网访问内部web网站服务,让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器:192.168.2.103
frp client 配置
frpc只需要在https上添加transport.proxyProtocolVersion = "v2"
即可,例如
root@safeline:~# cat /etc/frp/frpc.toml
[[proxies]]
name = "web1"
type = "https"
localIP = "192.168.2.103"
localPort = 443
subdomain = "web1"
transport.proxyProtocolVersion = "v2"[[proxies]]
name = "web2"
type = "https"
localIP = "192.168.2.103"
localPort = 443
subdomain = "web2"
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地址
root@safeline:/data/safeline/resources/nginx# cat /data/safeline/resources/nginx/proxy_params
# 内网地址范围
set_real_ip_from 192.168.0.0/16; # 覆盖 192.168.0.0 到 192.168.255.255
set_real_ip_from 172.16.0.0/12; # 覆盖 172.16.0.0 到 172.31.255.255
set_real_ip_from 10.0.0.0/8; # 覆盖 10.0.0.0 到 10.255.255.255# 公网 frps 服务器的 IP 地址
set_real_ip_from 服务器的 IP 地址;real_ip_header proxy_protocol;# 其他代理设置
proxy_set_header X-Real-IP $realip_remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_hide_header X-Powered-By;# 添加条件判断以兼容非 proxy_protocol 连接
set $proxy_x_forwarded_for $proxy_add_x_forwarded_for;
set $proxy_x_real_ip $remote_addr;if ($proxy_protocol_addr) {set $proxy_x_forwarded_for "$proxy_protocol_addr, $proxy_x_forwarded_for";set $proxy_x_real_ip $proxy_protocol_addr;
}proxy_set_header X-Forwarded-For $proxy_x_forwarded_for;
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)创建脚本
vim /data/safeline/resources/nginx/sites-enabled/config-proxy_protocol.sh
2) 脚本内容如下,请注意要修改成自己的主域名和子域名
#!/bin/bash# 主域名 ;改为自己的主域名,例如 ttxs.com
main_domain="ttxs.com"# 白名单子域名列表,如:op1.ttxs.com、op2.ttxs.com
whitelist_subdomains=("op1""op2"
)# 帮助函数
show_help() {echo "用法:$0 [true|false]"echo " true - 添加 proxy_protocol 支持"echo " false - 移除 proxy_protocol 支持"echo " ? - 显示此帮助信息"
}# 检查参数
case "$1" intrue|false) action=$1 ;;""|"?") show_help; exit 0 ;;*) echo "错误:参数必须是 true 或 false。"; exit 1 ;;
esac# 修改配置函数
modify_config() {local file=$1local add_proxy=$2local changed=falsewhile IFS= read -r line; doif [[ $line =~ listen.*:443 ]]; thenif $add_proxy && [[ ! $line =~ proxy_protocol ]]; thenline="${line/ssl http2;/ssl http2 proxy_protocol;}"changed=trueelif ! $add_proxy && [[ $line =~ proxy_protocol ]]; thenline="${line/ proxy_protocol/}"changed=truefifiecho "$line"done < "$file" > "${file}.tmp"if $changed; thenmv "${file}.tmp" "$file"if $add_proxy; thenecho "已添加 proxy_protocol 支持: $file"elseecho "已移除 proxy_protocol 支持: $file"fielserm "${file}.tmp"if $add_proxy; thenecho "已支持 proxy_protocol,无需修改: $file"elseecho "无 proxy_protocol 支持,无需修改: $file"fifi
}# 主处理逻辑
for file in IF_backend_*; do[ -f "$file" ] || continueserver_name=$(grep "server_name" "$file" | awk '{print $2}' | tr -d ';\n' | sed 's/on$//')subdomain=${server_name%%.*}if [[ " ${whitelist_subdomains[*]} " =~ " $subdomain " ]]; thenecho "白名单域名,跳过修改: $file ($server_name)"continueficase "$action" intrue) modify_config "$file" true ;;false) modify_config "$file" false ;;*) modify_config "$file" true ;; # 默认添加支持esac
done# 测试并重新加载 Nginx 配置
echo "测试 Nginx 配置..."
if docker exec safeline-tengine nginx -t; thenecho "重新加载 Nginx 配置..."docker exec safeline-tengine nginx -s reloadecho "操作完成"
elseecho "Nginx 配置测试失败,未重新加载配置"exit 1
fi
3)给脚本添加执行权限
chmod +x /data/safeline/resources/nginx/sites-enabled/config-proxy_protocol.sh
3. 执行脚本进行批量修改
执行脚本,可传入参数true
或false
用法
root@safeline:/data/safeline/resources/nginx/sites-enabled# bash config-proxy_protocol.sh
用法:config-proxy_protocol.sh [true|false]true - 添加 proxy_protocol 支持false - 移除 proxy_protocol 支持? - 显示此帮助信息
1)执行批量添加proxy_protocol示例
bash config-proxy_protocol.sh true
2)批量取消proxy_protocol添加示例
bash config-proxy_protocol.sh false
因为我们添加有白名单,而所有的防护站点都是监听同一个443端口,所以当有站点加白没有添加protocol
支持的时候,执行会打印如下告警
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. 测试
上面都配置好之后,访问配置好的域名,发现小地图已经正常显示归属地,配置成功
—百川论坛转发,作者:つ微凉徒眸意浅挚半
相关文章:

雷池+frp 批量设置proxy_protocol实现真实IP透传
需求 内网部署safeline,通过frp让外网访问内部web网站服务,让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器:192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…...

DAY27||回溯算法基础 | 77.组合| 216.组合总和Ⅲ | 17.电话号码的字母组合
回溯算法基础知识 一种效率不高的暴力搜索法。本质是穷举。有些问题能穷举出来就不错了。 回溯算法解决的问题有: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数…...

js基础速成12-正则表达式
正则表达式 正则表达式(Regular Expression)或 RegExp 是一种小型编程语言,有助于在数据中查找模式。RegExp 可以用来检查某种模式是否存在于不同的数据类型中。在 JavaScript 中使用 RegExp,可以使用 RegExp 构造函数࿰…...
使用Selenium自动化测试定位iframe以及修改img标签的display属性值
在使用 Selenium 进行自动化测试时,处理 iframe 是一个常见问题。当页面中出现 iframe 时,需要先切换到该 iframe 内部,才能正常定位和操作其中的元素。以下是处理 iframe 的步骤和示例代码: 步骤 切换到 iframe:使用…...

DAY13
面试遇到的新知识点 char str[10],只有10个字符的空间,但是只能存储9个字符,最后一个字符用来存储终止符\0 strlen只会计算\n,不会计算\0 值传递: void test2(char * str) {str "hello\n"; }int main() {char * str;test2(str);…...
WPF 自定义用户控件(Content根据加减按钮改变值)
前端代码: <UserControl.Resources><Style x:Key"Num_Button_Style" TargetType"Button"><Setter Property"MinWidth" Value"30" /><Setter Property"Height" Value"35" />&l…...

CPU、GPU、显卡
CPU VS GPUCPU(Central Processing Unit),中央处理器GPU(Graphics Processing Unit),图形处理单元GPU 的技术演变CUDA(Compute Unified Device Architecture) 显卡(Video…...
深入理解 Django 自定义用户模型
1. 引言 Django 作为一个强大的 Web 框架,内置了用户认证系统。然而,实际项目中我们通常需要扩展用户模型,以满足不同的业务需求。Django 提供了继承 AbstractUser 的方式,让我们能够轻松地定制用户模型。本文将通过一个自定义用…...

顺序表和链表的区别
顺序表和链表的区别 不同点顺序表链表(带头双向循环)存储空间物理上一定连续逻辑上连续物理上不一定连续随机访问(用下标随机访问)支持:O(1)不支持:O(N)任意位置插入或者删除元素可能需要搬移元素…...

系分-数据库总结
历年试题2024年05月试题 BCN范式,模式分解,触发器类型2023年05月试题 NoSQL基本特点,NoSQL对比,混合数据库2022年05月试题4 两段锁,事务并发,数据一致,本地事务发布20…...
new Date()解析
JavaScript 中的 new Date() 构造函数用于创建一个表示日期和时间的对象。Date 对象使得你可以以多种方式获取、设置和格式化日期和时间。让我们深入解析一下 new Date() 及其用法。 创建 Date 对象 可以通过多种方式创建 Date 对象: 不带参数: let no…...
df 的各种用法 以及与du 的区别
df的用法 在 Linux 中,“df”(disk free)是一个用于显示磁盘空间使用情况的命令。 一、主要功能 它可以列出文件系统的磁盘空间使用情况,包括磁盘总容量、已使用空间、可用空间以及使用率等信息。 二、常见用法及参数 基本用法&a…...
2024年下半年软考准考证什么时候打印?
2024年下半年软考准考证打印入口网址如下: https://bm.ruankao.org.cn/sign/welcome 广东的同学特别注意:准考证打印截止时间是11月8号,也就是考试前一天。一定要提前打印准考证,考试当天是无法打印的。 2024年下半年软考准考证…...

企业安全运行与维护(Enterprise Security Operation and Maintenance)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...
每日“亿“题 东方博宜OJ 1424-自然数的分解
原题链接:1424 - 自然数的分解-东方博宜OJ 题目描述 给定自然数 n ,将其拆分成若干自然数的和。输出所有解,每组解中数字按从小到大排列。相同数字的不同排列算一组解。 如,读入整数 3 ,分解方案如下: …...

初识Linux · 文件(1)
目录 前言: 回顾语言层面的文件 理解文件的预备知识 文件和磁盘 使用和认识系统调用函数 前言: 本文以及下篇文章,揭露的都是Linux中文件的奥秘,对于文件来说,初学Linux第一节课接触的就是文件,对于C…...

【MYSQL】mysql约束---自增长约束(auto_increment)
1、概念 在Mysql中,当主键为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。 注意:自增长约束通常与主键放在一起使用。 通过给…...
基于STM32设计的智能学习台灯(华为云IOT)(238)
文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成【4】ESP8266工作模式配置1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1…...

网络层协议 --- IP
序言 在这篇文章中我们将介绍 IP协议,经过这篇文章的学习,我们就会了解运营商到底是如何为我们提供服务的以及平时我们所说的内网,公网到底又是什么,区别是什么? IP 地址的基本概念 1. IP 地址的定义 每一个设备接入…...

Java虚拟机(JVM)介绍
**Java虚拟机(JVM)**是Java平台的核心组件,它提供了一个运行时环境,使得Java程序可以在不同的操作系统和硬件平台上运行而无需修改。 JVM的架构 JVM主要由以下几个部分组成: 类加载器(Class Loader…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...