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 上のデータベースに接続できるようにしながら、サーバー上のデータベースへの外部接続を制限するには、何をする必要がありますか?

また、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 アドレスとポート番号の組み合わせの状態テーブル エントリを作成し、その接続の期間中のみ、同じアドレスとポートの組み合わせを持つ戻りトラフィックのみが許可されます。

関連情報