X

Centos 8: Доступ к порту только с определенных ip

Потихоньку мигрирую в клауд Hetzner-а разнося монолитную инфраструктуру по серверам. Столкнулся с тем, что в процессе миграции необходимо открыть порты на внешних адресах, пока весь зверинец не мигрирует в одну приватную подсеть. Сегодня расскажу как просто и быстро ограничить подключение к порту только с определенных ip..

Прежде всего, стоит заметить, что я буду использовать iptables, пока мне так удобнее. Наиболее правильное решение, использовать вместо iptables, firewalld. Но, мне пока надо, просто и быстро, поэтому пока воспользуемся iptables..

Для примера возьмем MySQL, по-умолчанию он работает на порте 3306. В my.cnf указываем в качестве интерфейса 0.0.0.0 и отключаем опцию skip-networking:

$ nano /etc/my.cnf.d/mariadb-server.cnf
...
bind-address = 0.0.0.0
#skip-networking
...

далее составляем список ip с которых можно будет коннектиться, пусть это будут такие адреса:

  • 192.168.100.50
  • 192.168.100.55
  • 192.168.100.60

** тут намерено указаны локальные адреса, в вашем случае тут должны быть внешние адреса серверов с которых будет осуществляться подключение

теперь, добавляем правила iptables в цепочку INPUT которые разрешать подключение с этих адресов

iptables -A INPUT -p tcp -s 192.168.100.50 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.100.55 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.100.60 --dport 3306 -j ACCEPT

далее, добавляем правило iptables которое заблокирует все остальные подключения

iptables -A INPUT -p tcp --dport 3306 -j DROP

Вот и все, теперь можно проверить подключение с удаленной машины

mysql -h192.168.200.200 -u<ИМЯ-ПОЛЬЗОВАТЕЛЯ> -p

** 192.168.200.200 внешний адрес машины с MySQL

Следующее, что нужно упомянуть, это то, как просмотреть и удалить правила. Просмотр

iptables -L --line-numbers

удаление

iptables -D INPUT 3

** 3 = номер правила указанный в выводе команды iptables -L --line-numbers

Правила, будут работать только до перезагрузки машины, чтобы сохранить их на постоянной основе понадобиться установить пакет iptables-services

dnf install iptables-services
systemctl enable iptables

после этого текущие правила можно сохранить вот такой командой и они будут загружены автоматически после перезагрузки

service iptables save

Как видите, все довольно просто.

-- [еще пару полезных команд по iptables] --

Очистить все правила из цепочки INPUT

iptables -F INPUT

Очистить все правила из цепочки INPUT и восстановить доступ для всех

iptables -P INPUT ACCEPT

Очистить все что можно 🙂

iptables -P INPUT ACCEPT 
iptables -P OUTPUT ACCEPT 
iptables -P FORWARD ACCEPT
iptables -F
iptables -X
iptables -N
iptables -I
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F 
iptables -t raw -X
iptables -P INPUT ACCEPT 
iptables -P OUTPUT ACCEPT 
iptables -P FORWARD ACCEPT

** "iptables -P INPUT ACCEPT" два раза, тк в случае если политика по-умолчанию DROP и вы подключены удаленно, после iptables -F, вас может выкинуть.