Làm cách nào để đặt cổng cho ứng dụng của tôi?


29

Làm cách nào để bảo lưu danh sách cổng cho các ứng dụng tùy chỉnh của tôi?

Cụ thể, sản phẩm tôi đang tạo có rất nhiều quy trình và rất nhiều giao tiếp giữa chúng.

Vấn đề tôi gặp phải là - thỉnh thoảng - HĐH đánh cắp các cổng của tôi. Nó hiếm, nhưng nó xảy ra.

Điều này có thể là do một ứng dụng khác đã sử dụng ":: bind" không có cổng được chỉ định.

Hoặc đôi khi các ứng dụng của riêng tôi đánh cắp cổng khi tôi gọi ":: kết nối" với một ổ cắm không gắn kết. Như được thấy từ trang người đàn ông:

Nếu ổ cắm chưa được liên kết với một địa chỉ cục bộ, thì kết nối () sẽ liên kết nó với một địa chỉ, trừ khi họ địa chỉ của ổ cắm là AF_UNIX, là một địa chỉ cục bộ không được sử dụng.

Vì vậy, câu hỏi của tôi là, tôi có thể bảo lưu các cổng mà tôi cần để HĐH không sử dụng chúng không? Điều này có thể được thực hiện với / etc / services không? Hay là có một cách khác?


1
Bạn có thể sử dụng ổ cắm AF_UNIX thay thế không?
alex

2
Lo lắng hơn tại sao ứng dụng của bạn là 'ăn cắp cổng'?
EightBitTony

Tôi đã tranh luận nếu tôi cần thông qua phần mềm của mình và liên kết phía máy khách của mỗi kết nối với một cổng cụ thể. Tôi hoàn toàn có thể cập nhật điều này vì có rất nhiều đường dẫn kết nối trong các ứng dụng của tôi. Các cổng dự trữ trong HĐH sẽ là một giải pháp ngăn chặn tốt cho đến khi tôi tìm thấy thời gian để làm điều này.
Michael Baker

Tôi không chắc nếu SELinuxở chế độ Thực thi có thể đáp ứng yêu cầu của bạn hay không, tôi vẫn đang học về nó. Vì vậy, chỉ cần đoán, có thể bạn có thể xác định chính sách của riêng mình SELinuxđể dự trữ các cổng của mình, chẳng hạn như my_server_port_t tcp 1111, 2222, 3333, 4444-4600. Nếu ứng dụng của bạn sẽ chạy ở mọi nơi (không phải ứng dụng máy chủ), tôi e rằng bạn không thể kiểm soát SELinuxđược là BẬT hay TẮT.
LiuYan 刘

Bằng cách "đánh cắp" Tôi giả sử bạn có nghĩa là ứng dụng của bên thứ 3 ràng buộc với số cổng bạn đã chọn trước khi ứng dụng có cơ hội, vì ứng dụng bên thứ 3 đã yêu cầu liên kết với 0 và HĐH đã gán ngẫu nhiên số cổng bạn đã chọn cho Ứng dụng bên thứ 3. Nếu vậy, hãy xem unix.stackexchange.com/a/38724/27865
Đánh dấu Lakata

Câu trả lời:


14

Về mặt kỹ thuật, không có thứ gọi là "cổng dành riêng".

Trong TCP / UDP, cách duy nhất để "dự trữ" một cổng là thực sự bind()là một ổ cắm cho nó. Một cổng bị ràng buộc sẽ không được sử dụng bởi các ứng dụng khác; một cổng không được sử dụng là tốt, không sử dụng để các ứng dụng khác được sử dụng miễn phí.

Nếu bạn đang viết phần mềm máy chủ, thì bạn có thể liên kết ổ cắm của mình với các cổng cụ thể ngay khi bạn muốn trong mã ứng dụng. Làm cho số cổng có thể định cấu hình hoặc ít nhất là nêu rõ chúng trong tài liệu để quản trị viên hệ thống có thể nhanh chóng xác định xung đột và di chuyển các ứng dụng xung đột sang các máy chủ riêng biệt.


1
Ngoài ra, tránh sử dụng các cổng được biết đến / dành riêng nếu có thể.
EightBitTony

Có cổng dành riêng đôi khi. Đây là lời khuyên chung tốt nhưng không phải là câu trả lời chính xác trên Linux.
Jason Newton

18

Để đảm bảo kernel sẽ không cung cấp 49000 và 49001 cho khách hàng khi bạn muốn sử dụng chúng cho máy chủ của mình trên linux.

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

thả nó trong /etc/sysctl.conf, và sau đó chạy sysctl -p.

Lưu ý rằng điều này chưa được kiểm tra.

Tài liệu tham khảo


Tôi đã thử điều này, nhưng nó cũng ngăn ứng dụng của tôi sử dụng các cổng! Điều gì về việc xác định số cổng với tên trong /etc/services?

@ user134197 Điều này sẽ không ngăn ứng dụng của bạn sử dụng các cổng đó nếu bạn sử dụng rõ ràng số cổng không bằng 0 trong yêu cầu liên kết của mình. Nó làm việc cho tôi.
Đánh dấu Lakata

15

Thật ra, câu trả lời trên không hoàn toàn chính xác. Sysctls net.inet.ip.portrange.first và net.inet.ip.portrange.last chỉ định phạm vi cổng mà HĐH có thể phân bổ cho các cổng ngẫu nhiên. Bạn sẽ muốn đảm bảo rằng phạm vi các cổng dành riêng cho ứng dụng của bạn không nằm trong các biến này.

Hãy xem trong Cẩm nang FreeBSD, phần: 12,14. Điều chỉnh giới hạn hạt nhân . Nhưng tiền đề cơ bản tương tự cũng nên áp dụng cho Linux.


Ngoài ra, liên kết này có thể hỗ trợ: stackoverflow.com/questions/913501/,
MattK

3
Tôi nghĩ trong Linux, nó được gọi lànet.ipv4.ip_local_port_range
Brian Gordon
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.