IPTables:允许传出 MySQL 连接,但不允许传入连接

IPTables:允许传出 MySQL 连接,但不允许传入连接

我有一台服务器,它不允许从外部源连接到 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 RDS 实例的 IP 地址可能会定期更改。

答案1

利用状态引擎:

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

这正是状态引擎存在的目的:允许符合各种条件的流量(例如协议、源端口)但也是现有连接的一部分(正如它所定义的那样)联系)。结果是,TCP SYN从本地临时端口到目标端口 3306 上的特定外部 IP 地址的传出数据包将为该特定 IP 地址和端口号组合创建一个状态表条目,并且只有具有相同地址和端口组合的返回流量才会被允许通过,并且只能在该连接持续期间通过。

相关内容