Tại sao chế độ thụ động FTP yêu cầu phạm vi cổng thay vì chỉ một cổng?


34

Tôi đang cố gắng tìm hiểu lý do tại sao tất cả các máy chủ FTP yêu cầu sử dụng phạm vi cổng cho các kênh dữ liệu ở chế độ thụ động thay vì chỉ sử dụng một cổng dữ liệu cho tất cả các kết nối kênh dữ liệu đến.

Máy chủ FTP xử lý nhiều máy khách được kết nối đồng thời trên cổng 21. Máy chủ web xử lý nhiều máy khách được kết nối đồng thời trên cổng 80. V.v.

Vậy thì tại sao máy chủ FTP không thể chỉ sử dụng một cổng kênh dữ liệu cho tất cả các kết nối dữ liệu thụ động đến (và vẫn có thể xử lý nhiều máy khách được kết nối đồng thời trên cổng đó, ví dụ cổng 1024)?

Hay nó có thể?

Tôi quan tâm đến việc biết các chi tiết kỹ thuật tại sao điều này là không thể hoặc không được khuyến nghị.


1
Điều này có thể khiến bạn quan tâm: w3.org/Prot Protocol / rfc959
Matt Simmons

1
Cảm ơn Matt. Vâng, tôi đã đọc hầu hết rfc 959, nhưng tôi cảm thấy tôi thực sự không thể có được câu trả lời rõ ràng từ đó cho những gì tôi đang tự hỏi. Câu trả lời từ Karol Piczak là loại thông tin tôi đang tìm kiếm.
Kurt

Câu trả lời:


20

một lời giải thích rõ ràng và kỹ thuật liên quan đến vấn đề nhiều phiên FTP đồng thời khi khóa cổng dữ liệu chỉ với một cổng là điều tôi quan tâm nhất khi biết sâu. Khi nào nó có thể hoạt động, khi nào nó không hoạt động, tại sao nó có thể không được khuyến nghị, v.v.

Đây sẽ là một phỏng đoán hoang dã, vì tôi chưa thử nó, bạn nên tự mình thử và xem nếu có một số vấn đề khác tôi có thể đã bỏ qua.

Tôi cho rằng bạn có thể giới hạn phạm vi cổng thụ động ở một cổng duy nhất . Trong thực tế, bạn có thể thấy trong câu hỏi này rằng các phạm vi cổng nhỏ được sử dụng trong thực tế . Về mặt lý thuyết, để hỗ trợ nhiều kết nối đồng thời, bạn chỉ cần 4 giá trị: IP cục bộ, cổng cục bộ, IP từ xa, cổng từ xa là duy nhất. Đây là cách bạn phân biệt giữa các kết nối khác nhau.

Nếu bạn khóa cổng trên máy chủ của mình thành một giá trị duy nhất, thì biến duy nhất còn lại là cổng được sử dụng bởi máy khách. Đây không phải là một vấn đề, miễn là khách hàng có một kho cổng phù du miễn phí đủ lớn để lựa chọn. Trừ khi nó đang làm một số NAT nặng nề, bạn không phải lo lắng về điều này. Bây giờ, được cảnh báo đây sẽ là công cụ lý thuyết đơn thuần : nếu bạn đã sử dụng nhiều cổng trên máy chủ của mình, bạn có thể nhân số lượng kết nối đồng thời giả thuyết bằng cách bậtnumber of ports in rangekết nối trên một cổng phía máy khách. Nhưng nó sẽ không xảy ra trong thực tế, vì tôi nghi ngờ có bất kỳ triển khai nào của máy khách FTP sẽ hỗ trợ việc này (vì nó không có nhiều ý nghĩa). Ngoài ra, nếu khách hàng phải chia sẻ các cổng phù du của mình theo cách này và không thể mở một cổng mới, thì anh ta có nhiều vấn đề nghiêm trọng hơn để giải quyết. Vì vậy, từ quan điểm này, bạn nên hoàn toàn an toàn khi sử dụng một cổng duy nhất.

