Cách đóng cổng TCP và UDP thông qua dòng lệnh windows


160

Có ai biết cách đóng socket TCP hoặc UDP cho một kết nối thông qua dòng lệnh windows không?

Googling về điều này, tôi thấy một số người hỏi điều tương tự. Nhưng các câu trả lời trông giống như một trang thủ công của các lệnh netstat hoặc Netsh tập trung vào cách giám sát các cổng. Tôi không muốn câu trả lời về cách giám sát chúng (tôi đã làm điều này). Tôi muốn đóng / giết chúng.

EDIT, để làm rõ: Giả sử máy chủ của tôi lắng nghe cổng TCP 80. Một khách hàng tạo kết nối và cổng 56789 được phân bổ cho nó. Sau đó, tôi phát hiện ra rằng kết nối này là không mong muốn (ví dụ: người dùng này đang làm điều xấu, chúng tôi đã yêu cầu họ dừng lại nhưng kết nối không bị mất ở đâu đó trên đường đi). Thông thường, tôi sẽ thêm một tường lửa để thực hiện công việc, nhưng điều này sẽ mất một thời gian và tôi đang ở trong tình huống khẩn cấp. Giết quá trình sở hữu kết nối thực sự là một ý tưởng tồi ở đây vì điều này sẽ làm mất máy chủ (tất cả người dùng sẽ mất chức năng khi chúng tôi chỉ muốn bỏ chọn một cách tạm thời và tạm thời kết nối này).


1
Tại sao? Bạn không thể đóng cổng từ dòng lệnh hoặc tệp. Bạn phải đóng các chương trình sở hữu chúng. Hay bạn đang đề cập đến các hoạt động tường lửa? Câu hỏi của bạn vẫn chưa rõ ràng.
Hầu tước Lorne

9
Tôi có thể hiểu phiếu bầu xuống. Nhưng tại sao phiếu bầu chặt chẽ? Câu hỏi này là hợp pháp.
Victor Stafusa

37
@EJP: Đó là một câu hỏi thực sự, vì tôi đã hỏi một điều gì đó và đang mong đợi một câu trả lời (ngay cả khi câu trả lời là một câu "không, bạn không thể làm điều đó"). Và, nó đã được trả lời và tôi chấp nhận một câu trả lời. Hơn nữa, ngay cả "Nó không thể được thực hiện" cũng là một câu trả lời hợp lệ. Vì vậy, câu hỏi này là hợp lệ.
Victor Stafusa

1
@EJP xin đừng trả lời như vậy, chúng tôi có đủ người ở đây, người này, dưới hình thức này hay hình thức khác, về cơ bản hãy nói 'nếu bạn biết câu trả lời bạn sẽ không hỏi câu hỏi đó' - Tôi chắc chắn bạn có thể thấy sự điên rồ điều đó
Phấn

Câu trả lời:


65

Vâng, điều này là có thể. Bạn không phải là quá trình hiện tại sở hữu ổ cắm để đóng nó. Hãy xem xét một lúc rằng máy từ xa, card mạng, cáp mạng và HĐH của bạn đều có thể khiến ổ cắm đóng lại.

Cũng xem xét rằng phần mềm Fiddler và Desktop VPN có thể tự chèn vào ngăn xếp mạng và hiển thị cho bạn tất cả lưu lượng truy cập của bạn hoặc định tuyến lại tất cả lưu lượng truy cập của bạn.

Vì vậy, tất cả những gì bạn thực sự cần là cho Windows để cung cấp API cho phép điều này trực tiếp hoặc cho ai đó đã viết một chương trình hoạt động giống như VPN hoặc Fiddler và cung cấp cho bạn cách đóng các ổ cắm đi qua nó.

Có ít nhất một chương trình ( CurrPorts ) thực hiện chính xác điều này và tôi đã sử dụng nó ngày hôm nay cho mục đích đóng các ổ cắm cụ thể trên một quy trình đã được bắt đầu trước khi CurrPorts được bắt đầu. Để làm điều này, bạn phải chạy nó như là quản trị viên, tất nhiên.

Lưu ý rằng có thể không dễ dàng khiến chương trình không nghe trên cổng (tốt, có thể nhưng khả năng đó được gọi là tường lửa ...), nhưng tôi không nghĩ rằng điều đó được hỏi ở đây. Tôi tin rằng câu hỏi là "làm thế nào để tôi chọn lọc đóng một kết nối hoạt động (ổ cắm) với cổng mà chương trình của tôi đang nghe?". Từ ngữ của câu hỏi hơi sai vì số cổng cho kết nối máy khách không mong muốn được đưa ra và nó được gọi là "cổng" nhưng khá rõ ràng đó là một tham chiếu đến một ổ cắm đó chứ không phải cổng nghe.


