update readme

Kim committed Mar 31, 2026 at 14:34 UTC 99efb1a21099682d4bd911f8ef13b7ea9fa4032e
2 files changed +42 -62
README.md
+5 -21
@@ -1,4 +1,4 @@
1 -# PORTAL — Public Open Relay To Access Localhost
1 +# PORTAL - Public Open Relay To Access Localhost
2
3 [English](./README.md) | [简体中文](./README.zh-CN.md)
4
@@ -21,9 +21,9 @@ Unlike other tunneling services, Portal is self-hosted and permissionless. You c
21 - **NAT-friendly connectivity**: Works behind NAT or firewalls without opening inbound ports
22 - **Automatic subdomain routing**: Gives each app its own subdomain (`your-app.<base-domain>`)
23 - **End-to-end tenant TLS**: Relay routes by SNI, while tenant TLS terminates on your side with relay-backed keyless signing
24 -- **Permissionless Hosting**: Anyone can run their own Portal — no approval needed
25 -- **One-Command Setup**: Expose any local app with a single command
26 -- **UDP Relay (Experimental)**: Supports raw UDP relay
24 +- **Permissionless hosting**: Anyone can run their own Portal, no approval needed
25 +- **One-command setup**: Expose any local app with a single command
26 +- **UDP relay (experimental)**: Supports raw UDP relay
27
28 ## How Portal Provides End-to-End Encryption
29
@@ -68,22 +68,6 @@ portal expose 3000
68 irm https://github.com/gosuda/portal/releases/latest/download/install.ps1 | iex
69 portal expose 3000
70 ```
71 -
72 -If you prefer a relay-local installer, or want the relay to provide the exact install command for its own host, use the relay installer instead:
73 -
74 -```bash
75 -curl -ksSL https://localhost:4017/install.sh | bash
76 -portal expose 3000 --relays https://localhost:4017
77 -```
78 -
79 -```powershell
80 -$ProgressPreference = 'SilentlyContinue'
81 -irm https://localhost:4017/install.ps1 | iex
82 -portal expose 3000 --relays https://localhost:4017
83 -```
84 -
85 -Replace `https://localhost:4017` with your relay URL when using a hosted relay.
86 -The relay landing page also generates the exact install command for the current relay.
71 For CLI usage and install details, see [cmd/portal-tunnel/README.md](cmd/portal-tunnel/README.md).
72
73 ### Use the Go SDK (Advanced)
@@ -124,4 +108,4 @@ We welcome contributions from the community!
108
109 ## License
110
127 -MIT License — see [LICENSE](LICENSE)
111 +MIT License - see [LICENSE](LICENSE)
README.zh-CN.md
+37 -41
@@ -4,44 +4,44 @@
4
5 <p align="center"><img width="800" alt="Portal Demo" src="./portal.gif" /></p>
6
7 -<p align="center">安全地将你的本地应用暴露到公共互联网,无需端口转发、NAT 配置或 DNS 设置。<br />Portal 是一个具备端到端加密(E2EE)的自托管中继网络。你可以连接任意中继,也可以自行部署。</p><br />
7 +<p align="center">将你的本地应用暴露到公网,无需端口转发、NAT 配置或 DNS 设置。<br />Portal 是一个自托管、端到端加密(E2EE)的中继网络。你既可以连接任意中继,也可以自己部署。</p><br />
8
9 ## 为什么选择 Portal?
10
11 将本地服务发布到互联网通常很复杂。
12 -一般需要开放入站端口、配置 NAT 或防火墙、管理 DNS,并终止 TLS。
12 +通常需要开放入站端口、配置 NAT 或防火墙、管理 DNS,并终止 TLS。
13
14 Portal 通过反转连接模型来消除这些复杂性。
15 -应用主动向中继建立出站连接,由中继将服务暴露到公共互联网,并将入站流量路由回应用,同时保持端到端 TLS。
15 +应用主动向中继建立出站连接,由中继把服务暴露到公网,并将传入流量路由回应用,同时保持端到端 TLS。
16
17 -与其他隧道服务不同,Portal 是自托管且无许可门槛的。你可以在自己的域名上运行中继,也可以连接任意中继。
17 +与其他隧道服务不同,Portal 是自托管且无需许可的。你可以在自己的域名上运行中继,也可以连接任意中继。
18
19 ## 特性
20
21 -- **NAT 友好连接**:无需开放入站端口,也可在 NAT 或防火墙后工作
22 -- **自动子域路由**:为每个应用分配独立子域名(`your-app.<base-domain>`)
23 -- **端到端租户 TLS**:中继基于 SNI 路由,而租户 TLS 在你这一侧终止,并通过中继支持的无密钥签名完成证书签发
24 -- **无许可托管**:任何人都可以运行自己的 Portal,无需审批
25 -- **一条命令完成设置**:用一条命令暴露任意本地应用
26 -- **UDP 中继(实验性)**:支持原始 UDP 中继
21 +- **NAT 友好连接**:无需开放入站端口,也能在 NAT 或防火墙后工作
22 +- **自动子域路由**:为每个应用分配独立子域(`your-app.<base-domain>`)
23 +- **租户端到端 TLS**:中继通过 SNI 路由,而租户 TLS 在你的侧边通过 relay-backed keyless signing 终止
24 +- **无需许可的托管**:任何人都可以运行自己的 Portal,无需审批
25 +- **单命令启动**:用一条命令暴露任意本地应用
26 +- **UDP Relay(实验性)**:支持原始 UDP 转发
27
28 ## Portal 如何提供端到端加密
29
30 -Portal 的设计确保租户 TLS 在你这一侧终止,而不是在中继侧终止。在正常数据路径中,中继只转发加密流量,无法访问租户 TLS 明文。
30 +Portal 的设计目标是让租户 TLS 终止在你的侧边,而不是在中继侧。在正常数据路径中,中继只转发加密流量,无法访问租户 TLS 明文。
31
32 -1. 中继接受公共连接,并且只读取基于 SNI 路由所需的 TLS ClientHello。
33 -2. 它通过反向会话转发租户连接的原始加密字节,而不会终止租户 TLS。
34 -3. 你这一侧的 Portal 客户端充当 TLS 服务器,并在本地完成租户握手。
35 -4. 对于由中继托管的域名,Portal 客户端通过 `/v1/sign` 获取证书签名,将中继仅作为无密钥签名预言机使用。
36 -5. 会话密钥完全在你这一侧导出。中继只提供证书签名,不会接收租户流量密钥材料。
37 -6. 握手完成后,中继继续转发密文,无需获取租户 TLS 明文即可保持流量路由。
32 +1. 中继接收公网连接,并且只读取 SNI 路由所需的 TLS ClientHello。
33 +2. 中继通过反向会话转发原始加密字节,不会终止租户 TLS。
34 +3. 你侧边的 Portal 客户端作为 TLS 服务器,在本地完成租户握手。
35 +4. 对于 relay-hosted domain,Portal 客户端通过 `/v1/sign` 获取证书签名,把中继仅作为 keyless signing oracle 使用。
36 +5. 会话密钥完全在你的侧边派生。中继只提供证书签名,不会获得租户流量密钥。
37 +6. 握手完成后,中继继续转发密文,无需访问租户 TLS 明文即可持续路由流量。
38
39 -Portal 还会检查中继是否真正保留了 TLS 透传。Portal 客户端会连接自己的公共端点,并比较由客户端两端观测到的 TLS exporter 值。如果两者不一致,`portal expose` 默认会拒绝该中继。
39 +Portal 还会检查中继是否真正保留了 TLS passthrough。Portal 客户端会连接自己的公网端点,并比较由两端客户端控制的 TLS exporter 值。如果两者不同,`portal expose` 默认会拒绝该中继。
40
41 ## 组件
42
43 -- **Relay**:将公共请求路由到正确已连接应用的服务器。
44 -- **Tunnel**:一个 CLI 代理,用于通过中继转发你的本地应用。
43 +- **Relay**:负责把公网请求路由到正确已连接应用的服务器
44 +- **Tunnel**:通过中继代理本地应用的 CLI 代理
45
46 ## 快速开始
47
@@ -53,25 +53,21 @@ cd portal
53 docker compose up
54 ```
55
56 -如需部署到公网域名,参见 [docs/deployment.md](docs/deployment.md)。
56 +如果要部署到公网域名,请参见 [docs/deployment.md](docs/deployment.md)。
57
58 ### 通过 Tunnel 暴露本地服务
59
60 -对于使用 `docker compose up` 启动的本地中继:
60 +先从官方 GitHub release asset 安装 tunnel:
61
62 ```bash
63 -curl -ksSL https://localhost:4017/install.sh | bash
64 -portal expose 3000 --relays https://localhost:4017
63 +curl -fsSL https://github.com/gosuda/portal/releases/latest/download/install.sh | bash
64 +portal expose 3000
65 ```
66
67 ```powershell
68 -$ProgressPreference = 'SilentlyContinue'
69 -irm https://localhost:4017/install.ps1 | iex
70 -portal expose 3000 --relays https://localhost:4017
68 +irm https://github.com/gosuda/portal/releases/latest/download/install.ps1 | iex
69 +portal expose 3000
70 ```
72 -
73 -使用托管中继时,请将 `https://localhost:4017` 替换为你的中继 URL。
74 -中继落地页也会为当前中继生成精确的安装命令。
71 CLI 用法和安装细节请参见 [cmd/portal-tunnel/README.md](cmd/portal-tunnel/README.md)。
72
73 ### 使用 Go SDK(高级)
@@ -80,25 +76,25 @@ CLI 用法和安装细节请参见 [cmd/portal-tunnel/README.md](cmd/portal-tunn
76
77 ## 架构
78
83 -参见 [docs/architecture.md](docs/architecture.md)。
84 -架构决策记录参见 [docs/adr/README.md](docs/adr/README.md)。
79 +请参见 [docs/architecture.md](docs/architecture.md)。
80 +架构决策请参见 [docs/adr/README.md](docs/adr/README.md)。
81
82 ## 示例
83
84 | 示例 | 说明 |
89 -|------|------|
90 -| [nginx reverse proxy](docs/examples/nginx-proxy/) | 在 nginx 后部署 Portal,并使用 L4 SNI 路由与 TLS 终止 |
91 -| [nginx + multi-service](docs/examples/nginx-proxy-multi-service/) | 在单个 nginx 实例后与其他 Web 服务一起运行 Portal |
85 +|---------|-------------|
86 +| [nginx reverse proxy](docs/examples/nginx-proxy/) | 将 Portal 部署在 nginx 后面,使用 L4 SNI 路由和 TLS 终止 |
87 +| [nginx + multi-service](docs/examples/nginx-proxy-multi-service/) | 在同一个 nginx 后面同时运行 Portal 和其他 Web 服务 |
88
89 ## 公共 Relay Registry
90
95 -Portal 官方公共中继注册表地址为:
91 +Portal 的官方公共 relay registry 是:
92
93 `https://raw.githubusercontent.com/gosuda/portal/main/registry.json`
94
99 -Portal tunnel 客户端默认可以包含该注册表,Relay UI 也会从同一路径读取官方中继列表。
95 +Portal tunnel 客户端可以默认包含这个 registry,relay UI 也会从同一路径读取它,以展示官方 relay 列表。
96
101 -如果你运营一个公开的 Portal 中继,请提交 Pull Request,将你的中继 URL 添加到 `registry.json`。保持注册表更新能让社区更容易发现公共中继。
97 +如果你在运营公共 Portal relay,欢迎提交 Pull Request,把你的 relay URL 添加到 `registry.json`。保持 registry 更新有助于社区更容易发现公共 relay。
98
99 ## 贡献
100
@@ -106,10 +102,10 @@ Portal tunnel 客户端默认可以包含该注册表,Relay UI 也会从同一
102
103 1. Fork 本仓库
104 2. 创建功能分支(`git checkout -b feature/amazing-feature`)
109 -3. 提交你的变更(`git commit -m 'Add amazing feature'`)
110 -4. 推送到分支(`git push origin feature/amazing-feature`)
105 +3. 提交修改(`git commit -m 'Add amazing feature'`)
106 +4. 推送分支(`git push origin feature/amazing-feature`)
107 5. 创建 Pull Request
108
109 ## 许可证
110
115 -MIT License - 参见 [LICENSE](LICENSE)
111 +MIT License,参见 [LICENSE](LICENSE)