OPNsense 防火墙系列五:HAProxy IPv6 反向代理、IPv6 代理 IPv4

说明

前文 OPNsense 防火墙系列四:固定 IPv6 后缀 + IPv6 端口转发 记录了可以通过端口转发访问 OPNsense 来访问内部服务,但也导致对应的内网服务器和端口也暴露在网页中,本文接着记录如何通过反向代理,

端口转发、反向代理区别

简单来说,端口转发就是一个本来就可公开访问的服务,还需要由另一服务器转发服务,所以对于内网而言,源服务是暴露在公网环境中的。

而反向代理则是,公网想要访问某一特定服务只能通过访问“用于反向代理的公网服务器”进行访问,再交由该公网服务器去访问内网中源服务,源服务并非是暴露在公网中,可以由内网防火墙提供安全保护。

同时,反向代理可以实现前后端分离。后端,可以代理 HTTP 和 HTTPS 的服务;前端,可以将后端的 HTTP 转为 HTTPS ,也可以将后端 HTTPS 转为 HTTP 。前端协议与后端无关。

IPv6 、 IPv4 相互代理

通过 HAProxy 可以实现 IPv6 代理 IPv4 和 IPv4 代理 IPv6 ,理论上,可以通过

"Only IPv4 <-> HAProxy(OPNsense IPv6+IPv4) <-> Internet <-> HAProxy(公网中转服务器 IPv6+IPv4) <-> Only IPv4" 的链路实现无公网 IPv4 的情况下的、一端(或双端)纯 IPv4 访问。但是这条链路稳定性估计不高,而且和寻常依赖于公网服务器的内网穿透一样,受限于公网服务器的带宽。

安装 HAProxy 插件

系统 -> 固件 -> 插件 中安装 os-haproxy 插件,刷新页面。

配置真实服务器(代理后端)

添加真实服务器: HAProxy 应该用于在它们之间进行负载平衡或代理的所有物理或虚拟服务器。

说实话,上面引用的官中说明我没看懂,可以这样去理解:

  • 要添加的“真实服务器”应该是:需要进行 负载均衡/反向代理硬件/虚拟 服务器。

源服务 HTTP

服务 -> HAProxy -> 设置 中,选择 真实服务器 的下拉栏中 真实服务器 ,添加:

项目 子项目 说明
编辑服务器
启用 勾选
名称或前缀 自定义 填写服务器提供的服务名称
类型 静态
静态服务器
FQDN或IP 自定义 建议填写内网服务器 IPv4
通用选项
端口 自定义 填写服务端口
模式 活动 [默认]
SSL 自定义
验证SSL证书 自定义

源服务 HTTPS

注意, 通用选项 中的 SSL验证SSL证书 的启用与否,表示:代理的源服务是否是 HTTPS 协议。均勾选说明源服务是包含有证书的 HTTPS ,这两项是否勾选取决于源服务。

保存,应用,并测试语法。

要使用 OPNsense SSL 的,后文会提到。

配置后端池

服务 -> HAProxy -> 设置 中,选择 虚拟服务 下拉栏中 后端池 ,添加:

项目 子项目 说明
编辑后端池
启用 勾选
名称 自定义
模式 HTTP (7层) [默认]
平衡算法 源-IP哈希 [默认]
代理协议 none
服务器 添加的真实服务器
解析器 none
启用运行状况检查 勾选
运行状况检查
运行状况监测 添加的真实服务器
规则
选择规则 为空 一定为空,点击 清除所有 ,此处若有规则,HAProxy 会崩溃

保存,应用,并测试语法。

注意,前面每添加一个真实服务器,就要对应添加一个后端池。

配置条件

服务 -> HAProxy -> 设置 中,选择 规则&检查 下拉栏中 条件 ,添加:

项目 子项目 说明
常规
名称 自定义 用于识别规则
条件
条件类型 主机匹配
参数
主机字符串 自定义 建议填写服务器内网 IPv4 地址

保存,应用,并测试语法。

配置规则

服务 -> HAProxy -> 设置 中,选择 规则&检查 下拉栏中 规则 ,添加:

项目 子项目 说明
常规
名称 自定义 标识此规则的名称
可选条件
选择条件 此前添加的条件
参数
使用后端池 此前添加的后端池

保存,应用,并测试语法。

配置公共服务(代理前端)

