Piko:为非公开路由服务搭建安全桥梁的软件
Piko 是一种反向代理,它提供了一种安全的方式来连接无法公开路由的服务,这一过程被称为隧道传输。上游服务不会将流量直接发送到你的服务,而是向上Piko打开仅出站连接(隧道),然后Piko通过已建立的连接将流量转发到你的服务。
Piko有两个关键设计目标:
- 通过以节点集群的形式运行,实现容错、水平扩展和零停机部署,从而服务于生产流量。
- 易于在Kubernetes上的HTTP(S)负载均衡器之后进行托管。
因此,Piko可用作Ngrok的开源替代方案。
例如,你可以使用Piko在客户网络、自带云(BYOC)服务中暴露服务,或者连接到用户设备。
反向代理
在传统的反向代理中,你需要配置路由规则,描述如何将传入流量路由到上游服务。然后代理将打开与你的服务的连接并转发传入流量。这意味着你的上游服务必须是可发现的,并且具有从代理可访问的暴露端口。
而对于Piko,你的上游服务会向Piko服务器打开仅出站连接,并指定它们正在监听的端点。然后Piko通过其出站连接将传入流量转发到正确的上游服务。
因此,只要你的服务能够与Piko服务器建立连接,它们就可以在任何地方运行,而无需公共路由。
端点
上游服务在特定端点上监听流量。然后Piko管理将传入连接和请求路由到在目标端点上监听的上游服务。如果多个上游服务在同一个端点上监听,请求将在可用的上游服务之间进行负载均衡。
配置端点无需静态配置,上游服务可以监听它们选择的任何端点。
你可以使用Piko代理打开上游监听器,它同时支持HTTP和TCP上游服务。例如,要在端点my - endpoint上监听并将流量转发到localhost:3000:
# HTTP监听器。
$ piko agent http my-endpoint 3000
# TCP监听器。
$ piko agent tcp my-endpoint 3000
你还可以使用Go SDK,通过标准的net.Listener直接从你的应用程序进行监听。

HTTP(S)
Piko充当透明的HTTP(S)反向代理。
传入的HTTP(S)请求使用Host标头或x - piko - endpoint标头来识别要连接的目标端点。
使用Host标头时,Piko将第一段用作端点ID。例如,如果你使用通配符域名*.piko.example.com托管Piko,向foo.piko.example.com发送请求将被路由到在端点foo上监听的上游服务。
为避免设置通配符域名,你可以改用x - piko - endpoint标头。例如,如果Piko托管在piko.example.com,你可以使用标头x - piko - endpoint: foo将请求发送到端点foo。
TCP
Piko支持代理TCP流量,但与HTTP不同的是,它需要使用Piko转发或Go SDK将所需的本地TCP端口映射到目标端点。
Piko转发在本地TCP端口上监听,并通过Piko服务器将连接转发到已配置的上游端点。
例如,要在端口3000上监听并将连接转发到端点my - endpoint:
piko forward 3000 my-endpoint
请注意,与HTTP不同,使用原始TCP连接时无法识别目标端点,这就是为什么你必须首先连接到Piko转发,而不是直接连接到Piko服务器。Piko转发还可以对服务器进行身份验证,并通过TLS转发连接。
你还可以使用Go SDK打开一个连接到已配置端点的net.Conn。
https://github.com/andydunstall/piko