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

160

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

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

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

Виктор Стафуса
источник
1
Зачем? Вы не можете закрыть порты из командной строки или файлы либо. Вы должны закрыть программы, которые владеют ими. Или вы имеете в виду операции брандмауэра? Ваш вопрос остается неясным.
маркиз Лорн
9
Я могу понять голосование против. Но почему закрыли голоса? Этот вопрос правомерен.
Виктор Стафуса

Ответы:

65

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

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

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

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

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

huntharo
источник
3
Да, CP - замечательный инструмент: CurrPorts.exe / close <Локальный адрес> <Локальный порт> <Удаленный адрес> <Удаленный порт> {Имя процесса} Это будет строка: CurrPorts.exe / close * 56789 * * server. ехе
JasonXA
Похоже, что CurrPorts не может закрывать многоадресные UDP-соединения, исходящие от процесса
george_h
143
  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-адрес]: [номер порта]

HaoQi Li
источник
8
То, что вы говорите, это просто убить процесс сервера и запустить его заново, чего я хотел избежать, так как это приведет к разрыву любого соединения с сервером, а не только нежелательного.
Виктор Стафуса
7
Извините, я не помог решить ваш конкретный вопрос. Я просто предоставил свой ответ, поскольку ваш вопрос обнаружился, когда я гуглил, как просто закрыть порт Windows, и подумал, что это может быть полезно для других, у которых также была моя проблема. :)
HaoQi Li
2
@HaoQiLi, Вы не можете просто закончить все и ничего. Например, Systemпроцесс, который обрабатывает сетевые подключения Windows.
Pacerier
2
@HaoQiLi Я думаю, что закрыть, мы можем использовать taskkill /pid 6168 /f6168 - это pid
Мадхава Прияшанта
9
Смешно этот ответ имеет так много откликов, когда вопрос ясно утверждает, что ОДНО ПОДКЛЮЧЕНИЕ не весь процесс !!!
Майк
59

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

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

Готово!

Рахул
источник
5
Thanx. Только ваше решение помогло мне.
vvator
1
Правильно, это помогает фактически распечатать PID при попытке найти PID. (Кто эти люди?).
Адриан М.
3
это также убивает упомянутый процесс pid, а не просто закрывает порт.
NDestiny
1
Это полезно
Турал Асгар
Я проверил на Windows 10, и он не уничтожает только соединение TCP, но весь процесс или поток, использующий его. Как заявил Виктор, это не его цель.
Себастьян
54

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

netstat -ano | findstr :8080

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

введите описание изображения здесь

taskkill/pid 11704 /F

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

Фелипе Сентено
источник
Я проверил на Windows 10, и он не уничтожает только соединение TCP, но весь процесс или поток, использующий его. Как заявил Виктор, это не его цель.
Себастьян
27

Используйте TCPView: http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
или CurrPorts: https://www.nirsoft.net/utils/cports.html.

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

Vman
источник
2
Это правильный ответ, и полностью поддерживается Microsoft.
Дэн Боначея
У меня тоже сработало. Я использовал Local Security Policy -> IPSecurity Policies на локальном компьютере. Пользовательский интерфейс довольно интуитивно понятен.
Puterdo Borato
1
Пробовал это, закрытое соединение неактивно для ipv6, какова альтернатива закрытию ipv6, если таковая имеется?
jjxtra
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

chubbsondubs
источник
Он разъяснил свой вопрос, который касается удаленных клиентских сокетов, которые могут быть закрыты другими инструментами, как указали другие. Этот ответ в основном сосредоточен на серверных сокетах, которые не могут (без возни с внутри ОС). Вот как можно корректно завершить процесс, которому принадлежит сокет сервера, и это то, что вы хотите сделать, если это порт. Но если у вас много входящих соединений с вашим сервером, это другая ситуация, и вы определенно можете их убить. Это не так, просто не совсем то, о чем спрашивал ОП.
Chubbsondubs
Вы должны удалить часть «убить процесс», потому что это не ответ на вопрос. Вы также можете остановить сетевой адаптер, чтобы остановить трафик, но он все еще не убивает только сокет!
Себастьян
Ответ правильный только для ipv6, для ipv4 вы можете вызвать SetTcpEntry
jjxtra
5

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

qwertzguy
источник
3

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

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

http://nmap.org/

chubbsondubs
источник
Это гораздо лучший ответ, чем ваш предыдущий ответ! Спасибо!
Себастьян
2

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

user3310805
источник
1

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

Дарин димитров
источник
2
@Victor, я видел это, но нет никакого способа принудительно закрыть порт без остановки процесса. Другая возможность - написать серверную программу таким образом, чтобы у вас была какая-то панель управления, когда вы можете контролировать и администрировать клиентов.
Дарин Димитров
1
Кроме того, если интерфейс, на котором прослушивается сокет, будет закрыт, сокет закроется.
rustyx
Я полагаю, что он просил пример.
EyoelD
1

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

Mochan
источник
1

CurrPorts не работает для нас, и мы можем получить доступ к серверу только через ssh, так что нет TCPView. Мы также не могли убить процесс, чтобы не сбрасывать другие соединения. То, что мы в итоге сделали, и нам еще не предложили, было заблокировать соединение в брандмауэре Windows. Да, это заблокирует все соединения, которые соответствуют правилу, но в нашем случае было одно соединение (которое нас интересовало):

netsh advfirewall firewall add rule name="Conn hotfix" dir=out action=block protocol=T
CP remoteip=192.168.38.13

Замените IP тем, который вам нужен, и добавьте другие правила, если это необходимо.

afarah
источник
0

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

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

Anup
источник
5
Это почти то же самое, что и ответ HaoQi Li. Это убило бы процесс сервера, теряющий каждое соединение, а не только нежелательное. Задача состоит в том, чтобы отбросить только нежелательное и не более того.
Виктор Стафуса
Я согласен с Виктором. Это не ответ на вопрос. Таким образом, вы также можете отключить сетевой адаптер ...
Себастьян
-3

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

TASKKILL /f /pid 1234 

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

Биджай Будхатоки
источник
Я проверил на Windows 10, и он не уничтожает только соединение TCP, но весь процесс или поток, использующий его. Как заявил Виктор, это не его цель.
Себастьян,
-3

Если вы работаете в 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 - NetStatэквивалент PowerShell
  • Select-Object - извлечение определенных свойств из объекта / удаление дубликатов
  • Where-Object - Фильтр значений на основе некоторого условия
  • Stop-Process - TaskKillэквивалент PowerShell
JohnLBevan
источник
Я проверил на Windows 10, и он не уничтожает только соединение TCP, но весь процесс или поток, использующий его. Как заявил Виктор, это не его цель.
Себастьян