Форум русскоязычного сообщества 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


В данном видео показано как узнать с помощью командной строки, какой именно компонент использует TCP-порт 80 в Linux-системах T4M29S
- netstat — инструмент командной строки, отображающий сетевые подключения, таблицы маршрутизации и ряд статистических сведений сетевых интерфейсов.
- fuser — инструмент командной строки, идентифицирующий процессы, которые используют файлы или сокеты.
- lsof — инструмент командной строки, выводящий список открытых файлов в системе Linux/UNIX и выводящий список всех открытых файлов и процессов, которые открыли указанные выше файлы.
- /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
- 0 0.0.0.0:80 — Source IP:Port
- 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
