Как закрыть порты TCP и UDP через командную строку Windows

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

  • открыть cmd

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

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

    • (Btw, kill [target_PID] не работает для меня)

  • CTRL + ALT + DELETE и выберите "запустить диспетчер задач"

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

    • Включите столбец "PID", выбрав "Вид" > "Выбор столбцов" > "Установите флажок для PID

    • Найдите интересующий PID и "END PROCESS"

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

Ответ 3

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

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

Готово!

Ответ 4

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

netstat -ano | findstr :8080

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

enter image description here

taskkill/pid 11704 /F

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Вы не можете закрыть сокеты, не закрыв процесс, которому принадлежат эти сокеты. Сокеты принадлежат процессу, который их открыл. Итак, чтобы узнать идентификатор процесса (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

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

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

http://www.tech-recipes.com/rx/227/find-out-which-process-is-holding-which-socket-open/

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

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

Ответ 8

Использовать 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

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

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

Ответ 9

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

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

http://nmap.org/

Ответ 10

Я нашел правильный ответ на этот вопрос. Попробуйте TCPView от Sysinternals, теперь принадлежащего Microsoft. Вы можете найти его на http://technet.microsoft.com/en-us/sysinternals/bb897437

Ответ 11

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

Ответ 12

Чтобы закрыть порт, вы можете определить процесс, который прослушивает этот порт, и убить этот процесс.

Ответ 13

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

Ответ 14

мгновенный/возможный/частичный ответ: fooobar.com/questions/63391/...

в отличие от предыдущего ответа, когда netstat -a -o -n использовался невероятно длинный список, нужно было просматривать без имени приложения, используя эти порты

Ответ 15

Если вы запускаете на Windows 8, Windows Server 2012 или выше с PowerShell v4 выше установленного, вы можете использовать ниже script. Это находит процессы, связанные с портом, и завершает их.

код

#which port do you want to kill
[int]$portOfInterest = 80

#fetch the process ids related to this port
[int[]]$processId = Get-NetTCPConnection -LocalPort $portOfInterest | 
    Select-Object -ExpandProperty OwningProcess -Unique | 
    Where-Object {$_ -gt 0} 

#kill those processes
Stop-Process -Id $processId 

Документация:

  • Get-NetTCPConnection - эквивалент PowerShell NetStat
  • Select-Object - отбросить определенные свойства из объекта/удалить дубликаты
  • Where-Object - значения фильтра на основе некоторого условия
  • Stop-Process - эквивалент PowerShell TaskKill

Ответ 16

Да есть возможность закрыть TCP или UDP порт есть команда в DOS

TASKKILL /f /pid 1234 

Я надеюсь, что это будет работать для вас