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