Các cổng nguồn được xác định như thế nào và làm cách nào tôi có thể buộc nó sử dụng một cổng cụ thể


26

Khi tôi kết nối với https://www.google.co.uk, điều này sẽ thay đổi thành 216.58.198.228:443. Sau đó, một kết nối với tôi mở ra [Địa chỉ IP của tôi]: 63998.

Câu hỏi của tôi là 63998 port được chọn như thế nào và có cách nào buộc nó là 63999.


9
Có cách nào để buộc nó là 63999 Bạn có lý do nào để thử làm việc này không?
AL

1
Nếu bạn đang viết một ứng dụng, bạn có thể mở bất kỳ cổng nguồn nào (không sử dụng) mà bạn muốn. Nhưng nó không phải là một ý tưởng tốt và không rõ tại sao bạn muốn điều này?
pjc50

6
@ pjc50 Thật vậy, câu hỏi này có vẻ như có thể có vấn đề XY .
Dev

1
Tôi đã gửi một bản chỉnh sửa để thay đổi tiêu đề thành "nguồn" thay vì "cục bộ", vì số cổng đích là "cục bộ" cho máy đích, nhưng nguồn của gói TCP SYN ban đầu rõ ràng là của người khởi tạo kết nối.
Monty Harder

Câu trả lời:


39

Các cổng địa phương được xác định như thế nào

Số cổng được phần mềm triển khai TCP chọn từ một loạt các số cổng được gọi là Cổng Ephemeral .

Cơ chế chính xác để chọn số cổng và phạm vi được sử dụng là phụ thuộc vào Hệ điều hành.


Có cách nào để buộc nó là 63999.

Điều này có thể được thực hiện bằng cách thay đổi cấu hình của phần mềm triển khai TCP.

Hướng dẫn về cách định cấu hình phạm vi Cổng Ephemeral cho nhiều Hệ điều hành khác nhau có thể được tìm thấy tại Thay đổi Phạm vi Cổng Ephemeral .

  • Hướng dẫn cho Linux và Windows được bao gồm trong câu trả lời dưới đây để tham khảo.

Tuy nhiên, chẳng hạn, nên hạn chế phạm vi trong một cổng, chẳng hạn 63999.

  • Trong thực tế trên Windows, điều này là không thể:

    Phạm vi tối thiểu của các cổng có thể được đặt là 255.


Phạm vi cảng phù du

Kết nối TCP / IPv4 bao gồm hai điểm cuối và mỗi điểm cuối bao gồm địa chỉ IP và số cổng. Do đó, khi người dùng máy khách kết nối với máy tính của máy chủ, một kết nối được thiết lập có thể được coi là 4-tuple (IP máy chủ, cổng máy chủ, IP máy khách, cổng máy khách).

Thông thường có ba trong số bốn cái được biết đến - máy khách sử dụng địa chỉ IP của chính nó và khi kết nối với dịch vụ từ xa, cần có địa chỉ IP và số cổng dịch vụ của máy chủ.

Điều không rõ ràng ngay lập tức là khi một kết nối được thiết lập mà phía máy khách của kết nối sử dụng số cổng. Trừ khi một chương trình khách yêu cầu rõ ràng một số cổng cụ thể, số cổng được sử dụng là số cổng phù du.

Cổng tạm thời là các cổng tạm thời được chỉ định bởi ngăn xếp IP của máy và được chỉ định từ một phạm vi cổng được chỉ định cho mục đích này. Khi kết nối chấm dứt, cổng phù du có sẵn để sử dụng lại, mặc dù hầu hết các ngăn xếp IP sẽ không sử dụng lại số cổng đó cho đến khi toàn bộ nhóm cổng phù du đã được sử dụng.

Vì vậy, nếu chương trình máy khách kết nối lại, nó sẽ được gán một số cổng phù du khác cho phía kết nối mới.

Nguồn Phạm vi cảng phù du


Thay đổi phạm vi cổng phù du

Linux:

