我有一台服务器,它不允许从外部源连接到 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 地址和端口号组合创建一个状态表条目,并且只有具有相同地址和端口组合的返回流量才会被允许通过,并且只能在该连接持续期间通过。