In Linux we trust!

Port Knocking

На примере MySQL рассмотрим технологию для защиты портов Port Knocking.

Технология применяется в тех случаях, когда на сервере портом наружу висит уязвимый сервис, в нашем случае это MySQL. Port Knocking открывает порт, только если мы стучимся на заранее согласованный другой порт. На Linux серверах идея реализуема на уровне ядра с помощью iptables.

Например, давайте заранее условимся, что "стук" в 13306 порт открывает нам 3306 порт (порт MySQL по умолчанию) на 10 секунд для внешнего соединения. Этого должно быть вполне достаточно, чтобы инициировать соединение. Далее порт автоматически закрывается. Важно еще и то, что порт открывается только для нашего IP адреса. Пропишем правила на iptables:

# iptables -N MYSQL
# iptables -A MYSQL -m state --state NEW -m recent \
>   --update --seconds 10 --name MYSQL -j ACCEPT
# iptables -A MYSQL -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A MYSQL -j REJECT
# iptables -A INPUT -m state --state NEW -p tcp \
>   --dport 13306 -m recent --name MYSQL --set

Цепочка MYSQL дает доступ на соединение тем, кто в списке, не сбрасывает тех, кто уже соединился и сбрасывает всех остальных. Направим весь трафик на 3306 порт в цепочку MYSQL:

# iptables -A INPUT -p tcp --dport 3306 -j MYSQL

Чтобы после перезагрузки iptables правила не слетели, их рекомендуется прописать следующим образом:

# iptables-save >/etc/mysql.iptables
# echo '#!/bin/sh' >/etc/network/if-up.d/iptables
# echo 'iptables-restore </etc/mysql.iptables' >>/etc/network/if-up.d/iptables
# chmod a+x /etc/network/if-up.d/iptables

Готово! "Стук" на клиенте выглядит очень просто:

# telnet site.com 13306 &>/dev/null