普通代理 - HTTP 反向代理 HTTP(S)

普通代理,对外仅提供 HTTP 服务,不提供 HTTPS 服务。

服务 -> HAProxy -> 设置 中,选择 虚拟服务 下拉栏中 公共服务 ,添加:

项目 子项目 说明
常规
启用 勾选
侦听地址 0.0.0.0:<端口> [::]:<端口> <OPNsense 域名>:<端口> 示例:0.0.0.0:8080 [::]:8080 www.example.com:8080
类型 HTTP / HTTPS (SSL卸载) [默认]
默认后端池 此前添加的后端池
启用SSL卸载 不勾选
高级SSL设置
最低SSL版本 TLSv1.2
启用HSTS 不勾选
HSTS max-age 15768000
规则
选择规则 此前添加的规则

注意:在表 常规 -> 侦听地址0.0.0.0:8080 是对内网,而 [::]:8080 则对于公网 IPv6 访问起决定性作用。

其实表中 常规 -> 侦听地址 也可以用 <IPv6 具体地址>:<端口> 实现访问,但是 DDNS 不可能长时间固定 IPv6 ,所以用自身缺省更好。

保存,应用,并测试语法。

SSL 代理 - HTTPS 反向代理 HTTP(S)

SSL 代理,仅对外提供 HTTPS 服务,不提供 HTTP 服务。

依照“普通代理(HTTP proxy HTTP)”的表,更改配置:

项目 子项目 说明
常规
启用SSL卸载 勾选
SSL卸载 若勾选 启用SSL卸载 ,则出现该项目
证书 选择 OPNsense SSL 证书
默认证书 选择 OPNsense SSL 证书
启用高级设置 勾选
高级SSL设置
最低SSL版本 TLSv1.2
启用HSTS 勾选
HSTS max-age 15768000

开启 HAProxy 服务

服务 -> HAProxy -> 设置 中,选择 设置 下拉栏中 服务 ,配置:

项目 子项目 说明
服务
启用HAProxy 勾选

保存,应用,并测试语法。

HAProxy 配置报错处理

因为操作的原因,可能会使得配置有无,此时,HAProxy 会报高亮提示:

There are pending configuration changes that must be applied in order for them to take effect. To review them visit the Config Diff page.

这里需要删除配置错误的项目,这里建议初次配置时,备份 OPNsense 数据,每个服务的反向代理,都重新走一遍流程,以便出错删除恢复。

Unbound DNS 出错处理

由于 HAProxy 配置时,会配合 OPNsense 的 DNS 服务(我这里默认Unbound DNS)。HAProxy 配置有误时,会导致 DNS 服务中止,所以可以通过 计划任务 重启 Unbound DNS 服务。

系统 -> 设置 -> 调度任务 中,添加:

项目 说明
启用 勾选
分钟 0
小时 */2 每 2 个小时重启服务
日期 *
月份 *
星期 *
命令 Restart Unbound DNS service 重启 Unbound DNS 服务

保存,并应用更改。

修改防火墙规则

防火墙 -> 规则 -> WAN 中,添加:

项目 子项目 说明
编辑防火墙规则
操作 通过
接口 WAN
方向 in
TCP/IP版本 IPv6
协议 TCP
any
目标 WAN 地址
目标端口范围 <其他/预设> <端口> 示例:从 (其他) 8080
<其他/预设> <端口> 示例:到 (其他) 8080

要添加 IPv4 + IPv6 的配置,最好分开添加。

保存,并应用更改。

开始使用

内网中可以通过 https://192.168.1.1:8080/ 等测试访问 SSL 反向代理。

公网中可以在手机移动网络中(不连接内网)通过 https://<域名>:8080/ 等测试访问 SSL 反向代理。

错误处理

  1. 若设置 Haproxy 代理且开放防火墙对应端口出入权限之后,依然访问显示 502 响应码(服务器响应异常),应检查 Haproxy 真实服务器SSL验证SSL证书 是否勾选。若后端服务为 HTTPS 而未勾选上述两项,则显示 502 响应码。

参考

  1. Opnsense+HAProxy as reverse proxy for self-hosted services - pfSense - Spiceworks
  2. [solved] 21.7.7 haproxy: "There are pending configuration changes" (opnsense.org)
posted @ 2022-09-03 20:09  Yogile  阅读(2882)  评论(0编辑  收藏  举报