我们在某个 IP 上运行开发服务器,并将我们的 API 暴露在端口 5000 上,nginx 监听 80 端口。但是,当向端口 5000 发出 HTTPS 请求时,整个后端将崩溃。因此,我注意到一个漏洞,当一个访问https://SERVER_IP:5000,由于它无法处理 HTTPS 请求,因此请求会挂起并且整个后端停止(因此 API 也会因任何其他请求而挂起)。我只是希望该请求永远不会到达后端。
我为 UFW 设置了以下规则。
To Action From
-- ------ ----
8000 ALLOW Anywhere
22/tcp ALLOW Anywhere
80 ALLOW Anywhere
5000 ALLOW Anywhere
443/tcp DENY Anywhere
8000 (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
5000 (v6) ALLOW Anywhere (v6)
443/tcp (v6) DENY Anywhere (v6)
然而,当用户导航到https://SERVER_IP:5000,服务器仍然崩溃。我认为这是因为 https 流量不一定来自端口 443,而是来自端口 5000,并且该端口是公开的(仅需要用于 HTTP 流量)。那么有什么方法可以禁止 5000 上的 HTTPS 流量通过 UFW 或者我必须使用 nginx 配置一些东西吗?
答案1
不,UFW 做不到。
确定 TCP 连接中的流量是否是有效的 HTTP 请求需要接受连接并查看客户端尝试发送的数据类型。换句话说,它是基于内容的过滤。
UFW需要根据TCP连接的初始SYN包中的数据做出决定,该数据包中不包含任何数据。那时您无法判断客户的要求是什么。听起来您宁愿在 API 前面需要某种 HTTP 反向代理,以过滤掉所有不适合您的 API 的 URI 格式良好的 HTTP 请求。
我还可以建议您改进 API 的输入验证吗?至少在将其投入生产之前,它不再会因为发送随机的废话而崩溃?否则,看起来您的 API 很可能很容易受到微不足道的拒绝服务攻击,例如nc your.API.server.example 5000 < /dev/urandom
,或者也许nc your.API.server.example 5000 < War_and_Peace.txt
,其中 War_and_Peace.txt 是绝对大于您的 API 服务的输入缓冲区的任何内容。