这是我第一次设置 Ubuntu 服务器(14.04 LTS),在配置防火墙(UFW)时遇到了麻烦。
我只需要ssh
和http
,所以我这样做:
sudo ufw disable
sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw enable
sudo reboot
但我仍然可以连接到这台机器其他端口上的数据库。知道我做错了什么吗?
编辑:这些数据库位于 Docker 容器中。这有关系吗?它会覆盖我的 ufw 配置吗?
编辑2:输出sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
答案1
问题在于-p
在容器上使用标志。
事实证明,Docker 直接在您的上进行更改iptables
,但这些更改并未显示出来ufw status
。
可能的解决方案包括:
停止使用该
-p
标志。使用 docker 链接或docker 网络反而。在本地绑定容器,以便它们不会暴露在您的机器之外:
docker run -p 127.0.0.1:8080:8080 ...
如果你坚持使用该标志,请通过禁用它们并重新启动来
-p
告诉docker不要触碰你:iptables
/etc/docker/daemon.json
{ "iptables" : false }
我推荐选项 1 或 2。请注意选项 3有副作用,例如容器无法连接到互联网。
答案2
16.04 带来了新的挑战。我按照图示做了所有步骤在 ufw 防火墙后面运行 Docker 但我无法让 docker 和 UFW 在 16.04 上运行。换句话说,无论我做什么,所有 docker 端口都会全局暴露在互联网上。直到我发现这个:如何设置 Docker 1.12+ 以不干扰 IPTABLES/FirewallD
我必须创建文件/etc/docker/daemon.json
并输入以下内容:
{
"iptables": false
}
sudo service docker stop
然后我发布了sudo service docker start
最终版本,docker 只是遵循了 UFW 中的相应规则。
附加数据:Docker 推翻了 UFW!
答案3
如果您正在使用 systemd 的 init 系统(Ubuntu 15.10 及更高版本),请编辑/etc/docker/daemon.json
(如果不存在则可能需要创建它),确保它已iptables
配置密钥:
{ "iptables" : false }
编辑:这可能会导致你在容器内部失去与互联网的连接
如果您启用了 UFW,请验证您是否可以从容器内部访问互联网。如果没有 - 您必须定义DEFAULT_FORWARD_POLICY
为ACCEPT
开启/etc/default/ufw
并应用此处描述的技巧:https://stackoverflow.com/a/17498195/507564
答案4
更新日期:2021 年 10 月
当我们只使用一个端口号时,docker 将使用一个临时端口(参见docker-compose 端口
仅指定容器端口(为主机端口选择一个临时主机端口)。
我认为我原来的答案有效,因为我无法连接到预期的端口 1234。
所以请不要这样做 - 按照其他答案中的建议进行操作。
我不会删除这个答案,因为它可能仍然有助于某些人理解为什么不是去做这个。
原始答案
我曾经docker-compose
启动过多个容器,也遇到过一个端口暴露给全世界而忽略了 ufw 规则的问题。
修复方法仅为我的 Docker 容器提供端口,方法是在我的docker-compose.yml
文件中进行以下更改:
ports:
- "1234:1234"
更改为:
ports:
- "1234"
现在其他docker容器仍然可以使用该端口,但我无法从外部访问它。