Перейти к содержимому

Как освободить порт ubuntu

  • автор:

Форум русскоязычного сообщества Ubuntu

Страница сгенерирована за 0.043 секунд. Запросов: 23.

  • Сайт
  • Об Ubuntu
  • Скачать Ubuntu
  • Семейство Ubuntu
  • Новости
  • Форум
  • Помощь
  • Правила
  • Документация
  • Пользовательская документация
  • Официальная документация
  • Семейство Ubuntu
  • Материалы для загрузки
  • Совместимость с оборудованием
  • RSS лента
  • Сообщество
  • Наши проекты
  • Местные сообщества
  • Перевод Ubuntu
  • Тестирование
  • RSS лента

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Как найти и закрыть открытый порт в linux

Итак, вы являетесь сетевым администратором, и у вас есть несколько машин Linux в вашей сети или дата-центре. Вы обнаружили странный трафик и вам требуется его определить. Возможно ли, что трафик использует открытый порт на машине? Если так, где находится порт и как вы его закроете?

На машинах с Linux эта задача на самом деле довольно проста. Я хочу показать вам, как найти открытый порт и закрыть его. Я буду демонстрировать на Ubuntu Server 18.04, хотя процесс будет схожим во многих дистрибутивах, единственное отличие будет в том, как закрыть порт.

Как найти открытый порт

К счастью, вам не нужно устанавливать какое-либо программное обеспечение, чтобы сделать эту работу. Почему? Потому что мы будем использовать команду ss (так как netstat устарел) для просмотра портов прослушивания на вашем сервере. Это будет сделано полностью из командной строки, поэтому либо войдите на свой сервер, либо используйте безопасную оболочку для доступа. Когда вы получите приглашение bash, введите команду:

sudo ss -tulwn | grep LISTEN

Возможны следующие варианты:

-t Показать только сокеты TCP в Linux
-u Показать только сокеты UDP в Linux
-l Показать прослушивающие сокеты (например, TCP-порт 22 открыт SSHD-сервером)
-p Список имен процессов, которые открывали сокеты
-n Не разрешать имена сервисов

Вывод команды будет перечислять только прослушиваемые порты.

Как видите, на этой машине имеется только несколько открытых портов (53, 22, 631, 445, 3306, 11211, 80, 8080).

Если вы не уверены, какой порт соответствует какой службе, вы всегда можете узнать это в файле /etc/services. Прочитайте этот файл с помощью команды:

less /etc/services

Вы должны увидеть список всех портов, доступных для Linux.

Как закрыть порт

Скажем, вы размещаете веб-сервер на компьютере, но не хотите прослушивать порт 8080. Вместо этого вы хотите, чтобы трафик проходил только через порты 80 (HTTP) и 443 (HTTPS). Чтобы закрыть порт 8080, мы будем использовать команду ufw (Uncomplicated FireWall) следующим образом:

sudo ufw deny 8080

Вы должны увидеть, что правила были обновлены, а порт заблокирован. Если вы обнаружите, что блокирование этого порта вызывает проблемы со службой или приложением, вы можете снова открыть его с помощью команды:

sudo ufw allow 8080

И это все, что нужно для поиска и закрытия открытого порта на Ubuntu. Этот процесс должен работать в большинстве дистрибутивов, единственное предостережение — как вы блокируете порт, так как не каждый дистрибутив использует ufw. Если выбранный вами дистрибутив использует другую команду для блокировки портов (например, sudo iptables -A INPUT -p tcp —destination-port 80 -j DROP), убедитесь, что вы знаете, как выполнить эту задачу на своем сервере.

Как в Debian освободить порт если fuser -k номер/tcp не помогает?

Во время разработки сервера, его приходится часто включать/выключать. Естественно порт освобождается не сразу и сервер не стартует из-а 98-й ошибки EADDRINUSE . Я не хочу использовать SO_REUSEADDR на сокете, просто нужно жёстко закрывать порт и запускать сервер не смотрия ни та что. fuser -k номер/tcp вроде отрабатывает, но ошибка всё равно остаётся какое-то время, в процессах сервер не висит — закрывается корректно. Как освободить порт в этом случае?

Отслеживать
задан 15 мар 2020 в 11:48
2,273 1 1 золотой знак 17 17 серебряных знаков 27 27 бронзовых знаков
используйте SO_REUSEADDR
15 мар 2020 в 11:59

Что если написать скрипт-обёртку для запуска, который бы ждал, пока порт освободится и потом запускал сервер?

16 мар 2020 в 5:43

