WindowsコマンドラインでTCPおよびUDPポートを閉じる方法


160

誰かがWindowsコマンドラインを介して単一の接続のためにTCPまたはUDPソケットを閉じる方法を知っていますか?

これについてググって、何人かが同じことを尋ねるのを見ました。しかし、回答は、ポートの監視方法に焦点を当てたnetstatまたはnetshコマンドのマニュアルページのように見えました。それらを監視する方法についての回答は必要ありません(すでにこれを行っています)。それらを閉じたい/殺したい。

明確にするために編集:サーバーがTCPポート80をリッスンするとします。クライアントが接続を確立し、ポート56789が割り当てられます。その後、この接続が望ましくないことがわかりました(たとえば、このユーザーは悪いことをしているため、停止するように要求しましたが、途中で接続が切断されませんでした)。通常、ファイアウォールを追加して作業を行いますが、これには時間がかかり、緊急事態に陥りました。接続を所有するプロセスを強制終了することは、サーバーを停止させるため、ここでは本当に悪い考えです(この1つの接続を選択的かつ一時的にドロップしたい場合、すべてのユーザーは機能を失います)。


1
どうして?コマンドラインまたはファイルからポートを閉じることはできません。それらを所有するプログラムを閉じる必要があります。それとも、ファイアウォールの操作について言及していますか?あなたの質問は不明確なままです。
ローン侯爵、2011

9
反対票は理解できます。しかし、なぜ賛成票なのか?この質問は正当です。
Victor Stafusa 2012年

37
@EJP:私が何かを求めていて、答えを期待していたので、それは本当の質問です(たとえ答えが欺瞞的な「いいえ、あなたはそれを行うことができません」であったとしても)。そして、それは答えられ、私は答えを受け入れました。さらに、あなたの「それはできません」でさえも有効な答えです。したがって、この質問は有効です。
ビクタースタフサ、2012年

1
@EJPはそのように応答しないでください。ここには十分な数の人々がいます。基本的には、何らかの形で「答えを知っていれば、その質問はしない」と言います-愚かさを見ることができますその。
チョーキー2017

回答:


65

はい、可能です。ソケットを閉じるには、ソケットを所有している現在のプロセスである必要はありません。少しの間、リモートマシン、ネットワークカード、ネットワークケーブル、およびOSがソケットを閉じる可能性があることを考慮してください。

Fiddler and Desktop VPNソフトウェアがネットワークスタックに挿入され、すべてのトラフィックを表示したり、すべてのトラフィックを再ルーティングしたりできることも考慮してください。

したがって、本当に必要なのは、Windowsがこれを直接許可するAPIを提供するか、誰かがVPNまたはFiddlerのように動作し、それを通過するソケットを閉じる方法を提供するプログラムを作成することです。

これを正確に行う少なくとも1つのプログラム(CurrPorts)があり、今日はCurrPortsが開始される前に開始されたプロセスの特定のソケットを閉じる目的で使用しました。これを行うには、もちろん管理者として実行する必要があります。

プログラムがポートをリッスンしないようにすることはおそらく簡単ではないことに注意してください(まあ、それは可能ですが、その機能はファイアウォールと呼ばれます...)。私の質問は、「プログラムがリッスンしているポートへの1つのアクティブな接続(ソケット)を選択的に閉じるにはどうすればよいですか」だと思います。望ましくない受信クライアント接続のポート番号が示され、「ポート」と呼ばれていたため、質問の表現は少しずれていますが、リスニングポートではなく、その1つのソケットへの参照であったことは明らかです。


3
はい、CPは素晴らしいツールです。CurrPorts.exe/ close <ローカルアドレス> <ローカルポート> <リモートアドレス> <リモートポート> {プロセス名}これは、CurrPorts.exe / close * 56789 * *サーバーの行です。 exe
JasonXA 2014年

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 + Delキーを押して、「タスクマネージャの開始」を選択します

    • 「プロセス」タブをクリックします

    • 「PID」列を有効にするには、「表示」>「列を選択」>「PIDのチェックボックス」を選択します。

    • 目的のPIDと「END PROCESS」を見つける

  3. これで、[IPアドレス]:[ポート番号]でサーバーを問題なく再実行できます


8
あなたが言っているのは、サーバープロセスを強制終了して再実行することだけです。これは、不要な接続だけでなく、サーバーへのすべての接続をドロップするため、私が避けたかったことです。
Victor Stafusa 2013

7
申し訳ありませんが、あなたの特定の質問を解決する手助けはしませんでした。単にWindowsポートを閉じる方法を探しているときに質問が表示され、私の問題を抱えている他の人にも役立つと思いました。:)
HaoQi Li 2013

2
@HaoQiLi、あなたは単にすべてと何かを単に終わらせることはできません。たとえばSystem、Windowsネットワーク接続を処理するプロセス。
パチェリエ

2
私は、我々が使用することができます閉じることだと思う@HaoQiLi taskkill /pid 6168 /f6168は、PIDです
Madhawa Priyashantha

9
質問がプロセス全体ではなく単一の接続であると明確に述べている場合、この答えはばかげています。
Mike

59

たとえば、ポート8080を解放したい場合は、次のコマンドを実行します。

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

できた!


5
ありがとう。あなたの解決策だけが私を助けました。
vvator 2017年

1
そうです、PIDを見つけようとするときに、実際にPIDを出力するのに役立ちます。(これらの人々は誰ですか?)。
エイドリアンM.

3
これはまた、言及されたpidのプロセスを殺し、ポートを閉じるだけではありません。
NDestiny 2017

1
これは役に立ちます。
トゥラルAsgar

私はWindows 10でテストしましたが、TCP接続のみを殺すのではなく、それを使用するプロセス全体またはスレッドを殺します。ビクターが言ったように、それは彼の目標ではありません。
セバスチャン

53

解放するポートがわかっている場合は、次のように特定のポートを探してnetstatリストをソートできます。

netstat -ano | findstr :8080

次に、pidがtaskkillで殺せるリグに表示されます。

ここに画像の説明を入力してください

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 2014

私のためにも働いた。ローカルセキュリティポリシー->ローカルコンピュータのIPセキュリティポリシーを使用しました。UIは非常に直感的です。
プテルドボラート2017

1
これを試してみたところ、ipv6のクローズ接続がグレー表示されています。ipv6をクローズする代わりの方法は何ですか?
jjxtra

23

sysinternals / microsoftツールのtcpview(gui)とTcpvcon(コマンドライン)を試す


7

それらのソケットを所有するプロセスをシャットダウンせずにソケットを閉じることはできません。 ソケットは、それらを開いたプロセスによって所有されます。Unix / LinuxのプロセスID(PID)を見つけるには、次のように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

Killは文字通り、そのプロセスとそれが所有するすべての子を殺します。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を使用してプロセスを終了し、サービスUIを使用してサービスをシャットダウンします。Linux / Unixと同様にWindowsでnetstatを使用してPIDを識別できます。

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


他の人が指摘しているように、他のツールで閉じることができるリモートクライアントソケットについての質問を明確にしました。この回答は主に、(OS内をいじる必要がない)できないサーバーソケットに焦点を当てています。これは、サーバーソケットを所有するプロセスをクリーンに停止する方法です。これは、それがポートの場合に実行したい処理です。しかし、サーバーへの着信接続がたくさんあり、それが別の状況であり、それらを確実に停止できる場合。OPが要求していたことは間違いありません。
chubbsondubs 2015年

「プロセスを強制終了」の部分は質問に対する回答ではないため、削除する必要があります。Network-Adapterを停止してトラフィックを停止することもできますが、それでもソケットのみが強制終了されるわけではありません。
セバスチャン

回答は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

また、検索機能とフィルター機能を備えた素晴らしいGUIも備えています。

注:この回答はhuntharoであり、JasonXAの回答とコメントは、読みやすくするためにまとめて単純化しています。例はCurrPortsのWebページにあります。


3

これらのソケットを所有せずにサーバー上のソケットを閉じることはできないため、サーバーソケットを所有するプロセスでコードを実行しないと、実際にソケットを閉じることはできません。

ただし、クライアントにソケットを閉じるように指示する別のオプションがあります。クライアントが接続しているポートにRST TCPパケットを送信すると、クライアントは接続をドロップします。nmapを使用したRSTスキャンでそれを行うことができます。

http://nmap.org/


それはあなたの以前の答えよりもはるかに良い答えです!ありがとうございました!
セバスチャン


2

wkillcxは、言及されていないコマンドラインからTCP接続を強制終了するための信頼できるWindowsコマンドラインツールです。ただし、接続数の多いサーバーでは問題が発生することがあります。インタラクティブな強制終了にtcpviewを使用することもありますが、スクリプトでwkillcxを使用できます。



1

ポート閉じるには、このポートでリッスンしているプロセスを特定して、このプロセスを強制終了します。


2
@Victor、見ましたが、プロセスを停止せずにポートを強制的に閉じる方法はありません。もう1つの可能性は、クライアントを監視および管理できるときに、ある種のコントロールパネルを使用できるようにサーバープログラムを作成することです。
Darin Dimitrov、

1
また、ソケットがリッスンしているインターフェースがダウンすると、ソケットは閉じます。
rustyx 2015

彼は例を求めていたと思います。
EyoelD 2018

@rustyxありがとう!この「プロセスを殺す」の答えをすべて読んだ後、私はそれを考えました…しかし、彼の答えは提案にすぎないので、私にとっては大丈夫です(しかし、良い答えではありません)。他の答えは、それを行う方法がないようなものです。
セバスチャン

1

sysinternalのtcpviewなどのプログラムを使用できます。不要な接続の監視と強制終了の両方に役立つと思います。


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

instant / feasible / partial answerhttps : //stackoverflow.com/a/20130959/2584794

以前の回答とは異なり、netstat -a -o -nが信じられないほど長いリストで使用されていましたが、それらを使用するアプリケーションの名前なしで調べられましたポート


5
これはHaoQi Liの答えとほとんど同じです。これにより、不要な接続だけでなく、すべての接続をドロップするサーバープロセスが強制終了されます。課題は、不要なものだけをドロップし、それ以上はドロップしないことです。
Victor Stafusa 2013年

私はビクターに同意します。それは質問に対する答えではありません。したがって、ネットワークアダプターを無効にすることもできます...
Sebastian

-3

はい、TCPまたはUDPポートを閉じることができます。DOSにはコマンドがあります。

TASKKILL /f /pid 1234 

これがあなたのためにうまくいくことを願っています


私はWindows 10でテストしましたが、TCP接続のみを殺すのではなく、それを使用するプロセス全体またはスレッドを殺します。ビクターが言ったように、それは彼の目標ではありません。
セバスチャン

-3

上記のPowerShell v4がインストールされたWindows 8`Windows Server 2012以降で実行している場合は、以下のスクリプトを使用できます。これにより、ポートに関連付けられているプロセスが検出され、終了されます。

コード

#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 

ドキュメンテーション:


私はWindows 10でテストしましたが、TCP接続のみを殺すのではなく、それを使用するプロセス全体またはスレッドを殺します。ビクターが言ったように、それは彼の目標ではありません。
セバスチャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.