Как закрыть порты TCP и UDP через командную строку Windows - PullRequest
130 голосов
/ 31 декабря 2011

Кто-нибудь знает, как закрыть сокет TCP или UDP для одного соединения через командную строку Windows?

Гуглял по этому поводу, я видел, как некоторые люди спрашивали то же самое.Но ответы выглядели как справочная страница команд netstat или netsh, посвященных тому, как контролировать порты.Я не хочу ответов о том, как их контролировать (я уже делаю это).Я хочу закрыть / убить их.

РЕДАКТИРОВАТЬ, для пояснения: допустим, мой сервер прослушивает TCP-порт 80. Клиент устанавливает соединение, и для него выделен порт 56789.Затем я обнаружил, что это соединение нежелательно (например, этот пользователь делает плохие вещи, мы попросили его прекратить, но соединение не сбрасывалось где-то по пути).Обычно я бы добавил брандмауэр для выполнения этой работы, но это заняло бы некоторое время, и я попал в чрезвычайную ситуацию.Уничтожение процесса, которому принадлежит соединение, - это действительно плохая идея, потому что это приведет к отключению сервера (все пользователи потеряют функциональность, когда мы просто хотим выборочно и временно отключить это одно соединение).

Ответы [ 16 ]

120 голосов
/ 18 апреля 2013
  1. открыто cmd

    • введите netstat -a -n -o

    • найти TCP [the IP address]:[port number] .... #[target_PID]# (то же самое для UDP)

    • (кстати, kill [target_PID] у меня не работает)

  2. CTRL + ALT + DELETE и выберите «запустить диспетчер задач»

    • Нажмите на вкладку "Процессы"

    • Включите столбец «PID», перейдя в: Вид> Выбрать столбцы> Установите флажок для PID

    • Найдите интересующий PID и «КОНЕЦ ПРОЦЕССА»

  3. Теперь вы можете перезапустить сервер на [IP-адрес]: [номер порта] без проблем

57 голосов
/ 31 января 2013

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

Учтите также, что программное обеспечение Fiddler и Desktop VPN может вставлять себя в сетевой стек и отображать весь ваш трафик или перенаправлять весь трафик.

Таким образом, все, что вам действительно нужно, это либо для Windows предоставить API, который позволяет это напрямую, либо для того, чтобы кто-то написал программу, которая работает как VPN или Fiddler, и дает вам возможность закрыть сокеты, которые проходят через нее.

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

Обратите внимание, что, вероятно, нелегко заставить программу не прослушивать порт (ну, это возможно, но эта возможность называется брандмауэром ...), но я не думаю, что это было спросил здесь. Я считаю, что вопрос «как выборочно закрыть одно активное соединение (сокет) с портом, который слушает моя программа?». Формулировка вопроса немного неправильна, потому что указан номер порта для нежелательного входящего клиентского соединения, и он упоминался как «порт», но довольно ясно, что это была ссылка на этот один сокет, а не на прослушивающий порт.

39 голосов
/ 25 декабря 2016

Например, вы хотите освободить порт 8080. Затем выполните следующие команды.

 netstat -ano
 taskkill /f /im [PID of the port 8080 got from previous command]

Готово!

33 голосов
/ 24 марта 2018

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

netstat -ano | findstr :8080

Тогда на правой стороне появится пид, который можно убить с помощью taskkill.

enter image description here

taskkill/pid 11704 /F

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

23 голосов
/ 26 апреля 2012

Попробуйте использовать утилиты sysinternals / microsoft tcpview (gui) и Tcpvcon (командная строка)

22 голосов
/ 18 января 2014

Использовать TCPView (http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx) или CurrPorts (http://www.nirsoft.net/utils/cports.html).

В качестве альтернативы, если вы не хотите использовать ВНЕШНЕЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ (эти инструменты, кстати, не требуют установки), вы можете просто ПЕРВЫМ запустить команду netstat (предпочтительно netstat -b) и затем настроить локальную политику безопасности на заблокировать IP-адрес рассматриваемой машины пользователя, это то, что я делал с нежелательными или даже неизвестными соединениями - это позволяет вам делать все без какого-либо внешнего программного обеспечения (все идет с Windows) ...

6 голосов
/ 31 декабря 2011

Нельзя закрыть сокеты, не закрыв процесс, которому принадлежат эти сокеты. Сокеты принадлежат процессу, который их открыл.Итак, чтобы узнать идентификатор процесса (PID) для Unix / Linux.Используйте команду netstat следующим образом:

netstat -a -n -p -l

Это напечатает что-то вроде:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     PID/Program name   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN     1879/sendmail: acce 
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN     1860/xinetd         

Где -a печатает все сокеты, -n показывает номер порта, -p показывает PID, -l показывает только то, что слушает (это необязательно в зависимости от того, что вы ищете).

Реальная информация, которую вы хотите, это PID.Теперь мы можем остановить этот процесс, выполнив:

kill 1879

Если вы закрываете службу, лучше использовать:

service sendmail stop

Kill буквально убивает только этот процесс и всех его дочерних элементов.,При использовании команды service запускается сценарий завершения работы, зарегистрированный в каталоге init.d.Если вы используете kill для службы, она может не запуститься должным образом, потому что вы не выключили ее должным образом.Это зависит только от сервиса.

К сожалению, Mac отличается от Linux / Unix в этом отношении.Вы не можете использовать netstat.Прочтите этот учебник, если вы заинтересованы в Mac:

http://www.tech -recipes.com / rx / 227 / выяснить, какой процесс удерживает, какой сокет открыт / /

А если вы работаете в Windows, используйте TaskManager для уничтожения процессов и интерфейс служб для выключения служб.Вы можете использовать netstat в Windows, как Linux / Unix, чтобы идентифицировать PID.

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true

4 голосов
/ 18 января 2016

Используйте CurrPorts (это бесплатно и не требует установки): http://www.nirsoft.net/utils/cports.html

/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}

Примеры:

# Close all connections with remote port 80 and remote address 192.168.1.10: 
/close * * 192.168.1.10 80
# Close all connections with remote port 80 (for all remote addresses): 
/close * * * 80
# Close all connections to remote address 192.168.20.30: 
/close * * 192.168.20.30 *
# Close all connections with local port 80: 
/close * 80 * *
# Close all connections of Firefox with remote port 80: 
/close * * * 80 firefox.exe

Он также имеет приятный графический интерфейс с функциями поиска и фильтрации.

Примечание. Этот ответ является ответом и комментарием Хантхаро и JasonXA, которые объединены и упрощены, чтобы облегчить его чтение. Примеры взяты с веб-страницы CurrPorts.

3 голосов
/ 01 января 2012

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

Однако есть еще одна опция, которая говорит клиенту закрыть свой сокет. Отправка пакета RST TCP в порт, к которому подключается клиент, приведет к тому, что клиент прервет свое соединение. Вы можете сделать это с помощью сканирования RST, используя nmap.

http://nmap.org/

2 голосов
/ 14 февраля 2014

wkillcx - это надежный инструмент командной строки Windows для уничтожения соединений tcp из командной строки, который не был упомянут. Однако иногда возникают проблемы с серверами с большим количеством соединений. Иногда я использую tcpview для интерактивных убийств, но wkillcx можно использовать в сценариях.

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