Найти в Дзене
Talibanich

Скрипт настройки iptables для доступа к порту диапазона IP

На одном из серверов настраивал master-slave репликацию MySQL/MariaDB. Т.к. сервер базы данных на мастере при этом становится доступным в интернет, это может представлять потенциальную опасность. На стандартный порт 3306, на котором работает сервер БД, начинают ломиться различные сканеры, переборщики логин/паролей и т.д. Поэтому, лучше в настройках БД сразу поменять порт на какой-нибудь не стандартный, а еще лучше прописать правила iptables, которые разрешают доступ с определенных IP, или диапазона IP. Был написан небольшой BASH скрипт, который запрещает доступ к порту (переменная PORT), кроме определенных IP (переменная ALLOWED_NETWORKS, диапазон указывается в формате CIDR): #!/bin/bash PORT=17803 # Разрешенные подсети ALLOWED_NETWORKS=( "111.111.111.0/20" "222.222.222.0/23" "200.200.200.0/23" ) echo "Настройка правил для порта $PORT..." # Проверяем существование цепочки и удаляем если есть if iptables -L PORT_${PORT} >/dev/null 2>&1; then echo "Удаление старой цепочки..." iptables -D

На одном из серверов настраивал master-slave репликацию MySQL/MariaDB. Т.к. сервер базы данных на мастере при этом становится доступным в интернет, это может представлять потенциальную опасность. На стандартный порт 3306, на котором работает сервер БД, начинают ломиться различные сканеры, переборщики логин/паролей и т.д. Поэтому, лучше в настройках БД сразу поменять порт на какой-нибудь не стандартный, а еще лучше прописать правила iptables, которые разрешают доступ с определенных IP, или диапазона IP.

Был написан небольшой BASH скрипт, который запрещает доступ к порту (переменная PORT), кроме определенных IP (переменная ALLOWED_NETWORKS, диапазон указывается в формате CIDR):

#!/bin/bash
PORT=17803
# Разрешенные подсети
ALLOWED_NETWORKS=(
"111.111.111.0/20"
"222.222.222.0/23"
"200.200.200.0/23"
)
echo "Настройка правил для порта $PORT..."
# Проверяем существование цепочки и удаляем если есть
if iptables -L PORT_${PORT} >/dev/null 2>&1; then
echo "Удаление старой цепочки..."
iptables -D INPUT -p tcp --dport $PORT -j PORT_${PORT}
iptables -F PORT_${PORT}
iptables -X PORT_${PORT}
fi
echo "Создание новой цепочки..."
# Создаем новую цепочку для порта
iptables -N PORT_${PORT}
echo "Добавление разрешенных подсетей..."
# Добавляем разрешенные подсети
for network in "${ALLOWED_NETWORKS[@]}"; do
echo "Разрешаем доступ для $network"
iptables -A PORT_${PORT} -s $network -j ACCEPT
done
# Блокируем остальной доступ в цепочке
iptables -A PORT_${PORT} -j DROP
# Добавляем правило для порта
iptables -A INPUT -p tcp --dport $PORT -j PORT_${PORT}
echo "Сохранение правил..."
mkdir -p /etc/iptables
iptables-save > /etc/iptables/rules.v4
echo "Настройка завершена!"

Исходный код в GIT

Проверям правила командой iptables -L

Должно получиться примерно так:

Вывод команды iptables -L
Вывод команды iptables -L

Естественно т.о. можно защитить любой необходимый порт какого-либо сервиса (SSH и т.п.) на уровне iptables.