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

那方法有很多,各有利弊,说下第二个,Caddy的做法
Caddy真的是王道,什么泛域名,一个端口跑3个协议,都可以
用到Caddy,就要解决后端Nginx ingress无法获得客户真实IP的问题
Caddy配置如下:
General Settings:
Enable Layer4 Proxy 要勾选上
Auto HTTPS 要选中Off

其它保持默认,然后去到Layer4 Proxy进行配置,同样要配2个,一个HTTP,一个TLS

编辑HTTP的代理,注意 Domain 的地方需要把用到的所有域名列进去

编译TLS的代理

注意上面,Proxy Protocol都要选中v2,这样客户端真实IP才可以透传给后端的Nginx ingress
那同样后端的Nginx ingress的configmap,也需要加上Proxy Protocol的部分

我们用的是官网的 ingress-nginx,配置文件是 ingress-nginx 的namespace中
configmap ingress-nginx-controller,内容如下
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 Caddy的General Settings,配置生效

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

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