Kiệt sức cổng mạng Linux


10

Tôi đã thực hiện nhiều nghiên cứu nhất có thể về vấn đề này mà không cần đào ngay nguồn nhân. Dường như có một lượng lớn thông tin sai lệch / thông tin không chính xác về chủ đề này, vì vậy tôi hy vọng điều này sẽ trả lời câu hỏi cho tôi và những người khác một lần và mãi mãi.

Nói đúng với IPv4, việc cạn kiệt cổng có thực sự khả thi? Hãy để tôi giải thích:

  • Dường như có 65535 cổng có sẵn để sử dụng. 0 không có sẵn.
  • Tôi đã đọc rằng sự cạn kiệt cổng yêu cầu tuple (src ip, src port, dst ip, dst port) là duy nhất.
  • Để rõ ràng và giả sử tôi có thể sử dụng 100% các cổng phù du thông qua cài đặt sysctl net.ipv4.ip_local_port_range

Và đây là câu hỏi: Đây có phải là cách nó hoạt động?

  • Tôi có thể có 65k kết nối từ 127.0.0.1:(x) đến 127.0.0.1:80
  • Tôi có thể có 65k kết nối từ 127.0.0.1:(x) đến 127.0.0.1:555
  • Về cơ bản một lần nữa, câu hỏi là (srcip, srcport, dstip, dstport) phải là duy nhất, đúng không?
  • Tôi không thể mở hơn 65k kết nối từ ip "A" đến IP "B", Cổng "N"
  • Tương tự, một IP duy nhất không thể mở hơn 65 nghìn kết nối đến máy chủ web của tôi tại xxxx: 80, tuy nhiên tôi có thể hỗ trợ nhiều hơn 65 nghìn tổng thể miễn là chúng đến từ các IP nguồn khác nhau ?

Cuối cùng, tôi hơi bối rối về các cổng phù du (gửi đi) và các cổng đến đang lắng nghe. Tôi nhận ra rằng một khi kết nối được thiết lập, mỗi bên của kết nối là ngang hàng và bằng nhau, nhưng trước khi điều đó xảy ra:

Ví dụ: nếu thực sự bộ tuple (srcip, srcport, dstip, dstport) phải là duy nhất, thì tại sao tôi lại bật nó

net.ipv4.ip_local_port_range = 1024 65535

Cho phép sử dụng các cổng phù du từ 1024-65535, nếu tôi có các dịch vụ liên kết trên cổng 3306 (ví dụ myQuery), đôi khi chúng sẽ không khởi động được vì cổng đang được sử dụng.

Điều này có liên quan đến thực tế rằng: (Và đây là một tuyên bố tôi đang yêu cầu được xác nhận):

  • (srcip, srcport, dstip, dstport) là duy nhất cho mỗi kết nối với phạm vi cổng 1-65535 (không chú ý đến việc sử dụng cổng phù du của HĐH)
  • Tuy nhiên, để một ổ cắm liên kết, nó có thể được xem là (srcip, srcport, *, *). Hoặc một cách khác để đặt điều này, là IP không được sử dụng cổng đó vì bất kỳ lý do nào để liên kết?

Tôi có thể xác minh hành vi trên, tức là tôi sử dụng dòng sysctl chính xác ở trên và vì nó tôi đã chuyển myQuery sang một cổng thấp hơn 1024 vì đôi khi nó sẽ rất thất bại khi khởi động lại vì cho rằng HĐH đang sử dụng cổng đó (3306) cho một cổng phù du.


Tôi cập nhật câu trả lời của tôi với nhiều thông tin hơn. Hãy trả lời với bất kỳ câu hỏi.
89c3b1b8-b1ae-11e6-b842-48d705

Câu trả lời:


8

Bạn có hai câu hỏi chính ở đây:

1.

Nói đúng với IPv4, việc cạn kiệt cổng có thực sự khả thi?

