ESa*_*ala 67 firewall networking ufw 14.04 docker
这是我第一次设置 Ubuntu 服务器 (14.04 LTS),我在配置防火墙 (UFW) 时遇到问题。
我只需要sshand 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
Run Code Online (Sandbox Code Playgroud)
但是我仍然可以连接到这台机器其他端口上的数据库。知道我做错了什么吗?
编辑:这些数据库位于 Docker 容器上。这可能有关系吗?它是否覆盖了我的 ufw 配置?
EDIT2:输出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)
Run Code Online (Sandbox Code Playgroud)
ESa*_*ala 105
问题是-p在容器上使用标志。
原来,泊坞窗的变化直接对你iptables,这是不显示ufw status。
可能的解决方案是:
停止使用该-p标志。请改用 docker 链接或docker 网络。
在本地绑定容器,使其不会暴露在您的机器之外:
docker run -p 127.0.0.1:8080:8080 ...
如果您坚持使用该-p标志,请iptables通过禁用它们/etc/docker/daemon.json并重新启动来告诉 docker 不要触摸您的标志:
{ "iptables" : false }
我推荐选项 1 或 2。请注意选项 3有副作用,例如容器无法连接到 Internet。
小智 8
16.04 带来了新的挑战。我完成了所有步骤,如在 ufw 防火墙后面运行 Docker 所示,但我无法让 docker plus UFW 在 16.04 上工作。换句话说,无论我做什么,所有 docker 端口都在全球范围内暴露在互联网上。直到我发现这个:如何设置 Docker 1.12+ 以不干扰 IPTABLES/FirewallD
我必须创建文件/etc/docker/daemon.json并将以下内容放入:
{
"iptables": false
}
Run Code Online (Sandbox Code Playgroud)
然后我发出sudo service docker stop最后sudo service docker startdocker 只是遵循 UFW 中的适当规则。
附加数据:Docker 否决了 UFW!
如果您使用的是 systemd(Ubuntu 15.10 及更高版本)的 init 系统,请编辑/etc/docker/daemon.json(如果它不存在,则可能需要创建它),确保它已iptables配置密钥:
{ "iptables" : false }
Run Code Online (Sandbox Code Playgroud)
编辑:这可能会导致您从容器内部失去与互联网的连接
如果您启用了 UFW,请验证您是否可以从容器内部访问 Internet。如果不是 - 您必须定义DEFAULT_FORWARD_POLICY为ACCEPTon/etc/default/ufw并应用此处描述的技巧:https : //stackoverflow.com/a/17498195/507564
小智 5
就我而言,我最终修改了 iptables 以允许仅从特定 IP 访问 Docker。
根据ESala 的回答:
如果您
-p在容器上使用标志,Docker 会直接更改 iptables,忽略 ufw。
Docker 添加到 iptables 的记录示例
路由到“DOCKER”链:
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
Run Code Online (Sandbox Code Playgroud)
将数据包从“DOCKER”链转发到容器:
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379
Run Code Online (Sandbox Code Playgroud)
您可以修改 iptables 以允许仅从指定的源 IP 访问 DOCKER 链(例如1.1.1.1):
-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
Run Code Online (Sandbox Code Playgroud)
您可能想要使用iptables-save > /tmp/iptables.conf和iptables-restore < /tmp/iptables.conf来转储、编辑和恢复 iptables 规则。
| 归档时间: |
|
| 查看次数: |
39738 次 |
| 最近记录: |