我在服务器上有一个 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 发行版)可以从一个接口连接到另一个接口上绑定的服务。