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


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

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

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

16 105

16 ответов:

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

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

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

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

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

  1. открыть cmd

    • тип netstat -a -n -o

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

    • (кстати, kill [target_PID] у меня не получилось)

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

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

    • включить столбец "PID", выбрав: вид > выбрать столбцы > установите флажок для ПИД

    • найдите интересующий PID и "завершите процесс"

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

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

  • netstat-ano
  • taskkill /f / im [pid порта 8080 получен из предыдущей команды]

готово!

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

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

кроме того, если вы не хотите использовать внешнее программное обеспечение (эти инструменты, кстати, не требуют установки), вы можете просто сначала запустить команду netstat (предпочтительно netstat-b ) , а затем Настроить локальную политику безопасности, чтобы заблокировать IP-адрес машины пользователя, о которой идет речь, вот что я был делать с нежелательными или даже неизвестными соединениями-это позволяет вам делать все без какого-либо внешнего программного обеспечения (все поставляется с Windows)...

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

netstat -ano | findstr :8080

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

enter image description here

taskkill/pid 11704 /F

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

вы не можете закрыть сокеты без выключения процесса, который владеет этими сокетами. сокеты принадлежат процессу, который их открыл. Таким образом, чтобы узнать идентификатор процесса (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.каталог д'. Если вы используете 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 для идентификации ПИД-РЕГУЛЯТОР.

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

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

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

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

используйте 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.

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

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

http://nmap.org/

мгновенный / выполнимый / частичный ответ : https://stackoverflow.com/a/20130959/2584794

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

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

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

код

#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 - вытянуть определенные свойства из объекта / удалить дубликаты
  • Где-Объект - значение фильтра на основе некоторого условия
  • Stop-Process - PowerShell TaskKill эквивалентно

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

TASKKILL /f /pid 1234 

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