用端口代理而不是unix domain socket有什么坏处?

我正在测试在启用了 SELinux 的 CentOS 派生发行版 AlmaLinux 9 上部署 Discourse,并配置了外部 nginx。

由于基于 Ubuntu 的容器不了解 SELinux,每次启动容器时,它都会用一个未进行安全标记的新文件替换 Unix 域套接字,并且 nginx 在我运行 restorecon 命令为该文件提供 nginx 允许访问的安全上下文之前,无法与其通信。显然,这不能作为生产解决方案。

我不太想运行 semanage permissive -a httpd_t,因为我想真正利用 SELinux 来保护唯一对外开放的服务。:smiling_face:

如果我代理到网络端口而不是 Unix 域套接字,它就可以工作:

  • setsebool -P httpd_can_network_connect 1
  • 不使用 templates/web.socketed.template.yml
  • expose: - "8008:80"
  • 在外部 nginx 中,proxy_pass http://127.0.0.1:8008

这种配置有什么特别的缺点吗?我是否应该更改此配置中的连接限制等参数?

在进行更彻底的测试后,我会将此内容更详细地写成文档,如果还有其他问题,我可以在我写的内容中包含进去。

2 个赞

只要您阻止人们通过您偏好的方法直接连接到端口 8008,就没问题。

3 个赞

谢谢!

public (active)
  target: default
...
  services: dhcpv6-client http https ssh
  ports:
  protocols:
  forward: yes
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

延迟存在差异,套接字比本地回送端口快约 3 倍。

话虽如此,我们这里最好谈论的是 4-5us 的差异。

3 个赞

在进一步研究之后,我绝对想添加 proxy_set_header \"Connection\" \"\"; 来禁用默认的 Connection: close 标头。