@NickVolynkin — основная цель тут — побороть время. Тут проц помощнее ищешь чтобы собирало скорее, секунды экономишь, а оно порт занимает на 2 минуты — никуда не годится )

18 мар 2020 в 17:52

@Iceman это порт для HTTP или для связи между компонентами сервера? Есть идея, что можно перебирать несколько портов по кругу. Написать обёртку, которая будет перед запуском сервера задавать переменную окружения с портом или передавать его в параметрах/конфигах.

22 мар 2020 в 5:08

@NickVolynkin, нет. я понял уже из-за чего это. Обмен данными происходит по WebSocket. Закрытие соединения WebSocket предусматривает обмен закрывающими фреймами. Я тестировал парсинг фрейма, но не сделал корректную обработку закрытия (не отвечал клиенту должным образом и не вычитывал его closure запрос) — в результате сервер то я закрывал, а на TCP по этому порту висели данные и система не теряла надежды, что их кто-нибудь подберёт )))

22 мар 2020 в 9:00

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Как и бывает в большинстве подобных случаев, проблема оказалась в другом.

Разрабатываемый сервер осуществляет коммуникацию с клиентами по WebSocket. Закрытие соединения WebSocket предусматривает обмен закрывающими фреймами. Я тестировал парсинг WS-фрейма, но до корректной обработки закрытия руки не дошли (не отвечал клиенту должным образом и не вычитывал его closure запрос) — в результате сервер то закрывался, а на TCP по этому порту висели данные, отправленные клиентом в пустоту — то ли ping, то ли close запрос. Система не теряла надежды, что их кто-нибудь подберёт, и держала порт.

Как только клиент (в данном эксперименте браузер Firefox) стал получать ответ о закрытии, он корректно отключался, а при перезапуске сервера тот стартовал моментально на том же порте без SO_REUSEADDR , ошибка 88 более не возникала.

Да, решение не является ответом по изначальной тематике вопроса, но пусть оно служит памяткой для подобный проблем — всегда проверять корректность завершения сеанса связи в разрабатываемых приложениях.

Отслеживать
ответ дан 22 мар 2020 в 17:30
2,273 1 1 золотой знак 17 17 серебряных знаков 27 27 бронзовых знаков

Иногда помогает закрытие сокета извне через ss -K https://unix.stackexchange.com/a/511691/43898 но это в случае если программа не висит в блокировке ввода-вывода.

Отслеживать
ответ дан 16 мар 2020 в 0:59
34.2k 3 3 золотых знака 27 27 серебряных знаков 61 61 бронзовый знак

Нет, не работает. Программа ведь не может висеть в блокировке, если все потоки, обрабатывающие подключения закрыты, и программа завершена?

Как узнать, какой компонент использует TCP-порт 80

Консультация по продукту 1cloud

