Как открыть порт в Ubuntu: UFW и iptables
Чтобы открыть порт в Ubuntu, достаточно одной команды: sudo ufw allow 8080/tcp. Но часто после неё сервис всё равно недоступен, потому что «открытый порт» — это три условия сразу:
- Программа слушает порт на внешнем интерфейсе. Если на порту ничего не запущено, открывать нечего.
- Firewall на сервере разрешает порт — UFW или iptables.
- Firewall хостинга разрешает порт, если он есть в панели управления.
В инструкции пройдём все три пункта: проверим службу, откроем порт в UFW или iptables, проверим его снаружи и разберём, почему открытый порт может не работать. Команды подходят для Ubuntu 22.04, 24.04 и 26.04 и для Debian. В примерах открываем порт 8080, подставляйте свой.
Шаг 1. Проверьте, что служба слушает порт
Посмотрите, какие порты заняты программами на сервере:
sudo ss -tlnp
Для UDP-портов (VPN, игровые серверы) замените флаг t на u: sudo ss -ulnp.
Найдите свой порт в колонке Local Address и посмотрите на адрес перед ним:
0.0.0.0:8080или*:8080— программа принимает подключения снаружи. Осталось открыть порт в firewall.127.0.0.1:8080— программа слушает только localhost. Снаружи она недоступна, даже если порт открыт в firewall. Нужно менять настройки самой программы или ставить перед ней Nginx.- Порта нет в списке — программа не запущена или слушает другой порт. Сначала запустите её.
Быстро найти один порт: sudo ss -tlnp | grep :8080.
Шаг 2. Откройте порт в UFW
UFW — стандартный firewall в Ubuntu. Сначала посмотрите, включён ли он и какие правила уже есть:
sudo ufw status verbose
Если команда не найдена, установите UFW: sudo apt install -y ufw.
Если статус inactive, firewall выключен и ничего не блокирует. Перед включением обязательно разрешите SSH, иначе потеряете доступ к серверу:
sudo ufw allow OpenSSH
sudo ufw enable
Открыть один порт. Указывайте протокол: tcp для сайтов, API и баз данных, udp для VPN и большинства игр:
sudo ufw allow 8080/tcp
sudo ufw allow 51820/udp
Без протокола (sudo ufw allow 8080) порт откроется и для TCP, и для UDP. Лучше открывать только нужный.
Открыть диапазон портов:
sudo ufw allow 3000:3010/tcp
Открыть порт только для одного IP. Так стоит открывать базы данных, панели управления и другие служебные порты:
sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp
Открыть порты известной программы по имени. У Nginx, Apache и OpenSSH есть готовые профили. Список: sudo ufw app list. Например, порты 80 и 443 для сайта:
sudo ufw allow 'Nginx Full'
Правила применяются сразу и сохраняются после перезагрузки сервера. Проверьте результат: sudo ufw status.
Как закрыть порт и удалить правило
Проще всего удалить правило той же командой, которой оно создавалось, добавив delete:
sudo ufw delete allow 8080/tcp
Или по номеру. Покажите правила с номерами и удалите нужное:
sudo ufw status numbered
sudo ufw delete 3
После удаления номера сдвигаются, поэтому перед следующим удалением снова выведите список.
Отдельно запрещать порт обычно не нужно: по умолчанию UFW блокирует все входящие подключения, для которых нет разрешающего правила. Убедиться в этом можно по строке Default: deny (incoming) в выводе sudo ufw status verbose.
Как открыть порт через iptables
iptables — низкоуровневый инструмент, поверх которого работает сам UFW. Напрямую его используют на серверах без UFW или когда нужны сложные правила.
Не смешивайте два способа. Если UFW включён, управляйте портами только через него: правила, добавленные вручную в iptables, пропадут после перезагрузки и запутают картину.
Посмотрите текущие правила для входящих подключений:
sudo iptables -L INPUT -n --line-numbers
Откройте TCP-порт:
sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
Ключ -I ставит правило в начало цепочки. Это важно: iptables проверяет правила сверху вниз, и разрешение, добавленное в конец после запрещающего правила, не сработает.
Открыть UDP-порт или порт только для одного IP:
sudo iptables -I INPUT -p udp --dport 51820 -j ACCEPT
sudo iptables -I INPUT -p tcp -s 203.0.113.10 --dport 5432 -j ACCEPT
Удалить правило — та же команда с -D вместо -I:
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
Сохраните правила. Правила iptables живут в памяти и исчезают после перезагрузки сервера. Чтобы они восстанавливались автоматически:
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
Повторяйте вторую команду после каждого изменения правил. В актуальных версиях Ubuntu пакет iptables-persistent конфликтует с UFW: при установке apt предложит удалить UFW. Поэтому ставьте его, только если решили работать без UFW.
Шаг 3. Проверьте порт снаружи
Проверять нужно с другого компьютера, а не с самого сервера: изнутри порт доступен в обход firewall.
В Linux и macOS:
nc -zv IP_СЕРВЕРА 8080
В Windows откройте PowerShell:
Test-NetConnection IP_СЕРВЕРА -Port 8080
Как читать результат:
succeededилиTcpTestSucceeded : True— порт открыт и программа отвечает.Connection refused— firewall пропускает запрос, но на порту никто не слушает. Вернитесь к шагу 1.- Таймаут без ответа — запрос блокируется по пути: в UFW нет правила или порт закрыт в firewall хостинга.
UDP-порты так надёжно не проверить: протокол не подтверждает соединение. Проверяйте их самим приложением — VPN-клиентом или игрой.
Порт открыт, но не работает: в чём причина
- Программа слушает только localhost. Самая частая причина. В выводе
sudo ss -tlnpу порта стоит127.0.0.1. Найдите в настройках программы параметр вродеbind,hostилиlistenи укажите0.0.0.0. Для веб-приложений безопаснее оставить localhost и отдавать их через Nginx: как настроить Nginx как reverse proxy. - Порт закрыт в firewall хостинга. У многих провайдеров в панели управления есть отдельный сетевой firewall или группы безопасности. Он работает до сервера, и правила UFW на него не влияют. Откройте порт и там.
- Не тот протокол. Открыли TCP, а приложению нужен UDP, или наоборот. WireGuard и большинство игр используют UDP.
- Порт занят другой программой. Ваша служба не смогла запуститься, на порту отвечает что-то другое. Посмотрите имя процесса в последней колонке
sudo ss -tlnp. - Сервис в Docker. Docker публикует порты в обход UFW: порт может быть доступен из интернета без всякого правила, и закрыть его через
ufw denyне получится. Подробности и решение — в статье как установить Docker на Ubuntu. - Провайдер блокирует порт. Исходящий порт 25 (отправка почты) часто закрыт хостингом для защиты от спама. Его открывают по запросу в поддержку.
Какие порты открывать, а какие нет
Каждый открытый порт — точка входа для атаки. Боты сканируют весь интернет и находят новый открытый порт за считанные часы.
- Открывайте для всех только то, что должно быть публичным: 80 и 443 для сайтов, порт игрового сервера, порт VPN.
- Открывайте только для своих IP служебные порты: SSH (22), панели управления, мониторинг.
- Не открывайте наружу базы данных и кеши: MySQL (3306), PostgreSQL (5432), Redis (6379), MongoDB (27017). Открытый Redis без пароля — одна из самых частых причин взлома серверов. Если к базе нужен удалённый доступ, откройте порт для одного IP или подключайтесь через SSH-туннель.
- Ограничьте подбор паролей к SSH. Команда
sudo ufw limit OpenSSHблокирует IP, который подключается слишком часто. - Раз в месяц проверяйте список. Сравните
sudo ufw statusс тем, что реально работает на сервере, и удалите правила для сервисов, которых больше нет.
Остальные шаги защиты сервера — в статье что сделать сразу после покупки VPS.
Чек-лист
Частые вопросы
Как посмотреть открытые порты в Ubuntu? Порты, которые слушают программы: sudo ss -tlnp. Порты, разрешённые в firewall: sudo ufw status. Порт доступен снаружи, только если он есть в обоих списках.
Что лучше: UFW или iptables? Для обычного VPS — UFW: простые команды, правила сохраняются сами. iptables нужен для сложных сценариев: проброс портов, NAT, тонкая фильтрация.
Нужно ли перезагружать сервер после открытия порта? Нет. Правила UFW и iptables действуют сразу после команды.
Как перенаправить порт 80 на порт приложения? Лучше не через firewall, а через Nginx: он принимает запросы на 80 и 443 и передаёт их приложению, заодно давая HTTPS.
Я включил UFW и потерял доступ по SSH. Что делать? Зайдите на сервер через веб-консоль (VNC) в панели хостинга и выполните sudo ufw allow OpenSSH. Консоль работает напрямую, без сети и firewall.