2010-04-06 03:39:57 +0000 2010-04-06 03:39:57 +0000
116
116

Вручную закрывая порт из командной строки

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

Есть ли в Linux возможность вручную закрыть порт?

NOTE: _Я узнал, что “только приложение, которому принадлежит подключенный сокет, должно закрыть его, что произойдет, когда приложение завершит свою работу. _

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

Ответы (13)

137
137
137
2013-11-01 01:43:00 +0000

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

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

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

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

  4. Закрыть сокет:

20
20
20
2012-02-13 08:44:54 +0000

Fuser также может быть использован

fuser -k -n *protocol portno*

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

fuser -k -n tcp 37

Дополнительная информация по адресу fuser man page

6
6
6
2010-04-06 09:38:15 +0000

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

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

Он в основном выполняет то, что вы хотите. При этом весь TCP-трафик будет сброшен на порт 80.

3
3
3
2010-04-06 03:45:53 +0000
netstat -anp | grep 80

Если вы используете apache, он должен сказать вам “httpd” (это просто пример, используйте порт, который ваше приложение использует вместо 80)

pkill -9 httpd

или

killall -9 httpd
2
2
2
2015-05-27 03:46:19 +0000

Сначала я искал процессы 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, и он должен снова работать.

2
2
2
2012-04-22 05:02:17 +0000

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

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

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

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

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

2
2
2
2015-04-23 06:06:09 +0000

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

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

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

1
1
1
2010-04-06 04:10:46 +0000

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

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

1
1
1
2015-07-29 02:25:58 +0000

Вы можете использовать команду с именем 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
1
1
1
2015-10-15 08:45:34 +0000

Я понимаю, что этот ответ, строго говоря, не дает ответа на сам вопрос, но чтение в нем может быть уместным:

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

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

1
1
1
2013-11-01 02:08:35 +0000

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

0
0
0
2016-03-30 10:02:54 +0000

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

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

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

0
0
0
2019-08-07 15:17:33 +0000

Вы можете закрыть прослушивающий сокет, используя ss :

sudo ss --kill state listening src :1234

Где 1234 - номер порта.

ss является частью пакета iproute2, так что есть сильное изменение, что он уже установлен на современном Linux.

я узнал об этом из a answer to a related question .

Похожие вопросы

6
10
5
37
8