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

Обновлено: 02.07.2024

Как проверить, прослушивается ли порт на сервере Linux?

Не совсем понятно, о чем вы спрашиваете. Что вы имеете в виду под словом "открыть"? Вы имеете в виду, что какой-то сервер прослушивает этот порт? Или вы имеете в виду, что это разрешено системным брандмауэром? Или что?

, вы должны получить что-то вроде подключения к порту 127.0.0.1 9000 [tcp/*] успешно! , иначе порт закрыт.

7 ответов 7

Вы можете проверить, прослушивает ли процесс порт TCP или UDP, с помощью netstat -tuplen .

Чтобы проверить, доступны ли некоторые порты извне (это, вероятно, то, что вам нужно), вы можете использовать сканер портов, такой как Nmap, из другой системы. Запуск Nmap на том же хосте, который вы хотите проверить, совершенно бесполезен для ваших целей.

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

Самый быстрый способ проверить, открыт ли TCP-порт (включая любые имеющиеся у вас аппаратные брандмауэры), — ввести с удаленного компьютера (например, с рабочего стола):

Что попытается открыть соединение с портом 80 на этом сервере. Если вы получаете тайм-аут или денай, порт не открыт :)

Хорошо, у вас есть сервер, на который вы можете войти. Вы хотите увидеть, прослушивает ли что-то какой-либо порт. Запустите как root:

это покажет список процессов, прослушивающих порты TCP и UDP. Вы можете отсканировать (или выполнить поиск) интересующего вас процесса и/или номеров портов, которые вы ожидаете увидеть.

Если ожидаемого процесса нет, следует запустить этот процесс и снова проверить netstat. Если процесс есть, но он прослушивает интерфейс и порт, которые вы не ожидали, то проблема с конфигурацией (например, он может прослушивать, но только на петлевом интерфейсе, поэтому вы увидите 127.0.0.1:3306 и никаких других строк для порта 3306 в случае конфигурации по умолчанию для MySQL).

Если процесс запущен и прослушивает порт, который вы ожидаете, вы можете попробовать запустить «telnet» для этого порта с вашего Macbook в вашем офисе или дома, например,

Это проверит, если (при условии стандартных портов) есть ли веб-сервер, настроенный для SSL. Обратите внимание, что этот тест с использованием telnet будет работать только в том случае, если процесс прослушивает TCP-порт. Если это UDP-порт, вы можете попробовать подключиться к нему с любым клиентом, который собирались использовать. (Я вижу, что вы использовали порт 224. Это masqdialer, и я понятия не имею, что это такое).

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

Это покажет все правила брандмауэра, определенные в вашей системе. Вы можете опубликовать это, но, как правило, если вы не разрешаете все в цепочке INPUT, вам, вероятно, потребуется явно разрешить трафик на рассматриваемом порту:

или что-то в этом роде. Не выполняйте команды брандмауэра вслепую, основываясь на том, что вам рассказал незнакомец в Интернете. Подумайте, что вы делаете.

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

Есть ли в Linux какой-либо ручной параметр командной строки для закрытия порта?

ПРИМЕЧАНИЕ. Я узнал, что "только приложение, которому принадлежит подключенный сокет, должно закрыть его, что произойдет, когда приложение завершит работу".

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


Нет, открытые порты принадлежат процессу, который их открыл, управление извне невозможно. И это хорошо, иначе всем приложениям пришлось бы ожидать, что их открытые порты (и файлы) будут испорчены. Однако вы можете заблокировать трафик на порт с помощью брандмауэра (iptables), но это не закроет и не оставит порт для другого использования.

Многие респонденты упустили смысл этого вопроса. Нонсенс заявлять, что отключать его может только приложение, которому принадлежит порт. Я могу отключить его, подойдя к коробке и вытащив кабель Ethernet из розетки, или уничтожив приложение на другом конце соединения! Приложение должно быть написано для обработки этого. Итак --- как проверить правильность написания приложения, не требуя физического вмешательства и/или управления другим компьютером?

". Управление извне невозможно." Это важное замечание, которое привело меня к следующему вопросу, как я могу быть частью процесса извне? ГБД.

@JürgenStrobel Действительно возможен внешний контроль - и tcpkill, и ss могут делать именно то, что требуется. Потому что открытые порты на самом деле не принадлежат процессу; они являются ресурсами ядра с некоторыми правами, назначенными процессу, но все еще существующими только по усмотрению ядра.

@tom-anderson DaleW: tcpkill — это инструмент брандмауэра, и я упоминал об этом параметре. Вы можете запретить трафик на порт, что отличается от закрытия порта (сокета).

15 ответов 15

У меня была такая же проблема, процесс должен оставаться в живых, но сокет должен закрыться. Закрытие сокета в запущенном процессе не невозможно, а сложно:

найдите процесс:

Вы получаете карту источника/назначения ip:port portstate pid/имя процесса

найти файловый дескриптор сокета в процессе

Вы получаете список: имя процесса, pid, пользователь, дескриптор файла, . строка подключения.

Найдите соответствующий номер файлового дескриптора для подключения. Это будет что-то вроде "97u", что означает "97".

Теперь подключите процесс:

Теперь закройте сокет:

Затем отсоедините gdb:

И сокет закрыт.



sudo lsof -np $pid дает мне около 200 строк, и я не понимаю, как найти нужный FD. В моем случае процесс — это вкладка Chrome, и я пытаюсь закрыть открытые веб-сокеты.

Если вы хотите имитировать закрытие сокета удаленным концом (например, выход однорангового узла), лучше использовать shutdown : call shutdown($fileDescriptor, 0) .

Вы задаете здесь неправильный вопрос. На самом деле невозможно просто «закрыть порт» извне приложения, которое открыло сокет, прослушивающий его. Единственный способ сделать это — полностью убить процесс, которому принадлежит порт. Затем, примерно через минуту-две, порт снова станет доступен для использования. Вот что происходит (если вам все равно, переходите к концу, где я покажу вам, как убить процесс, владеющий определенным портом):

Порты — это ресурсы, выделяемые операционной системой различным процессам. Это похоже на запрос ОС об указателе файла. Однако, в отличие от файловых указателей, только ОДИН процесс в каждый момент времени может владеть портом. Через интерфейс сокетов BSD процессы могут делать запрос на прослушивание порта, который ОС затем предоставляет. ОС также позаботится о том, чтобы ни один другой процесс не получил тот же порт. В любой момент процесс может освободить порт, закрыв сокет. После этого ОС восстановит порт. В качестве альтернативы, если процесс завершится без освобождения порта, ОС в конечном итоге вернет порт (хотя это произойдет не сразу: это займет несколько минут).

То, что вы хотите сделать (просто закрыть порт из командной строки), невозможно по двум причинам. Во-первых, если бы это было возможно, это означало бы, что один процесс мог бы просто украсть ресурс другого процесса (порт). Это было бы плохой политикой, если бы она не ограничивалась привилегированными процессами. Вторая причина заключается в том, что неясно, что произойдет с процессом, владеющим портом, если мы позволим ему продолжить работу. Код процесса написан в предположении, что он владеет этим ресурсом. Если бы мы просто убрали его, он бы сам по себе рухнул, так что ОС не позволяет вам сделать это, даже если вы являетесь привилегированным процессом. Вместо этого вы должны просто убить их.

В любом случае, вот как завершить процесс, которому принадлежит определенный порт:

Это выведет строку, соответствующую порту, в котором находится процесс, например:

В данном случае procHoldingPort — это имя процесса, открывшего порт, 4683 — его pid, а 8000 (обратите внимание, что это TCP) — это номер порта, который он содержит.

Затем посмотрите в последнем столбце, вы увидите /. Затем выполните это:

Если это не сработает (вы можете проверить это, повторно запустив команду netstat). Сделайте это:

Вообще, по возможности лучше не отправлять SIGKILL. Вот почему я говорю вам попробовать kill перед kill -9 . Простое использование kill отправляет более щадящий SIGTERM.

Как я уже сказал, в этом случае для повторного открытия порта потребуется несколько минут. Я не знаю, как это ускорить. Если это сделает кто-то еще, я буду рад услышать об этом.

У меня есть вопросы по закрытию порта, я думаю, у меня есть некоторые странности.

Когда я использую выполнение

показывает, что порт 23/TCP открыт.

Но когда я выполняю

показывает, что порт 23/tcp закрыт.

Какое из них верно? Я хочу закрыть этот порт во всей системе, как мне это сделать?

оба они верны. Порты TCP не связаны с хостами. они связаны с сетевыми интерфейсами. разница тонкая, но важная. интерфейсы часто совпадают с хостами, но не всегда. в этом случае (как указано в ответах) localhost обращается к интерфейсу lo (loopback). IP-адрес обращается к вашему реальному интерфейсу, возможно, eth0 или wlan0 или что-то в этом роде.

5 ответов 5

Nmap — отличный сканер портов, но иногда вам нужно что-то более надежное. Вы можете узнать у ядра, какие процессы имеют открытые порты, используя утилиту netstat:

  • -t только TCP
  • -l Только прослушивание портов
  • -n Не искать имена служб и хостов, просто отображать номера
  • -p Показать информацию о процессе (требуются привилегии суперпользователя)

В этом случае мы видим, что sshd прослушивает порт 22 любого интерфейса ( 0.0.0.0 ), а cupsd прослушивает порт loopback ( 127.0.0.1 ) 631. Ваши выходные данные могут показать, что telnetd имеет локальный адрес 192.168.1.1:23 , что означает, что он не будет отвечать на соединения на петлевом адаптере (например, вы не можете использовать telnet 127.0.0.1 ).

Существуют и другие инструменты, которые отображают аналогичную информацию (например, lsof или /proc ), но netstat является наиболее широко доступным. Он работает даже в Windows ( netstat -anb ). Netstat BSD немного отличается: вместо этого вам придется использовать sockstat(1) для получения информации о процессе.

Получив идентификатор процесса и имя программы, вы можете найти процесс и убить его, если хотите закрыть порт. Для более точного контроля вы можете использовать брандмауэр (iptables в Linux), чтобы ограничить доступ только к определенным адресам. Возможно, вам потребуется отключить запуск службы. Если PID "-" в Linux, это, вероятно, процесс ядра (например, это обычное дело для NFS), так что удачи в выяснении, что это такое.

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

Как закрыть открытый сокет в Linux?

Закрытие сокета в запущенном процессе не невозможно, но сложно:

  1. найдите процесс: netstat -np. Вы получаете карту источника/назначения ip:port portstate pid/processname.
  2. найдите файловый дескриптор сокета в процессе lsof -np $pid. …
  3. Теперь подключите процесс: gdb -p $pid.
  4. Теперь закройте сокет:

Как закрыть порт 22 в Linux?

После того как пользователи ваших клиентов будут уведомлены об изменении порта (с TCP/22 на TCP/33001), вы можете отключить порт 22 в файле sshd_config. Чтобы отключить TCP/22 и использовать только TCP/33001, закомментируйте порт 22 в файле sshd_config.

Как закрыть порт в Ubuntu?

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

Можно ли закрыть все порты?

Если вы хотите закрыть открытый порт, вы можете сделать это с помощью брандмауэра Windows (брандмауэр Защитника Windows для Windows 10). Например, допустим, вы хотите закрыть порт 5500 для всех входящих подключений. … Откройте брандмауэр Windows, выбрав Пуск | Панель управления | Брандмауэр Windows.

Открытые порты — это плохо?

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

Как увидеть открытые порты в Linux?

Чтобы проверить прослушиваемые порты и приложения в Linux:

  1. Откройте терминальное приложение, например командную оболочку.
  2. Выполните любую из следующих команд в Linux, чтобы увидеть открытые порты: sudo lsof -i -P -n | grep СЛУШАТЬ. sudo netstat -tulpn | grep СЛУШАТЬ. …
  3. Для последней версии Linux используйте команду ss. Например, сс -tulw.

Как остановить прослушивание порта?

    Откройте cmd.exe (примечание: вам может потребоваться запустить его от имени администратора, но это не всегда необходимо), затем выполните следующую команду: netstat -ano | найтиstr :

Как проверить, открыт ли порт 8080 в Linux?

«linux проверить, открыт ли порт 8080» Код ответа

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

После того как пользователи ваших клиентов будут уведомлены об изменении порта (с TCP/22 на TCP/33001), вы можете отключить порт 22 в файле sshd_config. Чтобы отключить TCP/22 и использовать только TCP/33001, закомментируйте порт 22 в файле sshd_config.

Как открыть порт 80 в Linux?

Как открыть порт 80 (веб-сервер Apache) в Red Hat/CentOS/Fedora Linux? [/donotprint] Файл конфигурации по умолчанию для брандмауэра на основе iptables в RHEL / CentOS / Fedora Linux — /etc/sysconfig/iptables для брандмауэра на основе IPv4. Для брандмауэра на основе IPv6 вам необходимо отредактировать файл /etc/sysconfig/ip6tables.

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

Закрыть порт в IPtables — CentOS 7

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

Как остановить уже используемый порт 4200?

Как избежать ошибки «Порт 4200 уже используется» с помощью Angular-CLI…

Читайте также: