让我们考虑一个运行 MySQL 服务器,监听 127.0.0.1:3306。
我现在想让在同一主机上运行的 Docker 容器访问 MySQL 服务器。MySQL 会拒绝传入连接,因为它们不是来自 127.0.0.1,而是来自容器的 IP。我可以将 MySQL 的绑定地址更改为“*”,但这样我就完全依赖防火墙来阻止来自其他网络的访问。因此,我更愿意让 MySQL 继续监听 127.0.0.1,并使用 iptables 将容器列入“白名单”。我不是 iptables 专家,所以我只是尝试了不同的组合,使用 -t nat INPUT、PREROUTING、POSTROUTING,但到目前为止无法使其正常工作。我还将“net.ipv4.conf.docker0.route_localnet”设置为 1,因为这看起来是必要的。
如何让 iptables 将进入 docker0 接口(或特定 IP 或网络)的所有数据包的源地址设置为 127.0.0.1,并处理以下地址转换?
答案1
回答我自己的问题:看起来 iptables 不是适合这项工作的工具。我安装了 rinetd 并对其进行了如下配置:
# bindadress bindport connectaddress connectport
172.17.0.1 3308 127.0.0.1 3306
rinetd 仅绑定到 Docker 地址 (172.17.0.1),并将来自容器的连接转发到主机上运行的 MySQL 服务器。从 MySQL 的角度来看,连接来自 127.0.0.1,因此它很乐意接受它们。
如果 MySQL 支持多个绑定地址,那就简单多了,但由于相应的功能请求已经开放了 11 年,我猜它不会很快实现(https://bugs.mysql.com/bug.php?id=14979)。