У меня есть правила iptables на первом сервере, который играет роль клиента, подключающегося ко второму серверу MySQL через адаптер локальной сети.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:44135]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Feb 4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb 4 20:33:41 2015
*nat
:PREROUTING ACCEPT [76:10856]
:POSTROUTING ACCEPT [11:734]
:OUTPUT ACCEPT [11:734]
COMMIT
# Completed on Wed Feb 4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb 4 20:33:41 2015
*mangle
:PREROUTING ACCEPT [2739:2511918]
:INPUT ACCEPT [2739:2511918]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1913:165876]
:POSTROUTING ACCEPT [1913:165876]
COMMIT
Происходит следующее: как только я это делаю:
service iptables restart
кажется, что все соединения MYSQL со вторым сервером работают правильно, но только в течение небольшого периода времени, обычно 1-2 минуты, но в эти 1-2 минуты соединения с nginx (веб-сервер, порт 80) не работают. Через 1-2 минуты бывает, что веб-сервер работает, а MYSQL нет. Пробовал команду iptables-save тоже, но ничего не изменилось.
Это конфигурация брандмауэра второго сервера MySQL:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2785:425650]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
решение1
Вам следует установить политику по умолчанию на DROP
тот случай, если ваше последнее правило всеобщего захвата будет случайно удалено, например так:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:44135]
Теперь на втором сервере.
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
Это правило сопоставляет соединения, назначение которых 192.168.1.1, исходный порт от 1024 до 65535, порт назначения 3306 и состояние new или installed. Вы слишком много думаете; если вы хотите разрешить соединения MySQL, вам просто нужно сопоставить порт назначения и, при желании, добавить параметр источника и/или интерфейса, если вы хотите заблокировать его для определенного исходного IP или интерфейса.
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
lo
уже имеет доступ, поскольку ваше первое -A INPUT -i lo -j ACCEPT
правило будет соответствовать всему, что поступает из обратной связи.
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
Хорошо, теперь вы разрешаете всю подсеть, но это уже лучше и должно работать.
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
То же, что и выше, петля уже разрешена в любом случае.
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
Теперь вы разрешаете все, что исходит от eth1 с портом назначения 3306.
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
Ваша политика ВЫХОДА заключается в том, чтобы ПРИНИМАТЬ все в любом случае, это правило бессмысленно.
Я почти уверен, что твоя проблема в том, чтомодуль состояния устарели, возможно, удален, поэтому вам следует использовать conntrack.
Резюме:
Первый сервер:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
Второй сервер:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m conntrack --ctstate NEW -j ACCEPT
Это разрешит все SSH-подключения и MySQL-подключения, исходящие из eth1, 192.168.1.0/24. Можете свободно это изменить.