Is there any possible way to setup the host firewall to allow connections only for the network Docker containers uses?
Intro
The only way I was able to connect to a OS hosted MySQL instance from my new Docker containers was by opening to ports:
sudo ufw allow 3310
Inside the Docker container I am then able to connect using:
(Docker container): mysql -u testuser -p -h 172.100.0.1 -P 3310
However this way the port is open to the internet as well, I would rather use SSH to connect using credentials.
NOTE: MySQL bind-address=0.0.0.0 is set
Information
- On Host:
NOTE: Showing only applicable Docker network information - my containers use a custom named network (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
Inside container:
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 network information:
docker network ls 8a35ff6a0a88 bridge bridge local 572f80997782 magento2-network-frontend bridge local 4590216456c0 host host local a79a85d3a426 none null local
Docker network inspect: Partial content:
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" } ] },
Partial iptables listing (Docker destinations) - : I noticed these connection information when connecting from inside the container when trying to connect in MySQL testing with a failed login
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
What I tried
I thought I would be able to use the method mentioned here : This is also why I investigated how to make sure the docker network name used by host (ie. ifconfig output), in my example I created d-custom-network
To allow access on a specific port let’s say port 3360 only to specific network interface eth2, then you need to specify allow in on and the name of the network interface:
$ sudo ufw allow in on eth2 to any port 3306
$ sudo ufw reload
So I tried sudo ufw allow in on d-custom-network to any port 3310
That is when I noticed the docker cpe-172-100-0-2.twcny.res.rr.com
output when trying to force a failed login for testing the location I connect from.
I do not think I understood the usage correctly, and assumed that I could use the internal network 172.100.0.*
where my docker containers connect to/from.
How would I go about this?