簡體   English   中英

Ubuntu - 主機上的防火牆規則 MySQL | Docker 容器到主機

[英]Ubuntu - firewall rules MySQL on host | Docker containers to host

是否有任何可能的方法來設置主機防火牆以僅允許 Docker 容器使用的網絡連接?

介紹

我能夠從我的新 Docker 容器連接到操作系統托管的 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,BROADCAST,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,UP,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

直接鏈接

要允許訪問特定端口,假設端口 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 output 嘗試從測試登錄失敗的位置時連接

我認為我沒有正確理解用法,並假設我可以使用我的 docker 容器連接到/從的內部網絡172.100.0.*

我將如何 go 關於這個?

我有同樣的問題,以下對我有用(所有命令都在主機上運行):

  1. 確定您的容器連接到哪個網絡:

     $ docker inspect mycontainer... "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "b8ecee4683b22db9154f8c3e56b48f371b2bdf663f25d092112fc7eb410a4816", "EndpointID": "56cd2b50116f92d49c643457059a0ef0350e14509a16d1b615f806bb62eb4ad5", ... } }...

    我的容器mycontainer連接到名為bridge的網絡:

     $ docker network ls NETWORK ID NAME DRIVER SCOPE b8ecee4683b2 bridge bridge local f9a4ecf5db2b host host local cc168ad8f868 none null local
  2. 識別主機的哪個網絡接口對應於bridge網絡:

     $ docker network inspect bridge... "Options": {... "com.docker.network.bridge.name": "docker0", ... }, ...

    我的bridge對應於主機網絡接口docker0

     $ 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...
  3. 允許從識別的主機網絡接口docker0到任何地方的端口 3310 的流量:

     $ sudo ufw allow in on docker0 to any port 3310

我測試了一下,現在主機上的數據庫端口是:

  • 從 docker 容器內部連接時可訪問,並且
  • 嘗試從主機外部的網絡連接時被防火牆過濾。

此外,由於我們正在討論使用 UFW 保護 docker 主機,因此我覺得重要的是要提及有關將 UFW 與 docker 一起使用的此邊注/警告,以防您尚未意識到:請參閱此討論以了解詳細信息,總結,默認情況下,Docker 可能會以普通用戶可能不期望的方式覆蓋 UFW 的防火牆規則。 特別是,我認為通過docker -p暴露容器上的端口實際上會在該端口上的防火牆上打一個洞,UFW 看不到或控制這個洞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM