Як закрити порти TCP та UDP через командний рядок Windows


160

Хтось знає, як закрити сокет TCP або UDP для єдиного з'єднання за допомогою командного рядка Windows?

Поглядаючи з цього приводу, я бачив, як люди запитують те саме. Але відповіді виглядали як сторінка вручну з netstat або netsh командами, зосереджена на тому, як слідкувати за портами. Я не хочу відповідей, як їх слідкувати (я вже це роблю). Я хочу їх закрити / вбити.

EDIT, для уточнення: Скажімо, мій сервер прослуховує порт TCP 80. Клієнт встановлює з'єднання і порт 56789 призначений для нього. Потім я виявляю, що це з'єднання небажане (наприклад, цей користувач робить погані речі, ми попросили їх припинити, але з'єднання не потрапило десь на шляху). Зазвичай я б додав брандмауер, щоб виконати цю роботу, але це зайняло б певний час, і я опинився в надзвичайній ситуації. Вбивство процесу, яким належить з'єднання, тут насправді погана ідея, оскільки це призведе до збиття сервера (усі користувачі втрачають функціональність, коли ми просто хочемо вибірково і тимчасово відмовитись від цього одного з'єднання).


1
Чому? Ви не можете закрити порти з командного рядка або файли. Ви повинні закрити програми, якими вони володіють. Або ви маєте на увазі операції брандмауера? Ваше питання залишається незрозумілим.
Маркіз Лорн

9
Я можу зрозуміти голосування проти. Але чому закривають голоси? Це питання є законним.
Віктор Стафуса

37
@EJP: Це справжнє запитання, оскільки я щось просив і очікував відповіді (навіть якщо відповідь була оманливою "ні, цього не можна робити"). І, я отримав відповідь, і я прийняв відповідь. Більше того, навіть ваша відповідь "Це неможливо зробити" є і вагомою відповіддю. Таким чином, це питання справедливе.
Віктор Стафуса

1
@EJP, будь ласка, не відповідайте так, у нас тут достатньо людей, які в тій чи іншій формі в основному кажуть "якби ви знали відповідь, не ставили б цього питання" - я впевнений, що ви можете побачити дурість того.
Крейда

Відповіді:


65

Так, це можливо. Щоб закрити сокет, вам не потрібно мати поточний процес. Подумайте на хвилину, що віддалена машина, мережева карта, мережевий кабель та ваша ОС можуть призвести до закриття розетки.

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

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

Існує принаймні одна програма ( CurrPorts ), яка робить саме це, і я використовував її сьогодні для закриття конкретних сокетів у процесі, який був запущений до запуску CurrPorts. Для цього потрібно, звичайно, запустити його як адміністратора.

Зауважте, що, мабуть, непросто змусити програму не слухати порту (ну, можливо, але ця можливість називається брандмауером ...), але я не думаю, що тут просили. Я вважаю, що питання "як я вибірково закрити одне активне з'єднання (сокет) до порту, який слухає моя програма?". Формулювання питання трохи не відповідає тому, що вказано номер порту для небажаного вхідного клієнтського з'єднання, і він позначався як "порт", але цілком зрозуміло, що це був посилання на той сокет, а не на порт прослуховування.


3
Так, CP - чудовий інструмент: CurrPorts.exe / close <Локальна адреса> <Локальний порт> <Віддалена адреса> <Віддалений порт> {Ім'я процесу} Це буде рядок: сервер CurrPorts.exe / close * 56789 * *. exe
JasonXA

CurrPorts, здається, не зможе закрити багатоканальні з'єднання UDP, що надходять із процесу
george_h

143
  1. відчинено cmd

    • введіть netstat -a -n -o

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

    • (Btw, kill [target_PID]не працювало для мене)

  2. CTRL + ALT + DELETE та виберіть "запустити менеджер завдань"

    • Перейдіть на вкладку «Процеси»

    • Увімкніть стовпчик "PID", перейшовши до: Перегляд> Вибрати стовпці> Поставте прапорець на PID

    • Знайдіть ПІД інтересу та "ЗАКРІТНИЙ ПРОЦЕС"

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


8
Що ви говорите, це просто вбити серверний процес і повторно його запустити, чого я хотів уникнути, оскільки це призведе до відключення кожного з'єднання з сервером, а не лише до небажаного.
Віктор Стафуса

7
Вибачте, що я не допомогла вирішити ваше конкретне питання. Я просто надавав свою відповідь, коли ваше запитання з'явилося, коли я гуглив, як просто закрити віконний порт, і думав, що це може бути корисним і для інших, які мали мою проблему. :)
HaoQi Li

2
@HaoQiLi, Ви не можете просто просто закінчити все і все. Наприклад, Systemпроцес, який обробляє мережеві з'єднання Windows.
Pacerier

2
@HaoQiLi, я думаю, щоб закрити, ми можемо використовувати taskkill /pid 6168 /f6168 pid
Madhawa Priyashantha

9
смішна ця відповідь має стільки відгуків, коли питання чітко заявляє ЄДИННЕ З'ЄДНАННЯ не весь процес !!!
Майк

59

Наприклад, ви хочете звільнити порт 8080 Потім виконайте ці команди.

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

Готово!


5
Дякую. Тільки ваше рішення мені допомогло.
vvator

1
Правильно, це допомагає фактично роздрукувати PID при спробі знайти PID. (Хто ці люди?).
Адріан М.

3
це також вбиває процес згаданого pid & не просто закриття порту.
NDestiny

1
Це корисно.
Турал Асгар

Я протестував на Windows 10, і він не вбиває TCP-з'єднання поодинці, а весь Процес або Нитка, використовуючи його. Як заявив Віктор, це не його мета.
Себастьян

53

Якщо ви знаєте порт, який ви хочете звільнити, ви можете сортувати свій список netstat, шукаючи вказаний порт таким чином:

netstat -ano | findstr :8080

Тоді під з’явиться на суглобі, який можна вбити за допомогою завдання.

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

taskkill/pid 11704 /F

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


Я протестував на Windows 10, і він не вбиває TCP-з'єднання поодинці, а весь Процес або Нитка, використовуючи його. Як заявив Віктор, це не його мета.
Себастьян

27

Використовуйте TCPView ( http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx ) або CurrPorts ( http://www.nirsoft.net/utils/cports.html ).

Крім того, якщо ви не хочете використовувати ЗОВНІШНЕ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ (ці інструменти до речі не потребують встановлення), ви можете просто ПЕРШЕ запустити команду netstat (бажано netstat -b) і потім встановити локальну політику безпеки для блокування IP адреса машини, про яку йдеться, саме це я робив із небажаними або навіть невідомими підключеннями - це дозволяє робити все БЕЗ БУДЬ-ЯКОГО ЗОВНІШНЬОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ (все поставляється з Windows) ...


2
Це правильна відповідь і повністю підтримується Microsoft.
Dan Bonachea

Працював і для мене. Я використав локальну політику безпеки -> Політика безпеки IPS на локальному комп'ютері. Інтерфейс користувача досить інтуїтивний.
Путердо Борато

1
Спробувавши це, тісний зв’язок виявляється сірим для ipv6, яка альтернатива закрити ipv6, якщо така є?
jjxtra

23

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


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

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


Він уточнив своє питання - це віддалені клієнтські розетки, які можна закрити іншими інструментами, як вказували інші. Ця відповідь здебільшого зосереджена на серверних сокетах, які не можуть (без обмацування всередині ОС). Це те, як чисто збити процес, що володіє серверним сокетом, і це те, що ви хочете зробити, якщо це порт. Але якщо у вас є багато вхідних підключень до вашого сервера, це вже інша ситуація, і ви, безумовно, можете вбити їх. Не помиляється просто не зовсім те, про що просив ОП.
кругляки

Вам слід видалити частину "вбити процес", оскільки це не відповідь на питання. Ви також можете зупинити мережевий адаптер, щоб зупинити трафік, але він все ще не вбиває сокет!
Себастьян

Відповідь правильна лише для 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.


3

Ви не можете закрити сокети на своєму сервері, не володіючи тими роз'ємами, отже, ви фактично не можете закрити сокет, не працюючи з кодом у процесі, яким належить серверний сокет.

Однак є й інший варіант, який спонукає клієнта закрити свою розетку. Якщо надіслати пакет RST TCP до порту, до якого підключається клієнт, клієнт перестане їх з'єднання. Це можна зробити за допомогою сканування RST за допомогою nmap.

http://nmap.org/


Це набагато краща відповідь, ніж ваша попередня відповідь! Дякую!
Себастьян


2

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



1

Для того, щоб закрити порт, ви могли ідентифікувати процес, який слухається на цьому порту, і вбити цей процес.


2
@Victor, я бачив це, але немає способу насильно закрити порт, не збиваючи процес. Інша можливість полягає в тому, щоб написати серверну програму таким чином, щоб у вас була якась панель управління, коли ви можете контролювати та адмініструвати клієнтів.
Дарин Димитров

1
Крім того, якщо інтерфейс, на якому прослуховується сокет, буде знято, сокет закриється.
rustyx

Я вважаю, що він просив прикладу.
EyoelD

@rustyx Дякую! Про це я думав, прочитавши всі відповіді на "вбити процес" ... але його відповідь - це лише пропозиція, тому для мене це нормально (але не вдала відповідь), інші відповіді - як би це не було.
Себастьян

1

ви можете використовувати таку програму, як tcpview від sysinternal. Я думаю, що це може допомогти вам як у моніторингу, так і вбивстві небажаного зв'язку.


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 на потрібний вам і додайте інші правила, якщо потрібно.


0

миттєва / здійсненна / часткова відповідь : https://stackoverflow.com/a/20130959/2584794

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


5
Це майже те саме, що відповідь Хаокі Лі. Це призведе до вбивства серверного процесу, припиняючи кожне з'єднання, а не лише небажане. Завдання полягає в тому, щоб кинути просто небажане і більше нічого.
Віктор Стафуса

Я згоден з Віктором. Це не відповідь на запитання. Тож ви також можете відключити мережевий адаптер ...
Себастьян

-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 - фільтр значень на основі якоїсь умови
  • Стоп-процес - TaskKillеквівалент PowerShell

Я протестував на Windows 10, і він не вбиває TCP-з'єднання поодинці, а весь Процес або Нитка, використовуючи його. Як заявив Віктор, це не його мета.
Себастьян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.