Ubuntu-防火墙在主机上控制MySQL托管的Docker容器

问题描述

是否可以设置主机防火墙以允许连接 仅用于Docker容器使用的网络?

简介

我能够从新的Docker容器连接到OS托管的MySQL实例的唯一方法是打开端口:

sudo ufw allow 3310

然后在Docker容器中使用以下命令进行连接:

 (Docker container): mysql -u testuser -p -h 172.100.0.1 -P 3310

无论如何,端口也可以通过互联网打开,我宁愿使用SSH通过凭据进行连接。

注意:设置了MySQL bind-address = 0.0.0.0

信息

  • 在主机上:

注意:仅显示适用的Docker网络信息-我的容器使用自定义命名网络(d-custom-network)

  ifconfig

  d-custom-network: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 172.100.0.1  netmask 255.255.0.0  broadcast 172.100.255.255
    inet6 fe80::42:b8ff:fe7f:c4bf  prefixlen 64  scopeid 0x20<link>
    ether 02:42:b8:7f:c4:bf  txqueuelen 0  (Ethernet)
    RX packets 473  bytes 34668 (34.6 KB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 403  bytes 119797 (119.7 KB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  docker0: flags=4099<UP,MULTICAST>  mtu 1500
    inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
    inet6 fe80::42:13ff:fefc:301f  prefixlen 64  scopeid 0x20<link>
    ether 02:42:13:fc:30:1f  txqueuelen 0  (Ethernet)
    RX packets 28509  bytes 1593290 (1.5 MB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 33351  bytes 173437123 (173.4 MB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 内部容器:

    ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          inet 127.0.0.1/8 scope host lo
     valid_lft forever preferred_lft forever
    69: eth0@if70: <BROADCAST,MULTICAST,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:64:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.100.0.4/16 brd 172.100.255.255 scope global eth0
     valid_lft forever preferred_lft forever
    
  • Docker网络信息:

     docker network ls
    
     8a35ff6a0a88        bridge                            bridge              local
     572f80997782        magento2-network-frontend         bridge              local
     4590216456c0        host                              host                local
     a79a85d3a426        none                              null                local
    
  • Docker网络检查: 部分内容:

     docker network inspect magento2-network-frontend
    
     [
         {
             "Name": "glo-magento2.3-network-frontend","Id": "572f809977826942d1b582c17f2ac67f25f4221ddfe5a2f504ccb12a3aa6c786","Created": "2020-08-11T12:05:51.988694032Z","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {
                 "Driver": "default","Options": null,"Config": [
              {
                  "Subnet": "172.100.0.0/16"
              }
          ]
      },

部分iptables列表(Docker目标)-:当我尝试在MySQL中进行连接时,从容器内部进行连接时我注意到了这些连接信息测试登录失败 >

   FROM Within container:

   ERROR 1045 (28000): Access denied for user 'testuser'@'cpe-172-100-0-4.twcny.res.rr.com'
   ping cpe-172-100-0-4.twcny.res.rr.com
   PING cpe-172-100-0-4.twcny.res.rr.com (172.100.0.4) 56(84) bytes of data.
   64 bytes from 54195d3486eb (172.100.0.4): icmp_seq=1 ttl=64 time=0.063 ms

   iptables -L 

   Chain DOCKER (2 references)
   target     prot opt source               destination
   ACCEPT     tcp  --  anywhere             cpe-172-100-0-2.twcny.res.rr.com  tcp dpt:6082
   ACCEPT     tcp  --  anywhere             cpe-172-100-0-2.twcny.res.rr.com  tcp dpt:6081
   ACCEPT     tcp  --  anywhere             cpe-172-100-0-3.twcny.res.rr.com  tcp dpt:6379
   ACCEPT     tcp  --  anywhere             cpe-172-100-0-4.twcny.res.rr.com  tcp dpt:http-alt
   ACCEPT     tcp  --  anywhere             cpe-172-100-0-5.twcny.res.rr.com  tcp dpt:https
   ACCEPT     tcp  --  anywhere             cpe-172-100-0-5.twcny.res.rr.com  tcp dpt:http

我尝试过的

我以为我可以使用这里提到的方法:这也是为什么我研究如何确定主机使用的docker网络名称(即ifconfig输出)的原因我创建了 d-custom-network

Direct link

要允许访问特定端口,假设端口3360仅访问特定网络接口eth2,然后 您需要指定allow in on和网络接口的名称:

 $ sudo ufw allow in on eth2 to any port 3306

 $ sudo ufw reload

所以我尝试了sudo ufw allow in on d-custom-network to any port 3310

那是我在尝试强制登录失败以测试我连接的位置时注意到docker cpe-172-100-0-2.twcny.res.rr.com输出的情况。

我认为我没有正确理解用法,并假设我可以使用内部网络172.100.0.*,我的Docker容器在该内部网络之间进行连接。

我将如何处理?

解决方法

我有同样的问题,以下对我有用(所有命令都在主机上运行):

  1. 确定您的容器连接到哪个网络:

    D["params"]

    我的容器 $ docker inspect mycontainer ... "Networks": { "bridge": { "IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "b8ecee4683b22db9154f8c3e56b48f371b2bdf663f25d092112fc7eb410a4816","EndpointID": "56cd2b50116f92d49c643457059a0ef0350e14509a16d1b615f806bb62eb4ad5",... } } ... 连接到名为 mycontainer 的网络:

    bridge
  2. 确定主机的哪个网络接口对应于 $ docker network ls NETWORK ID NAME DRIVER SCOPE b8ecee4683b2 bridge bridge local f9a4ecf5db2b host host local cc168ad8f868 none null local 网络:

    bridge

    我的网络 $ docker network inspect bridge ... "Options": { ... "com.docker.network.bridge.name": "docker0",... },... 对应于主机网络接口 bridge

    docker0
  3. 允许来自已识别主机网络接口 $ ip addr ... 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c8:b4:a4:ba brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:c8ff:feb4:a4ba/64 scope link valid_lft forever preferred_lft forever ... 的流量在任何地方流向端口 3310:

    docker0

我测试了一下,现在主机上的数据库端口是:

  • 从 docker 容器内部连接时可访问,并且
  • 尝试从主机外部的网络连接时被防火墙过滤。

此外,由于我们正在讨论使用 UFW 保护 docker 主机,因此我觉得有必要提及关于将 UFW 与 docker 一起使用的此边注/警告,以防您还没有意识到:请参阅 this discussion有关详细信息,总而言之,Docker 默认情况下可能会以典型用户可能不期望的方式覆盖 UFW 的防火墙规则。特别是,我认为通过 $ sudo ufw allow in on docker0 to any port 3310 公开容器上的端口实际上在该端口上的防火墙中打了一个洞,UFW 无法看到或控制。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...