Hãy nghĩ tại sao một cổng duy nhất có thể không đủ .

Trước hết, tôi có thể đưa ra một tình huống trong đó việc triển khai máy chủ FTP thực sự có lỗi chỉ sử dụng số cổng cục bộ như một cách để xác định việc truyền dữ liệu của khách hàng. Một lần nữa, tôi không nghĩ rằng bất kỳ FTPd tử tế nào sẽ làm điều đó.

Vấn đề thực sự ( vâng, bạn có thể coi nhẹ tất cả ở trên như một sự cải tiến lớn ;-)) là phạm vi cổng thụ động nằm trong phạm vi không có đặc quyền .

Điều này có nghĩa là số cổng đã chọn của bạn không được bảo lưu mỗi se và trên thực tế, bất kỳ quy trình người dùng nào (không cần quyền root ) đều có thể lấy được trước khi máy chủ FTP của bạn thực hiện. Nếu bạn có một số lượng lớn các cổng để lựa chọn, bạn chỉ cần lấy một cổng miễn phí ngẫu nhiên. Nếu bạn bị ràng buộc sử dụng duy nhất và nó đã được sử dụng, bạn sẽ không thể xử lý việc chuyển tiền đúng cách.

Xin lỗi, nếu câu trả lời có vẻ hơi quá suy đoán. Thành thật mà nói, tôi đã cố gắng hết sức để tìm ra lý do tại sao bạn không nên sử dụng một cổng duy nhất và ngoài bit cuối cùng, tôi không thể nghĩ ra bất kỳ bằng chứng cứng rắn nào chống lại nó. Tuy nhiên, một câu hỏi thú vị và đầy thách thức bạn đặt ra.


BTW, hãy bình luận về những điểm bị bỏ lỡ và sự không nhất quán ở đây. Ngay cả bản thân tôi, tôi cảm thấy như thể tôi đang cố gắng trả lời một câu trả lời đơn giản - vâng, bạn có thể. ;-)
Karol J. Piczak

Cảm ơn Karol rất nhiều! Đây là vị trí của loại thông tin tôi đang tìm kiếm (và thực sự không tìm thấy ở bất kỳ nơi nào khác). Lý do chính của tôi mà tôi đã hỏi câu hỏi này là tôi muốn biết liệu có an toàn không khi thiết lập máy chủ FTP trong Windows Azure và khóa chế độ thụ động xuống chỉ còn 1 cổng (vì Azure giới hạn các điểm cuối). Tôi đã thử nó, nó hoạt động, và với thông tin của bạn, tôi cũng cảm thấy an toàn để làm điều đó. Tuy nhiên, vấn đề duy nhất còn lại là bộ cân bằng tải Azure bị rớt kết nối điều khiển sau 1 phút trong khi truyền tệp (vì nó không hoạt động), vì vậy tôi đang làm việc trên một đường hầm TCP để duy trì sự sống.
Kurt

1
Tôi tin rằng lý do thực sự là giao thức kênh dữ liệu không có thông tin nhận dạng. Máy chủ chỉ biết tệp nào đang được chuyển từ máy khách nào dựa trên số cổng.
Monstieur

4

FTP dựa trên hai kết nối riêng biệt, một cho điều khiển hoặc luồng lệnh và một để truyền các tệp dữ liệu và thông tin khác như danh sách thư mục. Luồng điều khiển được chuyển qua kết nối TCP truyền thống. Máy khách liên kết với một cổng không có đặc quyền cao và gửi yêu cầu kết nối đến máy chủ FTP, được liên kết với cổng 21. Kết nối này được sử dụng để truyền lệnh.

Trong chế độ Cổng hoặc chế độ hoạt động, máy khách sẽ báo cho máy chủ biết cổng thứ cấp, không được ưu tiên mà nó sẽ lắng nghe. Sau đó, máy chủ sẽ bắt đầu kết nối dữ liệu từ cổng 20 đến cổng không được ưu tiên mà máy khách chỉ định.