Linux cho phép bạn xem và thay đổi phạm vi cổng phù du chỉ bằng cách sử dụng tệp /proc/sys/net/ipv4/ip_local_port_range. Ví dụ, điều này cho thấy cấu hình mặc định trên hệ thống kernel 2.2:

$ cat /proc/sys/net/ipv4/ip_local_port_range 
1024 4999

Để thay đổi điều này thành phạm vi ưa thích, bạn có thể làm (với tư cách là siêu người dùng):

# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range 

Lưu ý rằng bạn sẽ cần phải làm điều này mỗi khi hệ thống khởi động, vì vậy hãy chắc chắn thêm một dòng vào tập lệnh khởi động hệ thống, như /etc/rc.local vậy phạm vi của bạn luôn được sử dụng.

Cũng lưu ý rằng nhân Linux 2.4 sẽ mặc định phạm vi từ 32768 đến 61000 nếu có sẵn bộ nhớ kernel, do đó việc thay đổi phạm vi có thể không cần thiết trên các hệ thống Linux mới hơn.

Cuối cùng, cũng lưu ý rằng bạn có thể sử dụng sysctlgiao diện để thay đổi cài đặt thay vì sử dụng /prochệ thống tệp. Tên của sysctltham số là "net.ipv4.ip_local_port_range". Chỉnh sửa /etc/sysctl.conftệp nếu bạn có hoặc có tập lệnh khởi động chạy sysctllệnh thủ công nếu bạn muốn thay đổi tham số này bằng cách sử dụng sysctl.

Windows Vista / Windows Server 2008 và mới hơn:

Kể từ Windows Vista và Windows Server 2008, Windows hiện sử dụng một phạm vi rộng (49152-65535) theo Điều khoản 929851 của Microsoft . Bài viết tương tự cũng cho thấy cách bạn có thể thay đổi phạm vi nếu muốn, nhưng phạm vi mặc định hiện đủ cho hầu hết các máy chủ.

Nguồn thay đổi phạm vi cổng phù du

Bạn có thể xem phạm vi cổng động trên máy tính đang chạy máy tính Windows Vista hoặc Windows Server 2008 bằng cách sử dụng các netshlệnh sau :

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp 

Ghi chú:

  • Phạm vi được đặt riêng cho từng lần vận chuyển và cho từng phiên bản IP.
  • Phạm vi cổng bây giờ thực sự là một phạm vi với điểm bắt đầu và điểm cuối.
  • Các khách hàng của Microsoft triển khai các máy chủ đang chạy Windows Server 2008 có thể gặp sự cố với giao tiếp RPC giữa các máy chủ nếu tường lửa được sử dụng trên mạng nội bộ.
  • Trong những trường hợp này, chúng tôi khuyên bạn nên cấu hình lại tường lửa để cho phép lưu lượng giữa các máy chủ trong phạm vi cổng động 49152 thông qua 65535.
  • Phạm vi này ngoài các cổng nổi tiếng được sử dụng bởi các dịch vụ và ứng dụng.
  • Hoặc, phạm vi cổng được sử dụng bởi các máy chủ có thể được sửa đổi trên mỗi máy chủ.

Bạn điều chỉnh phạm vi này bằng cách sử dụng netshlệnh, như sau:

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

Lệnh này đặt phạm vi cổng động cho TCP. Cổng bắt đầu là số và tổng số cổng là phạm vi. Sau đây là các lệnh mẫu:

netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000

Các lệnh mẫu này đặt phạm vi cổng động bắt đầu tại cổng 10000 và kết thúc tại cổng 10999(1000 cổng).

Ghi chú:

  • Phạm vi tối thiểu của các cổng có thể được đặt là 255.
  • Cổng bắt đầu tối thiểu có thể được đặt là 1025.
  • Cổng kết thúc tối đa (dựa trên phạm vi được định cấu hình) không thể vượt quá 65535.
  • Để sao chép hành vi mặc định của Windows Server 2003, hãy sử dụng 1025làm cổng bắt đầu và sau đó sử dụng 3976làm phạm vi cho cả TCP và UDP. Điều này dẫn đến một cổng bắt đầu 1025và một cổng kết thúc 5000.