В данном видео показано как узнать с помощью командной строки, какой именно компонент использует TCP-порт 80 в Linux-системах T4M29S

  • Как узнать, какой компонент использует TCP-порт 80 2016-01-13 true 640 360

    1. netstat — инструмент командной строки, отображающий сетевые подключения, таблицы маршрутизации и ряд статистических сведений сетевых интерфейсов.
    2. fuser — инструмент командной строки, идентифицирующий процессы, которые используют файлы или сокеты.
    3. lsof — инструмент командной строки, выводящий список открытых файлов в системе Linux/UNIX и выводящий список всех открытых файлов и процессов, которые открыли указанные выше файлы.
    4. /proc/$pid/ file system — в ОС Linux каталог /proc содержит каталог для каждого запущенного процесса (включая процессы ядра) в /proc/PID. Такой каталог содержит сведения об этом процессе, в частности, имя процесса, открывшего порт.

    Определение компонента, использующего порт 80, с помощью netstat

    Откройте терминал и введите следующую команду от имени суперпользователя: netstat command find out what is using port 80 Выполните следующую команду: # netstat -tulpn | grep :80 ИЛИ такую команду: # netstat -tulpn | grep —color :80

    Пример вывода данных:

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1215/nginx
    1. 0 0.0.0.0:80 — Source IP:Port
    2. 1215/nginx — PID/Process name

    TCP-порт 80 открыт и используется веб-сервером Nginx. Чтобы получить подробные сведения о Nginx, выполните следующие команды:
    whatis nginx
    whereis nginx

    Примечание. Возможно, потребуется установить команды lsof и fuser.

    Определение компонента, использующего порт 80, с помощью /proc/$pid/exec file

    Сначала необходимо найти PID процесса, открывшего TCP-порт 90. Введите: # fuser 80/tcp

    Пример вывода данных:

    80/tcp: 12161 21776 25250 25393

    И, наконец, следует выяснить имя процесса, связанного с PID#3813. Введите: # ls -l /proc/12161/exe

    Пример вывода данных:

    lrwxrwxrwx. 1 root root 0 Aug 9 13:28 /proc/12161/exe -> /usr/sbin/lighttpd

    Дополнительные сведения о lighttpd: man lighttpd
    whatis lighttpd
    whereis lighttpd

    Пример вывода данных:

    lighttpd (8) - a fast, secure and flexible web server lighttpd: /usr/sbin/lighttpd /usr/lib64/lighttpd /usr/share/man/man8/lighttpd.8.gz

    Получить намного более подробные сведения о lighttpd можно с помощью менеджера пакетов: # rpm -qa | grep lighttpd

    Пример вывода данных:

    lighttpd-1.4.32-1.el6.x86_64

    Чтобы получить подробные сведения о пакете lighttpd-1.4.32-1.el6.x86_64, введите: # yum info lighttpd-1.4.32-1.el6.x86_64

    Пример вывода данных:

    Loaded plugins: auto-update-debuginfo, protectbase, rhnplugin, security This system is receiving updates from RHN Classic or RHN Satellite. 0 packages excluded due to repository protections Installed Packages Name : lighttpd Arch : x86_64 Version : 1.4.32 Release : 1.el6 Size : 664 k Repo : installed Summary : A web server more optimized for speed-critical environments. URL : http://lighttpd.net/ License : Revised BSD Description : It is a secure and fast web server a very low memory footprint compared : to other webservers and takes care of cpu-load.

    ИЛИ выполните команду rpm: # rpm -qi lighttpd

    Пример вывода данных:

    Name : lighttpd Relocations: (not relocatable) Version : 1.4.32 Vendor: nixCraft Release : 1.el6 Build Date: Sun 03 Feb 2013 03:22:08 AM CST Install Date: Mon 04 Feb 2013 04:44:26 AM CST Build Host: rhel6.nixcraft.net.in Group : System Environment/Daemons Source RPM: lighttpd-1.4.32-1.el6.src.rpm Size : 680402 License: Revised BSD Signature : (none) URL : http://lighttpd.net/ Summary : A web server more optimized for speed-critical environments. Description : It is a secure and fast web server a very low memory footprint compared to other webservers and takes care of cpu-load.

    Пользователи Debian/Ubuntu Linux могут выполнить следующие команды: # dpkg —list | grep lighttpd
    # apt-cache search lighttpd
    # apt-cache show lighttpd

    Пример вывода данных для последней команды:

    Package: lighttpd Priority: optional Section: universe/web Installed-Size: 841 Maintainer: Ubuntu Developers Original-Maintainer: Debian lighttpd maintainers Architecture: amd64 Version: 1.4.28-2ubuntu4 Provides: httpd, httpd-cgi Depends: libattr1 (>= 1:2.4.46-5), libbz2-1.0, libc6 (>= 2.4), libgamin0 | libfam0, libldap-2.4-2 (>= 2.4.7), libpcre3 (>= 8.10), libssl1.0.0 (>= 1.0.0), zlib1g (>= 1:1.1.4), lsb-base (>= 3.2-14), mime-support, libterm-readline-perl-perl Recommends: spawn-fcgi Suggests: openssl, rrdtool, apache2-utils, ufw Conflicts: cherokee (
    

    Определение компонента, использующего порт 80, с помощью команды lsof

    Выполните следующую команду: # lsof -i :80 | grep LISTEN

    Пример вывода данных:

    apache2 1607 root 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1616 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1617 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN)

    Тестирование сервера

    P. S. Другие инструкции:

    • Настройка SSH-ключей для подключения к Linux
    • Настройка Linux-файрвола iptables: Руководство для начинающих
    • Базовая настройка безопасности Linux-систем

    Ознакомиться с другими инструкциями вы можете на нашем сайте. А чтобы попробовать услугу — кликните на кнопку ниже.

    Поделиться в соцсетях:

    Средняя оценка: 4,9, всего оценок: 8 Спасибо за Вашу оценку! К сожалению, проголосовать не получилось. Попробуйте позже

    191014 Санкт-Петербург ул. Кирочная, 9

    235 70

    1cloud ltd
    2021-07-28 Как узнать, какой компонент использует TCP-порт 80
    191014 Санкт-Петербург ул. Кирочная, 9

    235 70

    1cloud ltd

    600 auto

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *