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.
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.
Câu trả lời:
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.
Đ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 .
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.
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
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
sysctl
giao diện để thay đổi cài đặt thay vì sử dụng/proc
hệ thống tệp. Tên củasysctl
tham số là "net.ipv4.ip_local_port_range". Chỉnh sửa/etc/sysctl.conf
tệp nếu bạn có hoặc có tập lệnh khởi động chạysysctl
lệnh thủ công nếu bạn muốn thay đổi tham số này bằng cách sử dụngsysctl
.
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
netsh
lệ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 qua65535
.- 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
netsh
lệ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
1025
làm cổng bắt đầu và sau đó sử dụng3976
làm phạm vi cho cả TCP và UDP. Điều này dẫn đến một cổng bắt đầu1025
và một cổng kết thúc5000
.
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ị:
MaxUserPort
Kiểu dữ liệu:REG_DWORD
Giá 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ị
1024
và5000
bao 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ổng
1024-9999
(ví dụ) để có phạm vi cổng phù du10000-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).
bind
hệ 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.
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à có 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.
BIND_PORT
tù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.
Đá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.