Nguồn Microsoft Kiến thức Điều 929851 :

Windows XP trở lên:

Đối với các hệ điều hành Windows cũ hơn (Windows XP trở lên), Windows sử dụng phạm vi BSD truyền thống từ 1024 đến 4999 cho phạm vi cổng phù du của nó. Thật không may, có vẻ như bạn chỉ có thể đặt giới hạn trên của phạm vi cổng phù du. Dưới đây là thông tin được trích từ Điều khoản kiến ​​thức của Microsoft Điều 196271 :

  • Bắt đầu Trình chỉnh sửa sổ đăng ký ( Regedt32.exe).
  • Xác định vị trí khóa sau trong sổ đăng ký:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  • Trên menu "Chỉnh sửa", nhấp vào "Thêm giá trị", sau đó thêm giá trị đăng ký sau:

    Tên giá trị: MaxUserPortKiểu dữ liệu: REG_DWORDGiá trị: 65534(ví dụ)

    Phạm vi hợp lệ: 5000-65534(thập phân) Mặc định: 0x1388(5000 thập phân)

    Mô tả: Tham số này kiểm soát số cổng tối đa được sử dụng khi ứng dụng yêu cầu bất kỳ cổng người dùng khả dụng nào từ hệ thống. Thông thường, các cổng phù du (nghĩa là tồn tại trong thời gian ngắn) được phân bổ giữa các giá trị 10245000bao gồm.

  • Thoát khỏi Trình chỉnh sửa sổ đăng ký.

Lưu ý: Có một bài viết KB có liên quan khác ( 812873 ) tuyên bố cho phép bạn đặt phạm vi loại trừ, điều đó có nghĩa là bạn có thể loại trừ các cổng1024-9999 (ví dụ) để có phạm vi cổng phù du 10000-65534. Tuy nhiên, chúng tôi chưa thể làm cho nó hoạt động (kể từ tháng 10 năm 2004).

Nguồn thay đổi phạm vi cổng phù du


1
Đối với ít nhất các cửa sổ có vẻ như có thể hạn chế phạm vi hệ thống cổng rộng. Trong hầu hết các trường hợp, đây có thể là một ý tưởng tồi, đặc biệt là giới hạn nó ở một cổng sẽ là: Xem KB 929851 , các lệnh được liệt kê ít nhất hoạt động trên Windows 7.
Seth

@ Có. Tôi miễn cưỡng đề cập đến điều này vì OP không đề cập đến hệ điều hành của anh ấy và tôi không muốn mở rộng câu trả lời để bao quát N hệ điều hành ...
DavidPostill

Bạn nói đúng về điều đó. Sau khi tất cả có rất nhiều hệ điều hành. Đó chỉ là một cái gì đó tôi tình cờ gặp trong khi ban đầu cố gắng trả lời câu hỏi này. Vì câu trả lời của bạn đã nhanh hơn nên tôi chỉ nghĩ là tôi sẽ thêm nó. Đó là một câu trả lời thực sự tốt bằng văn bản! :) Chỉ cần thêm nó như một gợi ý rằng đôi khi thay đổi cấu hình là đủ thay vì lập trình lại (có thể cách hiểu của tôi chỉ khác - đối với tôi nghe có vẻ như biên dịch lại).
Seth

1
Trên thực tế, trong Linux cũng rất đơn giản: chỉ cần tạo ra tiếng vang "49152 65535"> / Proc / sys / net / ipv4 / ip_local_port_range . Nó đơn giản đến mức nó có thể được thực hiện trên cơ sở mỗi lệnh .
MariusMatutiae

2
Thay vì thay đổi phạm vi cổng phù du, ứng dụng sẽ gọi cuộc gọi bindhệ thống trước khi gọi connect. Một số ứng dụng có tùy chọn để làm điều đó, các ứng dụng khác thì không.
kasperd