Chế độ thụ động, một cơ chế mới hơn, là mặc định khi máy khách là trình duyệt web. Thay vì bị ràng buộc với cổng 20, máy chủ sẽ báo cho khách hàng biết nên sử dụng cổng cao nào để truyền dữ liệu. Dữ liệu sau đó được truyền qua các cổng không có đặc quyền giữa cả máy khách và máy chủ.

Để biết thêm chi tiết, vui lòng xem:

http://tools.ietf.org/html/rfc959

CHỈNH SỬA

Đối với việc khóa máy chủ vào một cổng cụ thể, có thể có khả năng ở một số máy chủ. Ví dụ: trong vsftpd, bạn có các tùy chọn cấu hình sau.

   pasv_max_port
          The maximum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

   pasv_min_port
          The minimum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

Nếu bạn đặt cả hai cổng giống nhau, ví dụ: pasv_max_port = 12345, pasv_min_port = 12345, bạn có thể có được những gì bạn đang theo đuổi. Tôi nghi ngờ điều này sẽ giới hạn số phiên FTP đồng thời mà máy chủ của bạn sẽ hỗ trợ. Hãy kiểm tra để chắc chắn.


1
Cảm ơn vì đã trả lời. Tuy nhiên, điều tôi quan tâm là tại sao, ở chế độ thụ động, máy chủ ftp không thể cho tất cả khách hàng sử dụng cùng một cổng cho kênh dữ liệu (ví dụ như cổng 1024) thay vì cung cấp cho mỗi khách hàng một cổng ngẫu nhiên từ một phạm vi cổng được chỉ định? Các lý do kỹ thuật, nếu có, tại sao chỉ định một cổng dữ liệu duy nhất trong cấu hình phạm vi cổng máy chủ FTP là không thể hoặc được đề xuất? Tôi có thể nghĩ rằng một máy chủ ftp có thể xử lý nhiều / rất nhiều kết nối đồng thời ngay cả trên một cổng kênh dữ liệu không?
Kurt

1
Bởi vì FTP là ma quỷ và cuối cùng cần phải chết. : D

1
Cảm ơn bạn đã chỉnh sửa liên quan đến việc khóa máy chủ vào một cổng cụ thể. Tôi đã thực sự nghĩ về phương pháp đó (và đây là điều tôi muốn thực hiện), nhưng điều tôi không hiểu lắm là tại sao điều đó sẽ hạn chế số lượng phiên FTP đồng thời mà máy chủ có thể hỗ trợ. Chính xác thì điều gì sẽ ngăn máy chủ hỗ trợ nhiều phiên FTP đồng thời trong trường hợp này? Bởi vì bất kỳ máy chủ FTP nào rõ ràng đều hỗ trợ nhiều kết nối đồng thời trên cổng 21, vậy tại sao không phải trên cổng 12345, được lấy từ ví dụ của bạn? Tôi sẽ phải kiểm tra điều này ở độ sâu lớn hơn.
Kurt

Nó có thể không giới hạn số lượng kết nối đồng thời. Nó thực sự phụ thuộc vào cách máy chủ theo dõi các kết nối qua nhiều phiên. Cho nó một phát!
dmourati

btw tôi sẽ phải chờ đánh dấu bất kỳ câu trả lời nào là câu trả lời được chấp nhận, bởi vì một lời giải thích rõ ràng và kỹ thuật liên quan đến vấn đề nhiều phiên FTP đồng thời khi khóa cổng dữ liệu chỉ một cổng là điều tôi quan tâm nhất khi biết sâu. Khi nào nó có thể hoạt động, khi nào nó không hoạt động, tại sao nó có thể không được khuyến nghị, v.v.
Kurt

1

Máy chủ FTP thể khớp kết nối Cổng dữ liệu của khách hàng với kết nối Cổng điều khiển của họ chỉ dựa trên IP nguồn, thay vì dựa trên số cổng được sử dụng.

Điều này sẽ phá vỡ FXP (có thể không phải là điều xấu) khi máy khách kết nối với hai máy chủ (một ở chế độ thụ động), sau đó sau khi nhận được thông tin PORT của máy chủ thụ động, chuyển nó đến máy chủ chế độ hoạt động dưới dạng lệnh PORT để kích hoạt máy chủ chế độ kết nối với máy chủ chế độ thụ động.

Tôi nghi ngờ rằng nhiều máy chủ không tạo ổ cắm dữ liệu cho đến khi máy khách yêu cầu chế độ thụ động. Trong trường hợp đó, nếu hai máy khách yêu cầu chế độ thụ động cùng một lúc, các ổ cắm được tạo sẽ cần số cổng duy nhất.

EDIT : nghĩ về một lý do khác tại sao máy chủ FTP không làm điều này: máy chủ không thể phân biệt nhiều người dùng có cùng một địa chỉ IP.


Cảm ơn. Tôi đoán điều tôi không hiểu là tại sao các ổ cắm kênh dữ liệu đó lại yêu cầu một cổng duy nhất (trên máy chủ) nếu hai hoặc nhiều khách hàng yêu cầu chế độ thụ động cùng một lúc? Bởi vì tôi đang nghĩ, hai hoặc nhiều khách hàng rõ ràng có thể được kết nối với cổng 21 cùng một lúc, vậy tại sao không nói cổng 1024 (cho kênh dữ liệu) cùng một lúc? Tôi cảm thấy đây có thể là một câu hỏi ngu ngốc, nhưng từ chối trách nhiệm của tôi là tôi đã thức quá lâu rồi :)
Kurt

Các ổ cắm cần phải là duy nhất. Bạn có thể tạo một ổ cắm nghe trên một cổng và chấp nhận bao nhiêu kết nối bạn muốn từ một ổ cắm đó hoặc bạn có thể tạo một ổ cắm cho mỗi người dùng trên các cổng khác nhau và chấp nhận một kết nối từ mỗi ổ cắm. Nếu bạn đã thiết kế máy chủ để hoạt động một ổ cắm cho mỗi người dùng, thì về cơ bản, bạn sẽ viết lại mọi thứ để thay đổi nó theo cách khác và cuối cùng, mọi người trên các máy chủ được chia sẻ hoặc đằng sau cùng một địa chỉ IP sẽ không thể kết nối cùng một lúc, vì không có cách nào để phân biệt các kết nối dữ liệu của họ.
DerfK

Cảm ơn. Tôi biết ơn tất cả các câu trả lời tôi đã nhận được về chủ đề này và tôi nghĩ rằng tôi đang bắt đầu xử lý nó khá tốt ngay bây giờ.
Kurt

0

Trên các cổng 21 hoặc 80 (như trên tất cả các cổng nổi tiếng), có một giao thức được thiết lập, mà máy khách sử dụng để cho biết những gì nó muốn. Bằng cách này, máy chủ biết bạn đang kết nối để làm gì. Trên cổng kết nối dữ liệu, không có giao thức. Tất cả những gì máy chủ biết - điều duy nhất duy nhất về kết nối đó - là số cổng bạn kết nối.

Nếu bạn luôn kết nối với cùng một cổng, máy chủ sẽ không thể biết bạn đang kết nối với tập tin nào. Số cổng đóng vai trò là liên kết giữa yêu cầu chuyển trên kết nối điều khiển và kết nối dữ liệu.

Nếu hai máy khách yêu cầu chuyển cùng một lúc, khi máy chủ chấp nhận kết nối trên một cổng, máy chủ sẽ không thể cho biết tệp nào sẽ chuyển. Tất nhiên, máy chủ có thể sử dụng IP máy khách cho quyết định (thực tế nhiều máy chủ FTP xác thực rằng IP máy khách khớp với IP được sử dụng trên kết nối điều khiển, để bảo mật).