Đúng. Lấy ví dụ, bộ định tuyến cân bằng tải gửi tất cả các kết nối đến địa chỉ IP NAT. Điều này có thể xảy ra khi bạn có nhiều SRC IPs kết nối với nút cổ chai DST IP.

Điều này có nghĩa là máy chủ web của bạn có thể có một loạt các kết nối như:

root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 173.200.1.18:80      10.100.1.100:49923        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.200.1.200:10155        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:14400        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:50652        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.20.1.20:57554        ESTABLISHED 13939/nginx: worker 

và điều đó hoàn toàn tốt. Tuy nhiên, nếu tất cả 'Địa chỉ nước ngoài' đều giống nhau, điều này có thể gây ra sự cố (ví dụ: 'bộ định tuyến lớn thực hiện máy chủ NAT <---> có một địa chỉ IP').

Nếu tôi phải đưa ra lý do tại sao cạn kiệt cổng phù du không phải là vấn đề phổ biến, tôi khuyên bạn nên làm điều đó bởi vì mỗi cổng yêu cầu dịch vụ nghe và đủ tài nguyên để đáp ứng - trước tiên, một tài nguyên khác (bộ nhớ, cpu) là một nút cổ chai.

Tuy nhiên, cá nhân tôi đã gặp một số vấn đề cạn kiệt cổng khi làm việc tại một công ty cân bằng tải.

2. Tại sao một cổng được sử dụng có thể gây ra sự cố cho dịch vụ nghe?

"Điều này cho phép sử dụng các cổng phù du từ 1024-65535, nếu tôi có các dịch vụ liên kết trên cổng 3306 (ví dụ myQuery), đôi khi chúng sẽ không khởi động được vì cổng đang được sử dụng."

Máy chủ myQuery không thể liên kết với cổng đó nếu nó đang được sử dụng - nói bởi localhost: 3306 hoặc trên tất cả các giao diện. Ví dụ, xem dòng 0.0.0.0:80 trong netstatđầu ra sau đây ?

root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      964/php-fpm.conf)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1660/mysqld     
tcp        0      0 0.0.0.0:842             0.0.0.0:*               LISTEN      1317/inetd      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13938/nginx     

Điều đó có nghĩa là cổng 80 đang lắng nghe trên tất cả các giao diện cục bộ đến máy chủ. Nếu một quá trình khác giữ cổng 80 trước khi nginxmáy chủ của tôi khởi động, nginxsẽ không thể kiểm soát cổng đó và có thể sẽ thất bại trong quy trình khởi động.

Thông thường, cổng 3306 vẫn ổn vì các dịch vụ nghe có các cổng (hoặc phạm vi) được xác định trước được yêu cầu từ máy chủ - ví dụ: cổng 80 và 443 cho máy chủ web.


0

Tôi có thể có 65k kết nối từ 127.0.0.1:(x) đến 127.0.0.1:80 Tôi có thể có 65k kết nối từ 127.0.0.1:(x) đến 127.0.0.1:555

a: có, nếu cổng cục bộ của bạn là 1-65535, số lượng kết nối là 65k-1 (một cổng đang lắng nghe)

Về cơ bản một lần nữa, câu hỏi là (srcip, srcport, dstip, dstport) phải là duy nhất, đúng không? a: có

Tôi không thể mở hơn 65k kết nối từ ip "A" đến IP "B", Cổng "N" Tương tự, một IP không thể mở hơn 65k kết nối với máy chủ web của tôi tại xxxx: 80, tuy nhiên tôi có thể hỗ trợ nhiều hơn Hơn 65k tổng thể miễn là họ đến từ các IP nguồn khác nhau?

a: Một IP không thể mở hơn 65k kết nối đến máy chủ web của tôi tại xxxx: 80, vì srcip, srcport, dstip, dstport là duy nhất. vâng, bạn có thể hỗ trợ nhiều hơn 65k, nếu ip soruce khác nhau

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.