3
Có, CP là một công cụ tuyệt vời: CurrPorts.exe / đóng <Địa chỉ cục bộ> <Cổng cục bộ> <Địa chỉ từ xa> <Cổng từ xa> {Tên quy trình} Đây sẽ là dòng: Máy chủ CurrPorts.exe / đóng * 56789 * *. exe
JasonXA

Các CurrPort dường như không thể đóng các kết nối phát đa hướng UDP đến từ một quá trình
george_h

143
  1. mở cmd

    • gõ vào netstat -a -n -o

    • tìm TCP [the IP address]:[port number] .... #[target_PID]#(ditto cho UDP)

    • (Btw, kill [target_PID]không làm việc cho tôi)

  2. CTRL + ALT + XÓA và chọn "bắt đầu quản lý tác vụ"

    • Nhấp vào tab "Quy trình"

    • Bật cột "PID" bằng cách đi tới: Xem> Chọn Cột> Chọn hộp cho PID

    • Tìm PID quan tâm và "QUY TRÌNH KẾT THÚC"

  3. Bây giờ bạn có thể chạy lại máy chủ trên [địa chỉ IP]: [số cổng] mà không gặp vấn đề gì


8
Những gì bạn đang nói chỉ là để giết tiến trình máy chủ và chạy lại nó, đó là điều mà tôi muốn tránh, vì điều này sẽ làm mất mọi kết nối đến máy chủ, không chỉ là kết nối không mong muốn.
Victor Stafusa

7
Xin lỗi tôi đã không giúp giải quyết câu hỏi cụ thể của bạn. Tôi chỉ đưa ra câu trả lời của mình khi câu hỏi của bạn xuất hiện khi tôi đang loay hoay làm thế nào để đơn giản đóng một cổng windows và nghĩ rằng nó cũng hữu ích cho những người khác cũng có vấn đề của tôi. :)
HaoQi Li

2
@HaoQiLi, Bạn không thể đơn giản kết thúc mọi thứ và mọi thứ. Ví dụ, Systemquá trình xử lý các kết nối mạng windows.
Pacerier

2
@HaoQiLi tôi nghĩ để đóng chúng ta có thể sử dụng taskkill /pid 6168 /f6168 là pid
Madhawa Priyashantha

9
nực cười câu trả lời này có quá nhiều câu hỏi khi câu hỏi nêu rõ KẾT NỐI SINGLE không phải toàn bộ quá trình !!!
Mike

59

Chẳng hạn, bạn muốn giải phóng cổng 8080 Sau đó, hãy làm theo các lệnh sau.

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

Làm xong!


5
Thanx. Chỉ có giải pháp của bạn giúp tôi.
vvator

1
Đúng vậy, nó thực sự giúp in ra PID khi cố gắng xác định vị trí của PID. (Những người này là ai?).
Adrian M.

3
điều này cũng đang giết chết quá trình pid được đề cập & không chỉ đóng cổng.
NDestiny

1
Điều này rất hữu ích.
Tural Asgar

Tôi đã thử nghiệm trên Windows 10 và nó không chỉ giết chết Kết nối TCP mà là toàn bộ Quá trình hoặc Chủ đề sử dụng nó. Như Victor nói rằng đó không phải là mục tiêu của anh ấy.
Sebastian

53

Nếu bạn biết cổng mà bạn muốn giải phóng, bạn có thể sắp xếp danh sách netstat của mình bằng cách tìm cổng cụ thể như thế này:

netstat -ano | findstr :8080

Sau đó, pid sẽ xuất hiện ở giàn mà bạn có thể giết bằng taskkill.

nhập mô tả hình ảnh ở đây

taskkill/pid 11704 /F

Ngoài ra, bạn có thể muốn xem câu hỏi này dành riêng cho localhost, nhưng tôi nghĩ nó có liên quan:


Tôi đã thử nghiệm trên Windows 10 và nó không chỉ giết chết Kết nối TCP mà là toàn bộ Quá trình hoặc Chủ đề sử dụng nó. Như Victor nói rằng đó không phải là mục tiêu của anh ấy.
Sebastian

27

