更新日期:2021 年 10 月

更新日期:2021 年 10 月

这是我第一次设置 Ubuntu 服务器(14.04 LTS),在配置防火墙(UFW)时遇到了麻烦。

我只需要sshhttp,所以我这样做:

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

可能的解决方案包括:

  1. 停止使用该-p标志。使用 docker 链接或docker 网络反而。

  2. 在本地绑定容器,以便它们不会暴露在您的机器之外:

    docker run -p 127.0.0.1:8080:8080 ...

  3. 如果你坚持使用该标志,请通过禁用它们并重新启动来-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_POLICYACCEPT开启/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容器仍然可以使用该端口,但我无法从外部访问它。

相关内容