Envoy如何实现全端口转发?附现有负载均衡配置
Envoy实现全端口转发方案
可以通过Envoy实现全端口转发,以下是两种常用的实现方式:
方案一:基于原始目标(Original Destination)过滤器
这种方式适合直接转发客户端请求的原始目标端口到后端的场景,无需预先定义固定监听端口。
核心配置要点
- 监听配置设置
bind_to_port: false,让Envoy不绑定固定端口,需结合iptables捕获所有端口流量 - 添加
original_destination过滤器,保留客户端请求的原始目标信息 - 配置TCP代理过滤器,将流量转发到原始目标或指定集群
示例配置
static_resources: listeners: - name: all_port_listener address: socket_address: address: 0.0.0.0 port_value: 0 # 端口0配合bind_to_port: false使用 bind_to_port: false filter_chains: - filters: - name: envoy.filters.network.original_destination typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.original_destination.v3.OriginalDestination - name: envoy.filters.network.tcp_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy stat_prefix: all_port_tcp_proxy cluster: dynamic_forward_cluster clusters: - name: dynamic_forward_cluster connect_timeout: 1s lb_policy: CLUSTER_PROVIDED type: ORIGINAL_DST
方案二:端口范围监听+PROXY协议
如果需要明确监听一段连续端口范围(比如全端口1-65535),可结合端口范围配置和PROXY协议,传递客户端原始地址信息到后端。
核心配置要点
- 监听配置使用
port_range指定覆盖的端口范围 - 启用PROXY协议过滤器,传递客户端原始地址和端口
- 配置TCP代理过滤器转发到目标集群(可复用你现有集群配置)
示例配置
static_resources: listeners: - name: port_range_listener address: socket_address: address: 0.0.0.0 port_value: 1 port_range: end: 65535 filter_chains: - filters: - name: envoy.filters.network.proxy_protocol typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.proxy_protocol.v3.ProxyProtocol - name: envoy.filters.network.tcp_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy stat_prefix: port_range_tcp_proxy cluster: apiserver clusters: - name: apiserver connect_timeout: 3600s lb_policy: round_robin type: STATIC load_assignment: cluster_name: "apiserver" endpoints: - lb_endpoints: - endpoint: address: socket_address: address: 192.168.64.1 port_value: 60051 - endpoint: address: socket_address: address: 192.168.64.2 port_value: 60052
注意事项
- 方案一需配合iptables规则将流量重定向到Envoy,示例命令:
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-port 15001 - 方案二监听全端口会占用较多系统资源,建议根据实际需求缩小端口范围
- 方案二中后端服务需支持PROXY协议,才能正确获取客户端原始地址
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

