Ручное закрытие порта из командной строки

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

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

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

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

  • Как я могу предоставить доступ к записи для всех пользователей в Linux?
  • Как я могу установить CentOS 6 без gui?
  • Потерянное разрешение на использование команд sudo
  • Разрешения группы Linux не выполняются правильно.
  • Предотвращение разблокировки раздела на USB-накопителе в Linux
  • Ноутбук не загружается с обновлением ОЗУ
  • 13 Solutions collect form web for “Ручное закрытие порта из командной строки”

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

    1. Найдите процесс:

      netstat -np 

      Вы получаете source/destination ip:port portstate pid/processname

    2. Найти дескриптор файла сокета в процессе

       lsof -np $pid 

      Вы получаете список: имя процесса, pid, user, fileDescriptor, … строка подключения.

      Найдите соответствующий номер файлаDescriptor для соединения.

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

       gdb -p $pid 
    3. Теперь закройте сокет:

       call close($fileDescritor) //does not need ; at end. 

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

       quit 

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

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

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

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

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

     sudo netstat -ap | grep :<port_number> 

    Это выведет линию, соответствующую порту хранения процесса. Затем, посмотрите в последнем столбце, вы увидите /. Затем выполните следующее:

     kill <pid> 

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

     kill -9 <pid> 

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

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

    Также можно использовать фьюзер

     fuser -k -n *protocol portno* 

    Здесь протокол tcp / udp, а portno – номер, который вы хотите закрыть. Например

     fuser -k -n tcp 37 

    Дополнительная информация на странице справочника fuser

    Вы также можете использовать iptables:

     iptables -I INPUT -p tcp --dport 80 -j DROP 

    Он в основном выполняет то, что вы хотите. Это снизит весь трафик TCP до порта 80.

     netstat -anp | grep 80 

    Он должен сказать вам, что если вы используете apache, «httpd» (это всего лишь пример, используйте порт, который использует ваше приложение вместо 80)

     pkill -9 httpd 

    или

     killall -9 httpd 

    Вероятно, вы могли бы просто узнать, какой процесс открыл сокет, с которым связан порт, и убить этот процесс.

    Но вы должны понимать, что если этот процесс не имеет обработчика, который де-инициализирует все, что он использовал (открытые файлы, сокеты, вилки, вещи, которые могут задерживаться, если они не закрыты должным образом после завершения), тогда вы создали бы это Перетащить на производительность системы. Кроме того, сокет останется открытым до тех пор, пока ядро ​​не поймет, что процесс был убит. Это обычно занимает около минуты.

    Я полагаю, что лучшим вопросом будет вопрос: какой порт (принадлежащий тому процессу) вы хотите остановить?

    Если вы пытаетесь положить конец бэкдору или вирусу, который вы нашли, вы должны хотя бы узнать, какие данные идут назад и вперед, прежде чем вы его прекратите. (Wirehark хорош для этого) (И имя исполняемого файла процесса, чтобы вы могли его удалить и не допустить его перезагрузки), или, если это то, что вы установили (например, HTTPD или FTPD или что-то еще), тогда у вас должен быть доступ к Сам процесс.

    Обычно он будет иметь управляющую программу (HTTPD stop | start или something). Или, если это системная вещь, вы, вероятно, не должны с ней связываться. Во всяком случае, я думал, что, поскольку все остальные дают вам «как», я должен дать вам оговорки.

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

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

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

    Если вы хотите, чтобы ваш порт был выпущен раньше, вы должны установить следующее значение:

     echo 1 > /proc/sys/net/ipv4/tcp_fin_timeout 

    Установить его с 60 секунд (по умолчанию) на 1 секунду

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

    • синтаксис:
     killcx [dest_ip:dest_port] {interface} dest_ip : remote IP dest_port : remote port interface (optional) : network interface (eth0, lo etc). 
    • пример:
     killcx 120.121.122.123:1234 killcx 120.121.122.123:1234 eth0 

    Я знаю, что этот ответ не отвечает на сам вопрос, строго говоря, но, читая его, это может быть релевантной информацией:

    Поведение привязки сокета к порту (и адресу) по умолчанию заключается в том, что когда сокет закрывается внезапным завершением процесса, сокет будет оставаться в TIME_WAIT некоторое время. Это означает, что вы не можете сразу перевязать этот адрес / порт. Если вы разрабатываете систему через стандартный интерфейс сокетов BSD, вы можете (по крайней мере, до некоторой степени) управлять этим поведением с помощью опции SO_REUSEADDR. Это позволит вам снова подключиться к одному и тому же адресу / порту, если сокет находится в статусе TIME_WAIT. Тем не менее, один сокет на порт!

    Однако эту информацию следует использовать только как помощь в целях развития, поскольку существует причина, по которой TIME_WAIT существует, в первую очередь, уже объясненная в других ответах.

    Сначала я искал процессы mongo и node, а затем сделал следующее:

     ps -A | grep node 10418 pts/23 00:00:05 node 10551 pts/23 00:00:00 node ps -A | grep mongo 10490 pts/23 00:00:00 mongod 

    После идентификации просто уничтожьте процессы командой kill.

     kill -9 10418 kill -9 10490 

    Наконец, введите meteor и он должен снова работать.

    Если вам не нужен трафик через сокет, но вы хотите сохранить этот процесс: tcpkill .

     tcpkill -i eth0 host xxx.xxx.xxx.xxx and port yyyy 

    Запустит демона sniffing, который перехватывает и уничтожает весь трафик на этом порту. Очень удобно тестировать ваши приложения для разделения сети.

    Давайте будем гением компьютера.