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

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

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

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

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 -АНО
  • 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, ища порт specif следующим образом:

netstat -ano | findstr :8080

затем пид появится в правой стороне, который можно убить с 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 для уничтожения процессов и служб UI для выключения служб. Вы можете использовать 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

он также имеет хороший GUI С функциями поиска и фильтрации.

Примечание: этот ответ хунтаро и 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 

документы:


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

TASKKILL /f /pid 1234 

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