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)