9.7 KiB
OpenBSD relayd
在 OpenBSD 的生态中有一款低调而又强大的工具。它就是relayd,也是我本人最喜欢的工具。
relayd是什么?能做什么?先看段演示
relayd 是 OpenBSD 系统自带的一个能实现中继转发、负载均衡与代理服务守护进程。 它最早是为 PF 防火墙做状态跟踪和高可用中继设计的,也就是说,它本质上属于 网络流量的“应用层网关” 同时又具备了反向代理、负载均衡、会话控制等功能。
relayd(8)既可以运行在 第三层(L3)也就是网络层,也可以运行在 第七层(L7)也就是应用层。 它可以实现第三层重定向,通过与OpenBSD的PF防火墙内核模块通信,动态添加或移除重定向规则,从而在网络层直接对 IP 流量做透明转发。
这种模式类似于 NAT(端口地址转换):比如用户访问某个 IP + 端口; PF 和 relayd 合作,把这个流量 导向指定的主机或端口上。比如之前演示的ssh网关例子
relayd(8)在第三层可以做高性能、零协议的解析,适合中继 比如SSH、数据库、VPN等原生TCP服务,但无法做内容过滤、修改以及TLS解密
relayd(8)在第七层也就是应用层工作时,就会真正解析协议内容(如 HTTP 请求头、TLS的服务器指示、TCP 选项等),决定转发逻辑、是否重写字段、是否屏蔽某些内容等,也就是具有了自管理能力。 它支持协议过滤、负载均策略、流量拦截保护、以及智能调度、应用增强等。能够隐藏真实服务器,所有流量都由 relayd 接收并中继,后端服务器只能看到 relayd 的 IP,屏蔽了原始客户端 IP,有效缓解直接攻击。 它在第七层适合做 Web 服务、API 网关、HTTP/HTTPS反向代理、统一出口TLS代理、接口负载均衡调度以及健康度检查和监控等 不过在第七层工作时性能略逊于第三层, relayd 不支持 UDP的转发和中继
Layer 3 模式是“透明搬运工”、马匹——你叫我转我就转; Layer 7 模式是“智能网关”、马夫——我还要看看你是谁、说了什么,才决定怎么处理。
relayd(8) 能做什么? 首先是 TCP 中继(SSH、数据库、VPN等) 监听一个端口,将流量转发给后台服务器 用于SSH 网关、MySQL/Postgresql等数据库代理、OpenVPN 中继
其次是HTTP/HTTPS 反向代理 配合 OpenBSD httpd 实现完整的 Web 前端架构,并可对 Web 服务做转发、加密终止
第三是负载均衡 可实现用户会话黏连:比如同一个 IP 总是打到同一台后端服务器
第四是健康检查与监控 relayd 自带 HTTP/TCP 检测机制,支持后端状态探测,如果后端失联,自动从轮询中剔除!
第五是会话控制与 NAT 支持 可与 PF 联动,追踪每一条状态流,实现基于连接状态的高级策略控制
relayd 是“只做你需要的那一部分”,而且做得非常稳
上一讲我们讲了relayd的基本介绍,这期我们来重点聊聊relayd在第七层的应用,web服务的反向代理和负载均衡
先看下relayd最基础的http中继配置
首先是定义名为http_proxy的HTTP协议规则 pass 指令表示对HTTP流量不做额外处理(比如过滤或者修改),直接穿透 然后定义relay规则,监听指定IP的http端口,绑定上述自定义的http协议规则,转发到目标地址的http端口上。 这样一个最简单最基础的web反向代理就构建成功了。但这个配置只是最简单功能的实现,接下来我们配置一个完整的,可用于生产环境的反向代理
我们先看下反向代理的架构拓扑图,有三台Linux主机,分别安装了Ubuntu(143),OpenSuse(148),Rocky(149),都通过docker统一部署了相同的网站,这三台Web服务器处于192.168.10的内网网段中,外部无法直接访问。我们的目标是在外网https通过配有relayd的OpenBSD的代理服务器网关能这访问到三台内网的web的服务器,并通过relayd来管理监控这三台Linux主机。
看下三台Linux Web服务器
我们按照relayd完整的配置格式来进行配置 首先定义变量集,也就是Macros宏,作用是让配置更清晰、可维护、容易复用,当我们的服务器集群变大、变小,添加修改时,只需要修改这里,改变变量的值就可以。 定义公网入口IP,也是反向代理监听地址。定义三台内网服务器名字 接下来是全局设置,interval (int v)5是设定网关对后端服务器健康度的检查频率,每5秒检测一次服务状态。我们同时打开日志的记录代理状态变更(比如服务器的上线或下线)以及记录所有客户端连接信息()的功能 全局设置完成后是设置表,表(table)是用来定义一组相同功能服务器的集合,作用是配合负载均衡、转发和健康检查等机制的集中管理。我们把148和149服务器定义为主服务器组,把143服务器定义为容灾备用组。
宏、全局设置、表设置完成后,就是relay规则的设置 就是先定义http_proxy的协议规则,然后是定义relay规则,这里我们就用定义过的宏和表。mode roundrobin是负载均衡策略,采用轮询调度,特点是均等分配请求,适用于相同配置的服务器集群。如果后端服务器集群需要权重,可以设置为loadbalance(load 班纳斯)模式,两者的工作模式如下。此外relayd还支持random随机、通用哈希、源地址哈希等其他负载均衡算法。
check http code 200,是健康检查方法,使用http get请求后端Web服务器的/目录,收到200状态码后就认为Web服务器是健康的,如果回返的是404或者500状态码,就把服务器标记为故障节点。200是Web服务器集群负载均衡中主要使用的状态码。此外,relayd还能设置icmp、host主机名解析、path请求路径、script脚本、TCP连接、TIS握手等多种健康检查方法。
设置完http relay规则后,再设置https 。看这张图,https方向代理的机制 tls keypair test是relayd的TLS设置,正式部署中,要用实际域名代替,同时证书要存放在/etc/ssl目录下,私钥要存放在/etc/ssl/private目录,这个目录一定要切记,如果证书和私钥放错目录,relayd是无法启动TLS的。其他设置和http一样。我们来测试下。
relayd的基本Web反向代理设置完成,但是没有SSL终结,也就是把80端口重定向到443端口去,relayd本身只是个中继器,不具备SSL终结功能,要实现此功能,需要和httpd联动。我们先把relayd中的http中继规则注释掉,打开httpd.conf文件,打开外网IP的443重定向配置,启动httpd服务。我们来测试下,这样完整的web反向代理功能就完成了。
接下来我们通过relayctl命令来监控后端服务器集群的情况,relayctl show summary命令是用来查看当前relayd状态的,
下面说下SSH网关的配置
OK,这一讲,讲了relayd在第七层作为反向代理的完整配置,后面继续relayd在反向代理方面的高级应用。 如果你觉得这条视频有帮助,或者喜欢,请点赞、转发,关注我继续带你进入OpenBSD之旅。
上一讲讲了relayd做Web反向代理的基本功能,这讲来讲下relayd在反向代理上的高阶应用
我们来看下Relayd 进行多域名路由的实例
假设我们的Web集群上跑了cloud云服务和门户网站,先为每个服务器池定义表,云服务服务器池(2台后端),门户网站服务器池(1台后端)
接着自定义https_proxy的协议处理规则,绑定云服务域名和门户网站域名证书。定义流量分发逻辑,首先作为安全基线,先block 也就是默认拒绝所有流量。之后是基于SNI的路由规则,如果 HTTP 请求头 Host字段中包含 cloud.website,指向到 组。如果是 blog.website,则指向到 组。加入安全代理协议头match request header set "X-Forwarded-Proto" value "https",这在反向代理中非常重要,作用是告诉后端服务器客户端原本使用的是 HTTPS 协议,即使后端收到的是 HTTP 请求。如果不设置安全代理协议头,后端就会出现严重误判,比如生成错误的 http 链接,301重定向死循环,误关闭安全特性,混合内容错误。这条配置是代理架构中连接前后端协议信息的关键通信桥梁,能有效解决因协议不一致导致的功能和安全问题。
之后是relay规则,监听公网IP的443请求,应用上述自定义的https_proxy协议规则,建立后端转发规则, 组采用roundrobin轮询负载均衡算法,通过 get 后端组的http 200状态码来进行健康度检查。组直接转发到80端口,单服务器不用负载均衡和健康度检查。
这个实例的安全设计亮点一是风险隔离:公网只暴露relayd,后端服务隐藏在内网;防御攻击:默认block策略阻止端口扫描。用于企业级SAAS平台,用多台服务器通过cloud.website承载高可用云服务,同时通过www.website提供企业门户展示,最大化硬件利用率。
我们再来看relayd通过另一种多路径路由实现转发的功能
设定统一的TLS证书。制定安全规则,禁止CGI脚本执行,但凡要访问cgi-bin目录,立即拒绝;封禁管理后台访问,假设后台管理页面在admin目录中(按实际情况修改),要访问admin目录,也立即拒绝。云服务路径允许访问,这里假设为cloud目录,其他未声明的任意路径,默认转发到门户主网站上。这里block和pass指令后加了quick关键词,作用是匹配到后马上停止后续规则处理,以提升性能和安全响应速度。
relay规则和域名路由一样。relayd多路径路由完整流程如图。