我有一个服务器,不允许连接到外部来源的MySQL – 我的所有数据库和连接发生在本地主机上。 iptables的默认策略是删除我没有指定的任何端口的连接(目前我没有在我的iptable规则中指定端口3306,所以到这个端口的所有连接都被删除)。
这很好,但现在我想连接到位于Amazon RDS外部的mysql数据库。
端口3306可以向外部开放,如下所示:
iptables -t filter -A INPUT -p tcp --sport 3306 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 3306 -j ACCEPT
这使我可以连接到Amazon RDS上的数据库,但是它也允许远程连接到我的服务器上的数据库。
我需要做些什么来允许我的服务器连接到Amazon上的数据库,但是限制到服务器上的数据库的外部连接?
另外请记住,我相信Amazon RDS实例的IP地址可以定期更改。
利用状态引擎:
iptables -t filter -A OUTPUT -p tcp --dport 3306 -j ACCEPT iptables -t filter -A INPUT -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
或者在更高版本的iptables中
iptables -t filter -A OUTPUT -p tcp --dport 3306 -j ACCEPT iptables -t filter -A INPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
这正是状态引擎所要做的: 允许满足各种标准 (例如,协议,源端口)的stream量, 但是也是现有连接的一部分 (因为它定义了连接 )。 结果是,从本地ephmeral端口到目的地端口3306上的特定外部IP地址的传出TCP SYN分组将为该IP地址和端口号的特定组合创build状态表项,并且仅返回具有相同地址和端口的组合将被允许通过,并且仅在该连接期间。