Nginx可以配置为支持入站流量的HAProxy代理协议:http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_protocol
然而,使用proxy_protocol on;
,nginx无法在没有PROXY行的情况下处理HTTP(S(流量。
另一方面,traefik反向代理可以将代理行视为可选:
如果入口点启用了代理协议标头解析,则此入口点可以接受带有或不带有代理协议标头的连接。https://doc.traefik.io/traefik/routing/entrypoints/#proxyprotocol
是否可以将nginx配置为将代理行视为可选
我的用例是nginx作为kubernetes入口,通过负载均衡器处理来自外部的代理协议流量,而不使用集群内部HTTP(S(流量的代理协议。
我知道有发夹代理可以工作,但它有点麻烦,因为它为所有CoreDNS集群内部DNS条目添加了重写。https://github.com/compumike/hairpin-proxy#:~:text=将%20nginx%20修改为%20treat%20将%20PROXY%20line%20修改成%20可选
此场景中使用的K8s云设置:
- Rancher Kubernetes引擎(RKE(
- 用于k8s节点的Hetzner云虚拟机
- Hetzner负载平衡器作为K8s负载平衡器
- hcloud云控制器管理器,用于配置Hetzner云服务器(https://github.com/hetznercloud/hcloud-cloud-controller-manager)
- ingress nginx作为k8s ingress(https://kubernetes.github.io/ingress-nginx/)
- 使用helm3的Worklaod部署
代理协议规范禁止这种混合的代理和非代理连接。原因是它可以很容易地伪造ip地址和其他数据。
规范报价:
The receiver MUST be configured to only receive the protocol described in this
specification and MUST not try to guess whether the protocol header is present
or not. This means that the protocol explicitly prevents port sharing between
public and private access. Otherwise it would open a major security breach by
allowing untrusted parties to spoof their connection addresses. The receiver
SHOULD ensure proper access filtering so that only trusted proxies are allowed
to use this protocol.
是否可以将nginx配置为将PROXY行视为可选?
否。
您可以使用带有代理协议的侦听器,也可以不使用,但目前不可能在一个侦听器中同时使用这两个侦听器。