Nhưng điều này sẽ không làm việc cho:

  • Nhiều kết nối từ cùng một máy (hầu hết các máy khách FTP đều hỗ trợ chuyển / xếp hàng song song).
  • Kết nối từ các máy khác nhau trong cùng một mạng (công ty), vì các máy có cùng IP bên ngoài.

Xem thêm sử dụng lại kết nối dữ liệu FTP .


-1

Tôi không thấy điều này được đề cập ở đây, vì vậy tôi sẽ ném nó vào. Việc gán phạm vi cổng có nghĩa là một loại tính năng bảo mật, trong đó bạn không thể giám sát một cổng cho lưu lượng dữ liệu, dữ liệu được gửi trên một cổng ngẫu nhiên trong phạm vi, mà không thể dễ dàng được xác định. An ninh thông qua sự tối tăm.


1
Bạn có bất kỳ tài liệu tham khảo cho khiếu nại này?
Martin Prikryl

-2

Âm thanh như bạn đã biết về cổng điều khiển và cổng dữ liệu vì vậy tôi sẽ cắt ngay để đuổi theo. Các cổng điều khiển được truyền thông tự nhiên, giống như cổng 80 cho các trang web. họ có thể xử lý nhiều yêu cầu khác nhau (không đồng thời, nhưng rất gần vì chúng quá nhanh để hoàn thành). mặt khác, cổng dữ liệu là nơi phép màu xảy ra với FTP. Nếu bạn giới hạn bản thân ở một cổng dữ liệu duy nhất, mỗi lần chỉ có một lần truyền dữ liệu. xem xét chuyển tập tin lớn. Với một cổng dữ liệu duy nhất được mở, không có dữ liệu nào khác có thể di chuyển cho đến khi quá trình chuyển hoàn tất. Điều này có nghĩa là trong khi chuyển, người dùng thứ hai thậm chí sẽ không thể liệt kê nội dung thư mục của thư mục ftp. Chắc chắn họ sẽ có thể đăng nhập thành công, nhưng hành vi của họ sẽ giống như khi các cổng dữ liệu hoàn toàn không mở. Nếu bạn ổn với điều này, một cổng duy nhất sẽ làm việc tuyệt vời cho bạn. Hãy nhớ rằng một số khách hàng ftp (tôi có thể nghĩ ra 1 quyền ngay lập tức) theo mặc định thiết lập nhiều kết nối trong một phiên để tải xuống. Vì vậy, đối với khách hàng này, trong một kịch bản cổng đơn, hãy xem xét chuyển hàng loạt 1 tệp lớn và 4 tệp nhỏ.

Các khách hàng bắt đầu chuyển cho tập tin lớn đầu tiên, tất cả dory hunky. Sau đó, trong khi quá trình chuyển đó diễn ra, nó sẽ bắt đầu một tập tin thứ hai. Không có con xúc xắc. Sau đó, thứ ba, cũng zilch (thuật ngữ kỹ thuật). Cuối cùng, nhật ký sẽ hiển thị 1 lần chuyển thành công và 4 lần chuyển thất bại. Công việc xung quanh sẽ là giới hạn máy khách trong một kết nối duy nhất cho mỗi phiên và bạn sẽ ổn (giả sử người khác không đặt chân vào cửa trong một giây rất nhỏ, một lần chuyển hoàn thành và một giao dịch khác chưa bắt đầu. )


2
Gì? Điều này là hoàn toàn không chính xác. Ổ cắm TCP được xác định bởi 4-tuple (IP nguồn, cổng nguồn, cổng đích, IP đích). Nhiều ổ cắm TCP có thể được tạo và phục vụ đồng thời từ cùng một cổng đích: ánh xạ IP. Quá trình máy chủ FTP có thể phục vụ dữ liệu hai và từ bất kỳ số lượng máy khách mạng nào cùng một lúc.
EEAA
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.