我在服务器 1 上有我的 MySQL 数据库服务器。我想让我的 Rails 应用程序在另外两台服务器上——比如 A 和 B 能够连接到服务器 1。最好的方法是什么?
在 my.cnf 文件中,我似乎可以使用绑定地址绑定到一个且只有一个 IP 地址。我无法在 my.cnf 中指定 A 和 B 的 IP 地址。
另一方面,如果我评论跳过网络,大门是敞开的。
有中庸之道吗?你们在做什么来允许数据库服务器监听来自多个应用服务器的请求并仍然保持安全?
如果 MySQL 在 Linux 上运行:
我非常倾向于使用 iptables(又名 netfilter,Linux 防火墙)来控制传入各种端口的流量。它使用简单且非常强大。
iptables -A INPUT -p tcp -s server1address/32 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -s server2address/32 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
绑定地址是服务器的本地 IP 地址,而不是允许的客户端地址。在您的情况下,您可以提供服务器的静态地址(代替 localhost),或者,如果您的 IP 可能更改,只需将其注释掉。
再次澄清一下:这bind-address
是服务器侦听客户端连接的地址(您可以有多个 NIC,或多个 IP 地址等)。也可以更改port
您希望 mysql 收听的内容。
如果您尚未配置 root 密码,则需要确保:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('yourpassword');
然后,您将使用其他方法来限制对 MySql 的访问,例如本地网络(即您的防火墙)。
有关 iptables 的更多信息:
上面的 iptables 命令必须要么插入到现有的 iptables 表中,否则你必须删除现有的东西并从头开始使用上面的命令。
插入并不难,但它有点取决于您使用的 Linux 发行版,所以我不确定该推荐什么。
要从头开始,您需要先刷新和清除现有表:
iptables -F
iptables -X
然后按照我之前的回答中指出的模型,插入你需要使用的 iptables 防火墙规则。
然后保存 iptables 规则。这又取决于分布。在大多数 Red Hat 衍生产品(Red Hat、Fedora、CentOS)上,运行以下代码就足够了:
service iptables save
瞧,您的自定义规则已保存。如果启用了 iptables 服务(使用“chkconfig --list iptables”检查,根据您的情况,它必须在运行级别 3 和 5 上为“:on”,但在 3 和 5 上都设置为“:on”是安全的无论如何)那么您的规则将在重新启动后继续存在。
您可以随时查看当前运行的 iptables 规则。以下是一些执行此操作的命令,其详细程度各不相同:
iptables -L
iptables -L -n
iptables -L -n -v
如果没有 -n,它将尝试查找域名并显示它们而不是 IP 地址 - 如果 DNS 无法 100% 完美运行,这可能是不可取的。所以这就是为什么我几乎总是使用-n。
-v 表示“冗长”,有点难以阅读,但它提供了更多信息。
注意:如果您从头开始,该机器上运行的其他服务可能不再受 iptables 保护。花一些时间弄清楚如何在现有表中插入 MySQL 规则。这对您的系统安全性更好。
数据库服务器将监听无限数量的客户端。
每个客户端 Rails 应用程序都标识数据库服务器。
DB 服务器耐心等待连接。它不知道有多少客户端或连接来自哪里。
编辑
“你如何安全地配置数据库 wrt 接受来自哪些服务器的请求?”
这就是网络、防火墙和路由器的用途。
这就是数据库需要来自 Rail 应用程序的凭据的原因。
除了获得正确的绑定地址之外,您还需要打开正确的端口、创建或配置用户以及其他一些细节。这解释得很清楚。