Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 35 additions & 4 deletions src/content/install/reverse-proxy.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -108,14 +108,45 @@ Cloudflare 免费版那 100 MB 的上传上限也就不是天花板了,单个
hub 取 `X-Forwarded-For` 的最后一跳,且只在 peer 本身是本地地址时才采信。上面两种反代都是追加
而不是覆盖,所以链尾才是代理真正看到的地址。

本地反代前面再套一层 CDN 时,链尾是边缘的地址:所有访客共用一个限流桶,
面板上 NAT 节点显示的出口是边缘的地址,网卡上没有公网地址的节点,国家码也按边缘算。那种部署要让边缘自己写客户端地址
(Cloudflare 的 `CF-Connecting-IP`),再由本地反代覆盖 `X-Forwarded-For`:
前面是 Cloudflare 的(域名开了代理,或者走隧道),节点的出口地址和国家码不用额外配置:hub 在验过节点
token 的 agent 连接上读 Cloudflare 写的 `CF-Connecting-IP`。登录限流不读这个头:能从 Cloudflare 网络
连到源站的不只 Cloudflare 的代理,Worker 也可以,这个头能被伪造。所以域名开了代理时,限流仍按边缘的
地址计,同一个边缘后面的访客共用一个桶。

本地反代前面是别家 CDN,或者隧道先到本机的 nginx 再到 hub 时,链尾是边缘或隧道的地址,所有访客共用
一个限流桶;别家 CDN 后面,NAT 节点显示的出口、网卡上没有公网地址的节点的国家码也按边缘算。在反代上
把边缘换回访客地址,只信任列出的网段:

```nginx
proxy_set_header X-Forwarded-For $http_cf_connecting_ip;
# 写在 server 里。每个回源网段一行,照 CDN 公布的列表填;隧道在本机时填 127.0.0.1
set_real_ip_from 192.0.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
```

这要求 nginx 带 realip 模块,`nginx -V 2>&1 | grep realip` 有输出就有。caddy 的写法:

```caddyfile
{
servers {
trusted_proxies static 192.0.2.0/24
trusted_proxies_strict
}
}

hub.example.com {
reverse_proxy 127.0.0.1:28080 {
header_up X-Forwarded-For {client_ip}
}
}
```

<Note warn>
以前照这一页写过 `proxy_set_header X-Forwarded-For $http_cf_connecting_ip;` 的,删掉这一行。
有人绕过 Cloudflare 直连源站时,这个头由他自己填:换着值试密码,登录限流就拦不住;填上你的地址,
你就被锁在登录页外 15 分钟。
</Note>

### 4. 放行 `POST` / `PUT` / `DELETE`

面板的写操作用到这三个方法。有些默认只放行 `GET` / `HEAD` 的 WAF 规则会把整个后台变成只读。
Expand Down
2 changes: 2 additions & 0 deletions src/content/reference/faq.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ IPv6、出口。机器自己的地址优先,因为出口可能属于挡在它
- 网关做了分流或透明代理:去 hub 的连接从代理出去,出口是代理的。节点没有公网 IPv6
的话,国家码也只能按代理出口算
- hub 只有 IPv6 入口:没有 IPv4 连接,NAT 节点的公网 IPv4 无从得知
- hub 前面套了 Cloudflare 以外的 CDN:出口是 CDN 边缘的地址,按[反向代理](/install/reverse-proxy)里的
realip 配置把访客地址换回来。Cloudflare 不用配,hub 读它写给节点连接的 `CF-Connecting-IP`
- 一台机器有多个公网地址,想显示指定的那个

手动填的值会一直显示,IP 变了要自己改。手动填的 IP 只影响显示,不影响国家码。
Expand Down