Giết kết nối tcp trong linux


49

Tôi có một số kết nối chết trong một ứng dụng đang ở trạng thái treo nếu máy khách bị chết.

->192.168.1.214:49029 (ESTABLISHED)

Có cách nào để chấm dứt các tùy chọn này từ dòng lệnh linux mà không cần khởi động lại máy chủ không?

Sau khi tìm kiếm, tôi tìm thấy giải pháp được gọi là tcpkill. Nhưng nó sẽ không làm việc cho tôi. Vì nó chặn vĩnh viễn ip đó.


Câu trả lời về việc sử dụng sslệnh dễ dàng và tổng quát hơn nhiều so với những người khác.
nealmcb

Câu trả lời:


35

Ban đầu từ: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcizable-kill-estabaseed-tcp.html

Để "tiêu diệt" một ổ cắm, bạn phải gửi gói đặt lại TCP. Để gửi nó (và được phía bên kia chấp nhận), bạn phải biết số thứ tự TCP thực tế.

1) tcpkillPhương pháp đã được đề cập tìm hiểu số SEQ bằng cách đánh hơi thụ động trên mạng và chờ đợi các gói hợp lệ của kết nối này đến. Sau đó, nó sử dụng số SEQ đã học để gửi các gói RSET đến cả hai bên. Tuy nhiên, nếu kết nối không hoạt động / bị treo và không có luồng dữ liệu, nó sẽ không làm gì cả và sẽ đợi mãi.

2) Một phương thức khác sử dụng tập lệnh perl được gọi là killcx( liên kết đến Sourceforge ). Điều này chủ động gửi các gói tin giả mạo và tìm hiểu số SEQ từ câu trả lời. Sau đó nó sẽ gửi các gói RSET giống như tcpkill.

Cách tiếp cận khác (dựa trên những gì bạn muốn đạt được) là sử dụng gdbtrình gỡ lỗi để đính kèm vào một quy trình sở hữu ổ cắm / kết nối này và close()thay mặt phát hành tòa nhà - như chi tiết trong câu trả lời này .

Nếu bạn chỉ muốn xử lý các kết nối bị treo (phía bên kia đã chết), có nhiều thời gian chờ khác nhau (ví dụ như giữ TCP), sẽ tự động đóng các kết nối đó nếu được cấu hình đúng trên hệ thống.


Nó có hoạt động không nếu chúng ta chỉ cần đóng socket TCP bằng bộ mô tả tệp của nó (fd)? thực hiện fd> & -
Alexander Gonchiy

@AlexanderGonchiy cho các kết nối trực tiếp, nó sẽ ngăn quá trình phản hồi với các gói, vì vậy nó sẽ khiến kết nối hết thời gian chờ. Đối với các kết nối nhàn rỗi sẽ không có gì xảy ra. Tôi không chắc liệu kernel có gửi bất cứ thứ gì lên mạng khi đóng fd không.
Marki555

Tôi đã đánh hơi số thứ tự. Tôi nên làm cái gì sau đó?
dùng3132194

18

tcpkillcó thể làm điều đó cho bạn. Trong Ubuntu nó là trong dsniffgói.

Cái gì đó như:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(hoặc một số tcpdumpbiểu hiện khác giống như kết nối để giết).


4
Điều này chỉ hoạt động nếu kết nối đang truyền tải bất cứ điều gì. Nó sẽ không hoạt động đối với các kết nối TCP bị treo / không hoạt động (xem câu trả lời của tôi để biết chi tiết)
Marki555

17

Trên kernel linux> = 4.9, bạn có thể sử dụng sslệnh từ iproute2 bằng khóa-K

ss -K dst 192.168.1.214 dport = 49029

hạt nhân phải được biên dịch với CONFIG_INET_DIAG_DESTROYtùy chọn kích hoạt.


1
Đối với linux, đây thực sự là cách tốt nhất và gần như là cách duy nhất nếu bạn có kết nối nhàn rỗi ( tcpkillkhông thể hoạt động). Tuy nhiên, tôi thừa nhận rằng tôi đã không kiểm tra killcxnhưng có vẻ như rất nhiều phần mềm bảo mật sẽ ngăn điều đó hoạt động trừ khi bạn sửa đổi iptables của mình để cho phép các gói giả mạo này thông qua.
Seth Robertson

Cảm ơn! Hoạt động như một cơ duyên với sudo ss -K ....Ubuntu Bionic 18.04 LTS. Tôi đã có một tmuxquá trình bị kẹt ở kích thước màn hình nhỏ do một kết nối từ xa, nhưng đã chết, nhưng không hết thời gian. Tất cả đã được sửa!
nealmcb

6

Làm - như gốc netstat -tunp|grep 49029. Cột cuối cùng của đầu ra sẽ hiển thị cho bạn tên PID và chương trình của quá trình chịu trách nhiệm cho kết nối đó.

Nếu bạn may mắn, có một quy trình duy nhất cho kết nối đó.

Nếu bạn không may mắn, nó sẽ phức tạp hơn (PID chịu trách nhiệm nhiều hơn chỉ một kết nối đó). Đây là loại dịch vụ gì?

Tại sao bạn muốn chấm dứt phiên đó?


8
Tôi không thể giết quá trình đó. Đây là máy chủ gearman. Tôi muốn chỉ đóng kết nối.
Vivek Goel

0

tcpkillkhông thể đóng kết nối chết (treo). Nó dựa trên libpcap, nó xây dựng một gói để gửi FINgói. Nếu kết nối đã chết, nó không thể lấy đúng số thứ tự.

Cách duy nhất là đóng quá trình, vì vậy làm cho mọi nơi không phải là SPOF.

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.