是否可以在 Ubuntu 16 上的特定接口上限制与 Docker 容器中的数据库的连接?

是否可以在 Ubuntu 16 上的特定接口上限制与 Docker 容器中的数据库的连接?

我在服务器上有一个 MySQL 数据库(我使用佩科纳Docker您可以使用具有多个网络接口的容器来创建网络。

我的系统是Ubuntu 16.04.2 LTS

ifconfig

eth0      Link encap:...
          inet addr:95.*.*.*

eth1      Link encap:...
          inet addr:10.*.*.*

是否可以限制界面ufw上对数据库的访问eth0但允许eth1

因此它将能够使用 访问 DB 10.*.*.*:6603,但不能使用 访问95.*.*.*:6603

更新(2017 年 3 月 4 日):

我已使用该命令添加了一条规则:

sudo ufw deny in on eth0 to any port 6603 from any proto tcp

地位:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
6603/tcp on eth0           DENY        Anywhere
6603/tcp (v6) on eth0      DENY        Anywhere (v6)

但是尽管有拒绝规则,我仍可以通过客户端进入我的数据库MySQL

6603端口仍然开放:

nmap -p 6603 95.85.54.75

Starting Nmap 7.01 ( https://nmap.org ) at 2017-03-04 16:14 UTC
Nmap scan report for 95.85.54.75
Host is up (0.0012s latency).
PORT     STATE SERVICE
6603/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.65 seconds

答案1

问题在于 Docker 篡改了防火墙规则。

根据这些帖子(UFW + Docker 的危险如何设置 Docker 1.12+ 以不干扰 IPTABLES/FirewallD):

  • 我已经创建了/etc/docker/daemon.json内容文件:

    {
        "iptables": false
    }
    
  • 我已向 ufw 添加规则:

    sudo ufw allow in on eth1 to any port 6603 
    

    仅允许来自 ufw 的连接。

  • 重启 docker 守护进程

    sudo service docker stop
    sudo service docker start
    

笔记:此修复仅适用于使用 创建的容器docker run...。对于使用 Docker Swarm 创建的容器,此修复不起作用。

答案2

ufw您可以将 MySQL 绑定到单一接口,而不必使用。

mysqld 配置文件(通常在 /etc/mysql/my.cnf)有一个名为 的选项bind-address,可让您设置单个 IP 地址(例如 10.0.4.25)以强制 MySQL 仅在该接口上监听。

然而,这并不是万无一失的解决方案,因为在使用弱宿主模型(像一些 Linux 发行版)可以从一个接口连接到另一个接口上绑定的服务。

相关内容