新托管了一个机房服务器,基本全用开源软件来构建:
那Firewall就用的OPNsense,后端自建Kubernetes,那OPNsense需要当作一个LoadBalance来使用
结构图如下,证书是放在了Nginx ingres上:

那方法有很多,各有利弊,说下第三个,Nginx的做法
relayd和caddy都说完了,那还有Nginx,Nginx的话,如果证书挂在OPNsense,那就可以用WAF的功能
如果证书放在后端Kubernetes的Nginx ingress上,那就无法用WAF了,算是data stream
那提前说一句,Nginx的配置是有Bug的,如果无法清除干净,需要ssh登录opnsense,然后
把 /conf/下xml配置文件中的 nginx 部分删除掉,然后重启服务器,才可以
os-nginx的配置方法如下:
第一步:首先去Upstream的Upstream Server子标签,建立两组服务器

第二步:再去Upstream的Upstream子标签,建立两组服务

建立的时候advanced mode要打开,PROXY Protocol要选中,Server选中各自的4个服务器,其它保持缺省即可。

第三步:去Data Streams的子标签Stream Servers,建两组服务

编辑一下,监听端口只选指定IP的80和443,PROXY Protocol不要选中,然后Route就选Upstream,Upstream Servers选中对应的,其它缺省即可。

那对应的,后端Kubernetes的Nginx ingress也要做相应配置
Nginx ingress的configmap,需要加上Proxy Protocol的部分

我们用的是官网的 ingress-nginx,配置文件是 ingress-nginx 的namespace中
configmap ingress-nginx-controller,内容如下,对应data那两行:
apiVersion: v1
data:
use-proxy-protocol: "true"
kind: ConfigMap
metadata:
annotations:
meta.helm.sh/release-name: ingress-nginx
meta.helm.sh/release-namespace: ingress-nginx
nginx.ingress.kubernetes.io/configuration-snippet: "true"
nginx.ingress.kubernetes.io/location-snippet: "true"
nginx.ingress.kubernetes.io/server-snippet: "true"
creationTimestamp: "2025-08-27T07:38:49Z"
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.13.1
helm.sh/chart: ingress-nginx-4.13.1
name: ingress-nginx-controller
namespace: ingress-nginx
resourceVersion: "22298827"
uid: d6eeef3c-7e44-4667-854a-c7693006b221
编辑后,nginx ingress会自动reload
最后去OPNsense os-nginx的配置:General Settings去Enable nginx选中,然后Apply即可

这样就很完美了,后端的Nginx ingress也可以获得真实客户端IP了,看看nginx的log确认一下。

注意:relayd和caddy和Nginx不能同时启动。