Открываем порт в 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'