这是一个功能完整但刻意保持简单的实现,以下取舍是显式的,不是遗漏:
会话默认 1 小时未使用即失效,打开着的页面自动续期;来源 IP 默认不向目标站点透传。 两者都在后台「会话与来源 IP」里调,见配置。
- 网关本身就是一台开放代理。务必保留登录(不要用
-no-auth), 并用-allow把可达目标收敛到确实需要的网段/域名。 -allow-private会让网关成为进入内网的跳板。开启前先确认-allow已配置, 否则任何登录用户都能拿它扫内网。链路本地(含云元数据169.254.169.254/fe80::/10) 与组播地址无论是否开启该开关都始终拒绝。- 响应中的 CSP、X-Frame-Options、HSTS 等安全响应头会被剥离。这是所有 WebVPN 类产品的
共同代价:不剥离,改写后的页面就无法从网关域加载自身资源。后果是被代理站点失去这些浏览器侧防护,
且在
plain/wrd模式下所有目标共享同一个浏览器 Origin —— 一个被代理站点的 XSS 可以读取同域下其它被代理站点的页面内容。需要强隔离时请使用subdomain模式。 - Cookie 隔离靠路径(
plain/wrd模式)。因此Domain=.example.com这类跨子域共享的 Cookie 会退化为按主机隔离;subdomain模式没有这个问题。 - CSRF 边界被弱化:
Origin/Referer会被改写成目标站点自身的值,被代理站点的同源 校验因此对网关“看起来是同源的”。 wrd模式的默认密钥是公开值(wrdvpnisthebest!,来自社区逆向资料),只是混淆不是保密; 要让 URL 只有本网关能解,请用-url-key换成自有密钥。-ignore-email会把验证码打到控制台,等于把登录凭据写进日志,仅限本地开发。- SMTP 密码明文存放在配置文件中(0600,与允许登录的账号清单同一个文件)。 这个文件泄露等于同时泄露发信凭据与访问策略,请按凭据文件对待:限制宿主机访问、纳入备份加密。
- 初始化令牌会出现在启动日志里。如果日志被集中采集,令牌也会跟着进日志系统; 它在管理员首次登录后即失效,但在此之前等同于"可以配置这台网关"。
- 自签名证书的信任是网关级的,任一登录用户确认后对所有人生效(见上一节)。
- “允许明文认证”会把 SMTP 账号密码以明文送上网络。仅在可信内网段内使用, 并给网关配专用发信账号。
- TLS 私钥与 SMTP 密码一样明文存放在 0600 配置文件中。若你的部署已有 ACME 自动续期,
用
-tls-cert/-tls-key指向文件更合适,证书材料就不进配置文件。 - 服务端 Cookie 罐保存的是各业务系统的会话凭据,进程内存中,按登录会话隔离。 网关进程的内存转储等同于泄露这些系统的在线会话——与它本来就能看到全部明文流量是同一量级的信任假设。
它不能替代真正的 VPN:只处理 HTTP 语义的流量,不承载任意 TCP/UDP; 对强依赖自身域名、使用 Service Worker、WebAssembly 里硬编码地址或做 TLS pinning 的站点会失效。