Sử dụng TCPView ( http://technet.microsoft.com/en-us/sysiternals/bb897437.aspx ) hoặc CurrPorts ( http://www.nirsoft.net/utils/cports.html ).

Ngoài ra, nếu bạn không muốn sử dụng PHẦN MỀM EXTERNAL (các công cụ này không yêu cầu cài đặt bằng cách này), bạn chỉ cần FIRST chạy lệnh netstat (tốt nhất là netstat -b) và sau đó thiết lập Chính sách bảo mật cục bộ để chặn IP địa chỉ của máy người dùng đang nghi vấn, đó là những gì tôi đã làm với các kết nối không mong muốn hoặc thậm chí không xác định - cho phép bạn thực hiện mọi thứ mà KHÔNG CÓ BẤT K SOFT PHẦN MỀM NÀO (mọi thứ đều có trong Windows) ...


2
Đây là câu trả lời đúng và được Microsoft hỗ trợ đầy đủ.
Dan Bonachea

Làm việc cho tôi là tốt. Tôi đã sử dụng Chính sách bảo mật cục bộ -> Chính sách bảo mật trên máy tính cục bộ. UI khá trực quan.
Puterdo Borato

1
Đã thử điều này, kết nối chặt chẽ bị mờ đi cho ipv6, đâu là sự thay thế để đóng ipv6 nếu có?
jjxtra

23

Hãy thử công cụ sysiternals / microsoft tcpview (gui) và Tcpvcon (dòng lệnh)


7

Bạn không thể đóng các ổ cắm mà không tắt quá trình sở hữu các ổ cắm đó. Ổ cắm được sở hữu bởi quá trình mở chúng. Vì vậy, để tìm ra ID tiến trình (PID) cho Unix / Linux. Sử dụng netstat như vậy:

netstat -a -n -p -l

Điều đó sẽ in một cái gì đó như:

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         

Trong đó -a in tất cả các ổ cắm, -n hiển thị số cổng, -p hiển thị PID, -l chỉ hiển thị những gì đang nghe (đây là tùy chọn tùy thuộc vào những gì bạn đang theo dõi).

Thông tin thực sự bạn muốn là PID. Bây giờ chúng ta có thể tắt quá trình đó bằng cách thực hiện:

kill 1879

Nếu bạn đang tắt dịch vụ, tốt hơn hết là sử dụng:

service sendmail stop

Giết theo đúng nghĩa đen giết chết quá trình đó và bất kỳ đứa trẻ nào nó sở hữu. Sử dụng lệnh dịch vụ chạy tập lệnh tắt máy đã đăng ký trong thư mục init.d. Nếu bạn sử dụng kill trên một dịch vụ, nó có thể không khởi động lại đúng cách vì bạn đã không tắt nó đúng cách. Nó chỉ phụ thuộc vào dịch vụ.

Thật không may, Mac khác với Linux / Unix về mặt này. Bạn không thể sử dụng netstat. Đọc hướng dẫn này nếu bạn quan tâm đến Mac:

http://www.tech-recipes.com/rx/227/find-out-which- Process-is-Holding-who-sale-open /

Và nếu bạn đang ở trên Windows, hãy sử dụng Trình quản lý tác vụ để hủy các tiến trình và giao diện người dùng dịch vụ để tắt các dịch vụ. Bạn có thể sử dụng netstat trên Windows giống như Linux / Unix để xác định PID.

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


Anh ấy đã làm rõ về câu hỏi của anh ấy là ổ cắm máy khách từ xa có thể được đóng bằng các công cụ khác như những người khác đã chỉ ra. Câu trả lời này chủ yếu tập trung vào các socket máy chủ không thể (mà không phải loay hoay bên trong HĐH). Đây là cách làm sạch một quy trình sở hữu ổ cắm máy chủ, đây là điều bạn muốn làm nếu đó là cổng. Nhưng, nếu bạn có nhiều kết nối đến máy chủ thì đó là một tình huống khác và bạn chắc chắn có thể giết chết các kết nối đó. Nó không sai chỉ là những gì OP yêu cầu.
chubbsondub

Bạn nên loại bỏ phần "giết quá trình", vì nó không phải là câu trả lời cho câu hỏi. Bạn cũng có thể dừng Bộ điều hợp mạng để dừng Lưu lượng nhưng nó vẫn không chỉ giết Ổ cắm!
Sebastian

Câu trả lời chỉ đúng với ipv6, đối với ipv4, bạn có thể gọi SetTcpEntry
jjxtra

5

Sử dụng CurrPorts (miễn phí và không cần cài đặt): http://www.nirsoft.net/utils/cports.html

/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}

Ví dụ:

# 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

Nó cũng có một GUI đẹp với các tính năng tìm kiếm và lọc.

Lưu ý: Câu trả lời này là câu trả lời và bình luận của huntharo và JasonXA được đặt cùng nhau và đơn giản hóa để giúp người đọc dễ dàng hơn. Ví dụ đến từ trang web của CurrPorts.


3

Bạn không thể đóng ổ cắm trên máy chủ của mình mà không sở hữu các ổ cắm đó do đó bạn thực sự không thể đóng ổ cắm mà không có mã đang chạy trong quy trình sở hữu ổ cắm máy chủ.

