限制对服务器的访问,并在应用前放置 WAF
从首次部署起,
erpc worker 只允许来自您地址的 SSH 进入,并丢弃其他所有入站连接。[waf] 表会在您的 API 前放置一个过滤代理。本页介绍 ERPC CLI
v0.1.0-rc.4,这是一个预发布版本。防火墙
部署会在应用首次启动之前设置服务器的防火墙:
- 只允许来自
firewall.ssh_allow和部署发起地址的 SSH; - 丢弃其他所有入站连接,但来自
firewall.app_allow的run.port除外;对于位于 WAF 后面的应用,则以 WAF 的端口代替,并且仅当服务器上的 WAF 已经在运行[waf]现在生成的规则时才如此(见下文)。
每项更改都在 120 秒的回滚计时器下运行,只有在新的连接成功进入后才会保留,因此错误的更改不会让您无法进入。
不过,白名单会比创建它时所用的地址存在得更久:如果您家里的地址变了,对于 ERPC 服务器,重新进入的途径是 ERPC 支持团队;对于您自己的服务器,则是提供商的控制台。在信任家里的地址之前,请在
firewall.ssh_allow 中保留另一个可以访问服务器的地址(办公室、VPN 出口)。如果您的地址变了,请添加管理员使用的每一个固定地址:
bash
在应用前放置 WAF
在
erpc.toml 中添加一个表:toml
之后,
erpc worker deploy 会在服务器上运行一个 HTTP 反向代理,它位于自己的 systemd 单元中(erpc-waf-<app>-<env>):以无特权的动态用户运行,没有密钥、没有 Secret,也没有任何属于 worker 的东西,内存限制为 1 GiB。它在 waf.port 上监听,在应用之前读取每个请求,拒绝其规则所指定的请求,并将其余请求转发到 127.0.0.1:<run.port> 上的应用。-
应用只在 loopback 上。应用自身的端口从不对外开放。
erpc worker api和健康检查绕过 WAF,在 loopback 上访问应用。 -
谁可以连接仍由防火墙的白名单决定,而 WAF 的端口是该名单唯一可以写成所有人的地方:sh名单中没有任何人时,WAF 会监听,但不放任何人进入,部署会说明这一点。
-
端口在 WAF 开始监听后才开放,绝不会提前。WAF 未能启动的部署会失败并说明原因,而应用仍在运行。
-
更改
[waf]时,在部署使新规则就位之前,端口不会向任何新的对象开放。 -
从
erpc.toml中删除[waf]并部署,会从服务器上移除 WAF。
WAF 设置
只有
port 是必需的。所有键及其默认值:toml
rate、max_connections_per_address、ban 和 new_connections 用 false 关闭(ban = false),省略的键取其默认值。erpc worker check 会在任何部署之前说明 [waf] 表将做什么,以及其中有什么问题。无需设置时 WAF 的行为
- 无法被读作一个无歧义的 HTTP/1 请求的请求会得到 400,路径不是规范形式的请求也是如此。
- 要求切换协议的请求(
Upgrade)会得到 501。 - 每次拒绝都计入封禁,并且每次拒绝都会断开其连接。
- 一个地址是指一个 IPv4 地址,或一个 IPv6
/64。 - WAF 不会向后转发属于客户端到代理这段连接的请求头(
Connection及其所列的请求头、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Proxy-Connection、TE、Trailer)、Expect、名称中含下划线的请求头,以及客户端自己发送的Forwarded、X-Real-IP和X-Forwarded-Proto。它将X-Real-IP设为连接的来源地址,并将该地址追加到X-Forwarded-For的末尾;X-Forwarded-For中只有最后一项是代理给出的。
查看 WAF 的行为
被转发的请求不会留下日志行,任何请求头或请求体都从不被记录;被阻止请求的查询字符串会被记录,但仅限于这 200 字节所及的范围。客户端发送的内容无法写到您的终端上:WAF 以可打印 ASCII 写入其日志。
WAF 不做的事
- 没有 TLS。它在自己的端口上使用明文 HTTP/1.1。
- 没有 HTTP/2:对其响应 400。
- 没有 WebSocket,也没有其他任何
Upgrade:501。 - 不查看请求体内部。请求体只被测量大小,从不被读取。探测列表很短,只是噪声过滤,而不是保证:应用仍要自行检查其输入。
- 没有身份验证。谁可以调用应用,由应用自己以及防火墙的白名单决定。
- 一个地址就是一个客户端。位于同一 NAT、代理或 CDN 后面的客户端共享同一个速率和同一个封禁;拥有多个地址的客户端则有相应数量的速率。
- WAF 重启时,封禁和计数会被遗忘。
- 它最多记住 8192 个地址,同时最多持有 1024 个连接。
- 它只在 IPv4 上监听,因此
app_allow中的 IPv6 条目目前还到达不了任何地方。 - 路径按其解码后的字节进行比较。以更宽松方式读取路径的应用(忽略大小写、
;参数、两次解码)可以通过deny_paths未覆盖的名称被访问到。allow_paths没有这样的缺口:未列出的路径不会被转发。 - 读取缓慢的客户端也会一直得到服务,直到结束。只要客户端一直在接收响应,无论多慢,都会一直得到服务,直到结束。
- 洪泛可能会中断大型上传。WAF 在单个线程上运行,因此洪泛可能会以 408 中断大型上传。接收大型请求体的应用要同时提高
body_timeout_secs和max_body_bytes。
worker 指南包含所有规则,包括对
app_allow 的更改何时会被暂缓到下一次部署。





