У меня есть сервер, который не позволяет подключаться к mysql из внешних источников - все мои базы данных и подключения происходят на localhost. Политика iptables по умолчанию - отбрасывать соединения для любых портов, которые я не указываю (в настоящее время у меня нет порта 3306, указанного в моих правилах iptable, поэтому все соединения с этим портом отброшены).
Это нормально, но теперь я хотел бы подключиться к базе данных mysql, расположенной извне в Amazon RDS.
Порт 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, но ограничить внешние подключения к базам данных на моем сервере?
Также имейте в виду, что IP-адрес моего инстанса Amazon RDS может периодически меняться, я полагаю.
Воспользуйтесь преимуществами движка состояний:
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
пакет на конкретный внешний IP-адрес на порт назначения 3306, из локального ephmeral порта, создаст запись в таблице состояний для этой конкретной комбинации IP-адресов и номеров портов, и будет разрешен только обратный трафик с той же комбинацией адресов и портов через, и только на время этого соединения.