Tuy nhiên, có một tùy chọn khác là bảo khách hàng đóng ổ cắm của nó. Gửi một gói RST TCP đến cổng mà máy khách đang kết nối sẽ khiến máy khách bị mất kết nối. Bạn có thể làm điều đó với quét RST bằng nmap.

http://nmap.org/


Đó là một câu trả lời tốt hơn nhiều so với câu trả lời trước đó của bạn! Cảm ơn bạn!
Sebastian


2

wkillcx là một công cụ dòng lệnh windows đáng tin cậy để giết các kết nối tcp từ dòng lệnh chưa được đề cập. Nó đôi khi có vấn đề với các máy chủ có số lượng lớn kết nối. Đôi khi tôi sử dụng tcpview cho kills tương tác nhưng wkillcx có thể được sử dụng trong các tập lệnh.



1

Để đóng cổng, bạn có thể xác định quy trình đang lắng nghe trên cổng này và hủy quy trình này.


2
@Victor, tôi đã thấy nó nhưng không có cách nào buộc phải đóng một cổng mà không làm giảm quá trình. Một khả năng khác là viết chương trình máy chủ theo cách mà bạn có một số loại bảng điều khiển khi bạn có thể giám sát và quản trị máy khách.
Darin Dimitrov

1
Ngoài ra, nếu giao diện mà ổ cắm đang lắng nghe được đưa xuống, ổ cắm sẽ đóng lại.
rustyx

Tôi tin rằng anh ấy đã yêu cầu một ví dụ.
EyoelD

@rustyx Cảm ơn! Đó là những gì tôi nghĩ sau khi đọc tất cả câu trả lời "giết quá trình" này, nhưng câu trả lời của anh ta chỉ là một gợi ý nên tôi không sao (nhưng không phải là một câu trả lời hay), những câu trả lời khác giống như không có cách nào để làm điều đó.
Sebastian

1

bạn có thể sử dụng chương trình như tcpview từ sysiternal. Tôi đoán nó có thể giúp bạn rất nhiều trong cả việc theo dõi và giết chết kết nối không mong muốn.


1

CurrPorts không hoạt động với chúng tôi và chúng tôi chỉ có thể truy cập máy chủ thông qua ssh, vì vậy cũng không có TCPView. Chúng tôi cũng không thể giết quá trình, để không bỏ các kết nối khác. Điều cuối cùng chúng tôi làm và chưa được đề xuất là chặn kết nối trên Tường lửa của Windows. Có, điều này sẽ chặn tất cả các kết nối phù hợp với quy tắc, nhưng trong trường hợp của chúng tôi, có một kết nối duy nhất (kết nối chúng tôi quan tâm):

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

Thay thế IP bằng cái bạn cần và thêm các quy tắc khác nếu cần.


0

câu trả lời tức thì / khả thi / một phần : https://stackoverflow.com/a/20130959/2584794

không giống như câu trả lời trước đó, trong đó netstat -a -o -n đã được sử dụng danh sách dài vô cùng được xem xét mà không có tên ứng dụng sử dụng cổng


5
Điều này gần giống với câu trả lời của HaoQi Li. Điều này sẽ giết quá trình máy chủ bỏ mọi kết nối, và không chỉ kết nối không mong muốn. Thách thức là bỏ chỉ một người không mong muốn và không có gì hơn.
Victor Stafusa

Tôi đồng ý với Victor. Đó không phải là câu trả lời cho câu hỏi. Vì vậy, bạn cũng có thể vô hiệu hóa Bộ điều hợp mạng ...
Sebastian

-3

Có, có thể đóng cổng TCP hoặc UDP, có một lệnh trong DOS

TASKKILL /f /pid 1234 

Tôi hy vọng điều này sẽ làm việc cho bạn


Tôi đã thử nghiệm trên Windows 10 và nó không chỉ giết chết Kết nối TCP mà là toàn bộ Quá trình hoặc Chủ đề sử dụng nó. Như Victor nói rằng đó không phải là mục tiêu của anh ấy.
Sebastian

-3

Nếu bạn đang chạy trên Windows 8, `Windows Server 2012 trở lên với PowerShell v4 được cài đặt ở trên, bạn có thể sử dụng tập lệnh bên dưới. Điều này tìm thấy các quy trình liên quan đến cổng và chấm dứt chúng.

#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 

Tài liệu:


Tôi đã thử nghiệm trên Windows 10 và nó không chỉ giết chết Kết nối TCP mà là toàn bộ Quá trình hoặc Chủ đề sử dụng nó. Như Victor nói rằng đó không phải là mục tiêu của anh ấy.
Sebastian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.