Открываем порт в Linux с помощью firewalld

Файрвол и отсутствие соединения

Итак, вы купили VDS (виртуальный сервер), установили какой-то сервис, например ftp (File Transfer Protocol — протокол передачи файлов) и у вас не проходят соединения на сервер из внешней сети Интернет, но локально в консоли всё работает. Это означает, что порт скорее всего закрыт файрволом от внешних соединений в целях безопасности.

Почему так происходит

По умолчанию большинство портов закрыто межсетевым краном от внешних соединений в целях безопасности. Системный администратор должен стараться по-максимуму ограничивать доступ к сервисам из вне. Например, в большинстве случаев доступ к СУБД (Система управления базами данных) закрыт для внешних IP-адресов. Если какому-то серверу из вне нужен доступ, то его открывают только для заданного IP-адреса или подсети. Разумно ограничить доступы межсетевым экраном ко всем внутренним службам, которые не должны быть доступны любому пользователю Интернет.

Установка firewalld

firewall-cmd --state #смотрим состояние файрвол, если файрвола нет, то устанавливаем его
yum install firewalld #скорее всего он у вас уже установлен
systemctl enable firewalld #включаем автоматический запуск фарвол. Это нужно, чтобы он запускался после перезагрузки сервера.
systemctl start firewalld #запускаем файрвол
firewall-cmd --list-all #смотрим настройки

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Как проверить, что порт закрыт именно файрволом?

systemctl stop firewalld #отключаем файрволл и проверяем есть ли соединение из вне
systemctl start firewalld #включаем файрвол

Открываем порт для внешних соединений всем пользователям

firewall-cmd --add-port=21/tcp
firewall-cmd --remove-port=21/tcp #эту команду используйте, чтобы закрыть порт

Это очевидный, но не самый лучший вариант. Он подойдёт вам, если нужно открыть какой-то конкретный порт. Если же задача разрешить сервис, то лучше подойдёт команда:

firewall-cmd --add-service=ftp
firewall-cmd --get-services #эта команда выводит список всех возможных сервисов, которые можно добавлять в файрвол
firewall-cmd --remove-service=ftp #эту команду используйте, чтобы закрыть службу

Пока эти команды только изменили текущую конфигурацию файрвола, но эти настройки не вступили в силу. Чтобы они заработали, нужно перезагрузить файрвол мягко без разрыва текущих соединений.

firewall-cmd --reload #перезагружаем без разрыва текущих соединений
firewall-cmd --complete-reload #сбросит и текущие соединения
firewall-cmd --list-all #смотрим настройки
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client ftp ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:

И если эти настройки нам нужны постоянно, то есть и после перезагрузки сервера, то нужно их сохранить.

firewall-cmd --runtime-to-permanent #делаем текущие настройки постоянными

При выполнении команд можно использовать опцию --permanent, чтобы настройки сразу сохранялись глобально. Но лучше так не делать, потому что вы не можете быть на 100% уверены, что ваши команды приведут к задуманному результату. Поэтому вы сначала добавляете настройки в текущую конфигурацию, перезагружаете файрвол, проверяете, что всё работает как требуется и только после тестирования сохраняете настройки глобально. Важно, конечно, не забыть их сохранить, а то после перезагрузки сервера будут проблемы.

Кстати, это распространённая ошибка системных администраторов, что сервер не устойчив к перезагрузкам. Некоторые системные администраторы любят хвастаться UPTIME в не сколько лет. Но у этого есть и обратная сторона, что они не могут быть уверены, что какие-то их команды не носят временный характер до ближайшей перезагрузки.

Открываем сервис для внешних соединений пользователям из заданной подсети

firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="ftp" accept'
Телеграмм ITSOFT