Почему брандмауэр работает с перебоями?

Почему брандмауэр работает с перебоями?

У меня есть правила 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. Можете свободно это изменить.

Связанный контент