9

Câu trả lời của David Postill là hoàn toàn đúng. Tôi muốn chỉ cần thêm vào nó, bằng cách nhấn mạnh rằng việc thay đổi phạm vi cổng phù du trong Linux rất đơn giản, rằng OP có một câu trả lời khẳng định.

Bạn thay đổi EPR như sau:

echo "40000 60000" > /proc/sys/net/ipv4/ip_local_port_range 

và bạn có thể chọn cổng 50000 (làm ví dụ) với tập lệnh sau:

OLD_RANGE=$(cat /proc/sys/net/ipv4/ip_local_port_range)
MY_PORT=50000
echo "$MY_PORT $MY_PORT" > /proc/sys/net/ipv4/ip_local_port_range
sudo -u SomeUser SomeApplication  & 
echo $OLD_RANGE" > /proc/sys/net/ipv4/ip_local_port_range 

Một cảnh báo ở đây: vì có một cổng duy nhất trong phạm vi, một ứng dụng khác có thể cướp nó khỏi bạn giữa việc thực hiện dòng thứ ba và dòng thứ tư ở trên; Ngoài ra, ngay cả khi không có điều kiện cuộc đua, bạn sẽ làm tê liệt tất cả các ứng dụng khác cho đến khi bạn khôi phục EPR lớn, đó là lý do tại sao tôi khôi phục phạm vi ban đầu càng sớm càng tốt.

Do đó, nếu hệ điều hành của OP là Linux, câu trả lời sẽ là nó có thể dễ dàng thực hiện.

Thật đáng ngạc nhiên, điều này không đơn giản như trên BSD, một số trong đó thậm chí không có cài đặt nhân thời gian chạy cho EPR. MacOS X, FreeBSD và OpenBSD yêu cầu sửa đổi tệp /etc/sysctl.conf , nhưng họ có các lựa chọn khác nhau cho EPR.

Bất kể những điều trên và của HĐH, thực tế là thể làm được điều gì đó không có nghĩa là nó phải được thực hiện: tại sao bạn cần điều này trên Trái đất? Tôi không thể nghĩ về một trường hợp sử dụng duy nhất.


Ví dụ về Linux +1.
DavidPostill

Hehe. BSD / OS yêu cầu biên dịch lại kernel :)
DavidPostill

1
@DavidPostill Đó là một con số lớn .
MariusMatutiae

Có một lỗ hổng trong ví dụ mã của bạn. Dàn diễn viên của bạn rất thất lạc. Ngoài ra, sẽ là một ý tưởng tốt để tạo BIND_PORTtùy chọn, sao cho mã vẫn có thể được sử dụng theo cách chính xác như bản gốc. Tôi nghĩ rằng htons(bind_port_env ? atoi(bind_port_env) : 0)sẽ làm điều đúng đắn.
kasperd

1

Đáng để thêm rằng nhân Linux cũng có

net.ipv4.ip_local_reserved_ports

núm xoay có phần ngược lại nhưng tuy nhiên nó có thể rất hữu ích vì theo cách đó bạn có thể "đục lỗ" cho các dịch vụ mở (các) cổng cụ thể trong phạm vi cổng khác.

Đoạn trích ngắn từ các tài liệu :

Chỉ định các cổng được dành riêng cho các ứng dụng của bên thứ ba đã biết. Các cổng này sẽ không được sử dụng bởi các phép gán cổng tự động (ví dụ: khi gọi kết nối () hoặc liên kết () với số cổng 0). Hành vi phân bổ cổng rõ ràng là không thay đổi.

Định dạng được sử dụng cho cả đầu vào và đầu ra là danh sách các phạm vi được phân tách bằng dấu phẩy (ví dụ: "1,2-4,10-10" cho các cổng 1, 2, 3, 4 và 10). Ghi vào tệp sẽ xóa tất cả các cổng dành riêng trước đó và cập nhật danh sách hiện tại với cổng được đưa ra trong đầu vào.

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.