如果您使用的是标准的基于 Docker 的 Discourse 安装,以下 Uncomplicated Firewall 规则将保护您服务器上的任何非 Docker 服务:
ufw allow http
ufw allow https
ufw allow ssh
ufw enable
也就是说,只允许 HTTP (端口 80)、HTTPS (端口 443) 和 SSH (端口 22),别无其他。
注意: Docker 直接 操作 iptables 并绕过 ufw 规则。这意味着 ufw 无法阻止或限制对 Docker 容器公开的端口(标准 Discourse 安装中的端口 80 和 443)的访问。上述 ufw 规则仅保护在主机上运行的非 Docker 服务。
使用以下命令检查防火墙的当前状态:
ufw status verbose
示例输出:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
80 ALLOW IN Anywhere
443 ALLOW IN Anywhere
22 ALLOW IN Anywhere
80 (v6) ALLOW IN Anywhere (v6)
443 (v6) ALLOW IN Anywhere (v6)
22 (v6) ALLOW IN Anywhere (v6)
如果您想随时关闭它:
ufw disable
Discourse 的默认 Docker 安装仅暴露端口 80 和 443,因此主机防火墙并非绝对必要。但是,如果您在主机上运行了在其他端口上监听的其他服务,添加防火墙可以为这些服务提供额外的“双重保险”安全层。
33 个赞
MikeNolan
(Mike Nolan)
2023 年3 月 14 日 06:16
4
据我所知,Docker 容器只向主机系统开放了很少的端口,因此 Discourse 实际上被防火墙隔离在它运行的服务器之外。
当然,如果主机系统上还有其他东西在运行,那么“明显队长”会说你需要采取合理的预防措施。
我曾有一台服务器,我们认为它已经相当安全了,结果却被入侵了,那场面可不好看。
1 个赞
Jagster
(Jakke Flemming)
2023 年3 月 14 日 06:28
5
主题不完全准确。如果 UFW 在 Docker 之外使用,就像在 VPS 上“正常”使用一样,它本身并不适用于 Discourse。我可以禁用端口 80,但 Discourse/docker 仍然可以完全访问。
当然,它可以保护其他所有东西,但如果没有其他服务在监听,它就是不必要的。
我不知道 UFW 或 iptables 在 enter app 之后是如何工作的,或者防火墙是否可以那样使用。
我指的是这个主题:
How can Discourse bypass UFW? I had enabled only port 22 so all other ports should be closed then. But a forum worked anyway. How’s that possible?
DigitalOcean droplet, but that should not mean anything. And no one-click install, but official way.
This is not a pure support question, but we don’t have here a catogory named Stupid basic questions by beginners
3 个赞
wal
2024 年7 月 30 日 21:06
6
我很想听听这个故事,也许可以在一个单独的帖子里
顺便说一句,关于 Docker 和 ufw / 防火墙之间关系的讨论几乎和 Docker 本身一样古老,这里有一个非常受关注的讨论,其中包含许多有趣的见解:
Docker 自己近年来在记录相关细节方面做得更好;Packet filtering and firewalls | Docker Docs
不想在这个帖子里灌太多链接,但如果你对防火墙话题感兴趣,这些似乎是很有见地的文章,可以一起参考,还可以通过常规的 Google 搜索了解更多细节。
基于其中一些观点,以及 @Jagster 链接的非常有用的帖子,似乎默认开箱即用的 Discourse 安装配置本身就足够了?毕竟,我的看起来是这样的;
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5dd4a572cd8e local_discourse/app \"/sbin/boot\" 6 days ago Up 16 hours 0.0.0.0:80-\u003e80/tcp, :::80-\u003e80/tcp, 0.0.0.0:443-\u003e443/tcp, :::443-\u003e443/tcp app
所以,除非我弄错了,除非服务器上的其他软件还在使用其他端口,否则我认为唯一应该连接进来的入站流量将是这些列出的端口 80 和 443。
如果你想做一个健全性检查,我认为你可以使用 netstat 来检查服务器上的监听端口(How to Install netstat on Ubuntu ; https://linuxize.com/post/check-listening-ports-linux/)。
netstat -tunlp
为了进行更强的健全性检查,你可以考虑启动第二个小型 Linux 服务器,并尝试扫描你的 Discourse 服务器的开放端口;How To Use Nmap to Scan for Open Ports | DigitalOcean
# 扫描所有端口;在此处插入你的 IP 地址
sudo nmap -n -PN -sT -sU -p- 1.2.3.4
查看 DigitalOcean 文档中包含的链接,了解更多关于扫描等的命令。
我认为,如果有人担心他们的 Discourse 服务器的防火墙问题,这些资源和见解应该非常有帮助
3 个赞
Ethsim2
(Ethan )
2025 年3 月 25 日 23:14
8
Discourse:
ALLOW IN
最新的 Ubuntu LTS ufw 提供的是 ALLOW 而不是 ALLOW IN。
这让 mail-reciever 管理员很烦恼,即使 ufw 上的 25 端口已打开,在 ./launcher logs mail-receiver 中也会出现 API 准备失败。
允许所有入站和出站流量,然后拒绝所需端口,一直是一个解决方案。
我还不足以了解 iptables 以进行进一步的微调。