FTP pasif modu neden sadece bir portun aksine bir port aralığı gerektiriyor?


34

Tüm FTP sunucularının, gelen tüm veri kanalı bağlantıları için sadece bir veri portu kullanmak yerine, pasif mod veri kanalları için bir port aralığı kullanımını neden gerektirdiğini anlamak için uğraşıyorum .

FTP sunucuları, 21 numaralı bağlantı noktasında aynı anda bağlı istemcileri yönetir. Web sunucuları, 80 numaralı bağlantı noktasında aynı anda bağlı istemcileri yönetir.

Öyleyse neden bir FTP sunucusu gelen tüm pasif veri bağlantıları için sadece bir veri kanalı portu kullanamıyor (ve hala aynı anda bağlı olan birçok müşteriyi bu portta tutabiliyor, yani port 1024).

Yoksa yapabilir mi?

Bunun neden mümkün olmadığına veya önerilmediğine ilişkin teknik ayrıntıları bilmek istiyorum.


1
Bu ilginizi çekebilir: w3.org/Protocols/rfc959
Matt Simmons

1
Sağol Matt. Evet, rfc 959’un çoğunu okudum, ancak bundan merak ettiğim şeye net bir cevap alamadığımı hissediyorum. Karol Piczak’ın cevabı daha çok aradığım bilgiler.
Kurt

Yanıtlar:


20

Veri portunu tek bir porta kilitlerken eşzamanlı çoklu FTP oturumları ile ilgili net ve teknik bir açıklama, derinlemesine bilmekle en çok ilgilendiğim şeydir. Ne zaman işe yarayabilir, ne zaman çalışmayacak, neden önerilmeyeceği vs.

Bu, test etmediğim için vahşi bir tahmin olacak, kendiniz denemelisiniz ve gözden kaçırmış olabileceğim başka sorunlar olup olmadığını görmelisiniz.

Sanırım pasif port aralığını tek bir portla sınırlandırabilirsin . Aslında sen görebileceğiniz bu soruya o küçük liman aralıkları pratikte kullanılmaktadır . Teorik olarak, birden fazla eşzamanlı bağlantıyı desteklemek için sadece 4 değere ihtiyacınız var: yerel IP, yerel port, uzak IP, uzak port benzersiz. Farklı bağlantılar arasında nasıl ayırt edersiniz.

Sunucunuzdaki bağlantı noktasını tek bir değere kilitlerseniz, geriye kalan tek değişken istemci tarafından kullanılan bağlantı noktasıdır. Müşteri, aralarından seçim yapabileceği kadar geniş, geçici , geçici limanlar havuzuna sahip olduğu sürece, bu bir sorun değildir . Biraz ağır NAT yapmıyorsa, bu konuda endişelenmenize gerek yok. Şimdi, bu tamamen teorik şeyler olacağı konusunda uyarılırsınız : eğer sunucunuzda birden fazla port kullanıyorsanız, etkin hale getirerek varsayımsal eşzamanlı bağlantı sayısını çoğaltabilirsiniz.number of ports in rangeİstemci tarafında bir port başına bağlantı. Ancak, bunu destekleyecek bir FTP istemcisi uygulaması olduğundan şüphelendiğimden (pratikte pek bir anlam ifade etmeyeceğinden) pratikte olmayacak. Ayrıca, müşteri geçici portlarını bu şekilde paylaşmak zorunda kalırsa ve yeni bir tane açamıyorsa, başa çıkması gereken çok daha ciddi sorunları var demektir. Bu nedenle, bu açıdan tek bir bağlantı noktası kullanarak tamamen güvende olmalısınız.

Tek bir portun neden yeterli olmadığını düşünelim .

Her şeyden önce, gerçekten çok çalışan bir FTP sunucusu uygulamasının, istemci veri aktarımını tanımlamanın bir yolu olarak sadece yerel port numarasını kullandığı bir durumla karşılaştım. Bir kez daha, düzgün bir FTP'nin bunu yapacağını sanmıyorum.

Asıl sorun ( evet, hepsini yukarıda sayılan büyük bir sayı olarak göz ardı edebilirsiniz ;-)) pasif port aralığının imtiyazsız bir aralıkta olması .

Bu, seçtiğiniz port numarasının kendi başına ayrılmadığı anlamına gelir ve aslında herhangi bir kullanıcı işlemi ( kök ayrıcalıklarına gerek duymaz ) FTP sunucunuzdan önce alabilir. Aralarından seçim yapabileceğiniz çok sayıda bağlantı noktası havuzunuz varsa, rasgele bir tane seçebilirsiniz. Yalnızca birini kullanmaya mecbursanız ve zaten kullanılıyorsa, transferleri doğru bir şekilde yapamazsınız.

Üzgünüm, cevap biraz spekülatif görünüyorsa. Dürüst olmak gerekirse, tek bir bağlantı noktasını kullanmamanız için bir neden bulmaya çalıştım ve son parça dışında, buna karşı sert bir kanıt düşünemedim. Bununla birlikte, ilginç ve zorlu bir soru sormak.


BTW, buradaki cevapsız noktalar ve tutarsızlıklar hakkında yorum yapmaktan çekinmeyin. Kendim bile, sanırım basit bir cevabı nitelendiriyormuşum gibi hissediyorum - evet, yapabilirsiniz. ;-)
Karol J. Piczak 18:11

Çok teşekkürler Karol! Bu, aradığım bilgilerin türünde bir nokta (ve gerçekten başka hiçbir yerde bulamadım). Bu soruyu sormamın ana nedeni, Windows Azure'da bir FTP sunucusu kurmanın ve pasif modu yalnızca 1 bağlantı noktasına kilitlemenin güvenli olup olmadığını bilmek istememdir (Azure bitiş noktalarını sınırladığından). Denedim, işe yarıyor ve bilginizle kendimi de güvende hissediyorum. Ancak geriye kalan tek sorun, Azure yük dengeleyicisinin dosya aktarımı sırasında 1 dakika sonra kontrol bağlantısını bırakmasıdır (boşta olduğu için), bu yüzden bunu düzeltmek için canlı tutmak için bir TCP tüneli üzerinde çalışıyorum.
Kurt

1
Asıl nedenin, veri kanalı protokolünün tanımlayıcı bilgileri olmaması olduğuna inanıyorum. Sunucu, port numarasına göre hangi dosyanın hangi istemciden transfer edildiğini bilir.
Monstieur

4

FTP, biri kontrol veya komut akışı için diğeri veri dosyalarını ve dizin listeleri gibi diğer bilgileri aktarmak için iki ayrı bağlantıya dayanır. Kontrol akışı geleneksel bir TCP bağlantısı üzerinden taşınır. İstemci, yüksek ayrıcalıklı olmayan bir bağlantı noktasına bağlanır ve 21 numaralı bağlantı noktasına bağlı olan FTP sunucusuna bir bağlantı isteği gönderir. Bu bağlantı komutları iletmek için kullanılır.

Bağlantı Noktası veya etkin modda, istemci hangi ikincil, ayrıcalıklı olmayan bağlantı noktasını dinleyeceğini sunucuya bildirir. Sunucu daha sonra, bağlantı noktasından 20, istemcinin belirtilen ayrıcalıklı bağlantı noktasına veri bağlantısını başlatır.

İstemci bir web tarayıcısı olduğunda, daha yeni bir mekanizma olan pasif mod varsayılandır. Sunucu, bağlantı noktası 20'ye bağlanmak yerine, istemciye veri aktarımı için hangi yüksek bağlantı noktasını kullanacağını bildirir. Veriler daha sonra hem istemci hem de sunucu arasında ayrıcalıklı olmayan bağlantı noktaları üzerinden iletilir.

Daha fazla ayrıntı için lütfen bakınız:

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

DÜZENLE

Sunucuyu belirli bir tek bağlantı noktasına kilitlemekle ilgili olarak, bazı sunucularda mümkün olabilir. Örneğin, vsftpd'de aşağıdaki yapılandırma seçeneklerine sahipsiniz.

   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)

Her iki bağlantı noktasını aynı olarak ayarlarsanız, örneğin pasv_max_port = 12345, pasv_min_port = 12345, neyin peşinde olduğunuzu öğrenebilirsiniz. Bunun, sunucunuzun destekleyeceği eşzamanlı FTP oturumlarının sayısını sınırlayacağından şüpheleniyorum. Lütfen emin olmak için test edin.


1
Cevabın için teşekkürler. Bununla birlikte, bilmek istediğim şey, pasif modda ftp sunucusunun tüm istemcilere, her müşteriye bir bilgisayardan rasgele bir bağlantı noktası vermenin aksine, veri kanalı için aynı bağlantı noktasını (örneğin bağlantı noktası 1024) kullanmalarını söyleyememesidir. belirtilen port aralığı? FTP sunucusu bağlantı noktası aralığı yapılandırmasında yalnızca bir tek veri bağlantı noktası belirtmenin neden mümkün olmadığı ya da önerilmediği için teknik nedenler nelerdir? Bir ftp sunucusunun sadece bir veri kanalı portunda bile birçok / çok eşzamanlı bağlantıyı idare edebileceğini düşünürdüm, değil mi?
Kurt

1
Çünkü FTP şeytandır ve sonunda ölmesi gerekir. : D

1
Sunucuyu belirli bir tek bağlantı noktasına kilitleme konusundaki düzenlemeniz için teşekkür ederiz. Aslında bu metodu düşündüm (ve bunu başarmak istediğim şey bu), fakat tam olarak anlamadığım şey, sunucunun destekleyebileceği eşzamanlı FTP oturumlarının sayısını sınırlandırmasıdır. Bu durumda sunucunun eşzamanlı birden fazla FTP oturumunu desteklemesini tam olarak engelleyen şey nedir? Herhangi bir FTP sunucusu açıkça, 21 numaralı bağlantı noktasında birden fazla eşzamanlı bağlantıyı desteklediğinden, neden örnek aldığınız 12345 numaralı bağlantı noktasında kullanılmıyor? Bunu daha derinlemesine test etmek zorunda kalacağım.
Kurt,

Eşzamanlı bağlantı sayısını sınırlamaz. Bu gerçekten, sunucunun birden fazla oturumdaki bağlantıları nasıl takip ettiğine bağlı. Bi dene!
dmourati

btw Herhangi bir cevabın kabul görmüş cevap olarak işaretlenmesini beklemek zorunda kalacağım, çünkü veri portunu tek bir porta kilitlerken birden fazla eşzamanlı FTP oturumu konusu ile ilgili net ve teknik bir açıklama derinlemesine bilmekle ilgilendiğim şey. Ne zaman işe yarayabilir, ne zaman işe yaramayacak, neden önerilmeyeceği, vb.
Kurt

1

Bir FTP sunucusu olabilir kullanılan port sayısına dayalı tek başına kaynak IP dayanarak Kontrol Liman bağlantısına müşterinin Veri Bağlantı Noktası bağlantısı eşleştirmek yerine muktedir.

Bu kıracak FXP iki sunucu (pasif modda bir) istemci bağlandığı, daha sonra pasif sunucunun PORT bilgi aldıktan sonra, geçtiği yerlerde (kötü bir şey olmayabilir) o aktif böylece PORT komutu olarak aktif mod sunucusuna mod sunucusu pasif mod sunucusuna bağlanır.

Ben şüpheli istemci pasif mod istekleri kadar birçok sunucu veri soket oluşturmak kalmamasıdır. Bu durumda, iki istemci aynı anda pasif mod isterse, oluşturulan yuvaların benzersiz bağlantı noktası numaralarına ihtiyacı olacaktır.

EDIT : FTP sunucularının bunu yapmamasının başka bir nedeni olduğunu düşündü: sunucu aynı IP adresine sahip birden fazla kullanıcıya ayrı ayrı söyleyemedi.


Teşekkürler. Anlamadığım şey, iki veya daha fazla istemcinin aynı anda pasif mod istemesi durumunda neden bu veri kanalı soketlerinin (sunucuda) benzersiz bir bağlantı noktası gerektirmesi gerektiğidir? Düşündüğüm için, iki ya da daha fazla istemcinin aynı anda 21 numaralı bağlantı noktasına açık bir şekilde bağlanabileceği için, neden 1024 numaralı bağlantı noktasını (veri kanalı için) aynı anda söylemiyorsunuz? Bunun aptalca bir soru olabileceğini hissediyorum, ama sorumluluk reddi çok uzun zamandır uyanığım :)
Kurt

Soketin kendisinin benzersiz olması gerekir. Bir portta dinleyen bir soket oluşturabilir ve o soketten istediğiniz kadar bağlantı kabul edebilir ya da farklı portlarda kullanıcı başına bir soket oluşturabilir ve her soketten bir bağlantı kabul edebilirsiniz. Sunucuyu kullanıcı başına bir soket çalışacak şekilde tasarladıysanız, esasen başka yolla değiştirmek için her şeyi yeniden yazarsınız ve sonunda, paylaşılan ana bilgisayarlardaki veya aynı IP adresinin arkasındaki kişiler Aynı anda bağlanın, çünkü veri bağlantılarını birbirinden ayırmanın bir yolu olmazdı.
DerfK

Teşekkürler. Konuyla ilgili aldığım tüm cevaplar için minnettarım ve sanırım şimdi oldukça iyi bir şekilde konuşmaya başladım.
Kurt

0

21 veya 80 numaralı bağlantı noktalarında (tüm iyi bilinen bağlantı noktalarında olduğu gibi), istemcinin ne istediğini bildirmek için kullandığı bir protokol belirlenir. Bu şekilde sunucu neye bağlandığınızı bilir. Veri bağlantı portunda protokol yok. Sunucunun bildiği her şey - bu bağlantıda benzersiz olan tek şey - bağlandığınız bağlantı noktası numarasıdır.

Her seferinde aynı bağlantı noktasına bağlanacak olsaydınız, sunucu hangi dosyaya bağlandığınızı söyleyemezdi. Port numarası, kontrol bağlantısındaki bir transfer talebi ile bir veri bağlantısı arasında bir bağlantı görevi görür.

İki istemci aynı anda transfer talep ederse, sunucu tek bir bağlantı noktasından bağlantı kabul ettiğinde, hangi dosyanın transfer edileceğini söyleyemez. Elbette, sunucu karar için bir istemci IP kullanabilir (aslında birçok FTP sunucusu, istemci IP’nin güvenlik için kontrol bağlantısında kullanılan IP ile eşleştiğini doğrular).

Ancak bu işe yaramayacak:

  • Aynı makineden birden fazla bağlantı (çoğu FTP istemcisi paralel aktarımları / kuyrukları destekler).
  • Aynı harici ağa sahip olan aynı (şirket) ağ içindeki farklı makinelerden bağlantı.

Ayrıca bkz. FTP veri bağlantılarının yeniden kullanımı .


-1

Burada bahsettiğimi görmedim, bu yüzden içeri atacağım. Port range ataması, bir veri trafiği için bir portu izleyemediğiniz bir tür güvenlik özelliği olması gerekiyordu, veriler Kolayca tespit edilemeyen aralık. Belirsizlik yoluyla güvenlik.


1
Bu iddia için herhangi bir referansınız var mı?
Martin Prikryl

-2

Kontrol portlarını ve veri portlarını zaten biliyor gibisiniz, bu yüzden hemen takip etmeye devam edeceğim. Kontrol bağlantı noktaları, tıpkı web siteleri için bağlantı noktası 80 gibi, doğaya göre veri iletişimidir. birçok farklı isteği yerine getirebilirler (aynı anda değil, ancak tamamlanması çok hızlı olduklarından çok yakın). Öte yandan veri portları, sihrin FTP ile gerçekleştiği yerdir. Kendinizi tek bir veri bağlantı noktasıyla sınırlandırırsanız, bir kerede yalnızca bir veri aktarımı gerçekleşir. büyük bir dosya aktarımı düşünün. Tek bir veri portu açıkken, transfer tamamlanana kadar başka hiçbir veri taşınamaz. Bu, aktarırken, ikinci bir kullanıcının ftp klasörünün dizin içeriğini bile listeleyemeyeceği anlamına gelir. Tabii ki başarılı bir şekilde giriş yapabilecekler, ancak davranışları veri portlarının hiç açılmamış olması ile aynı olacaktır. Bu konuda sorun yoksa tek bir liman sizin için harika çalışacaktır. Bazı ftp istemcilerinin varsayılan olarak indirmek için tek bir oturumda birden fazla bağlantı kurduğunu unutmayın (yarasadan hemen çıkabileceğimi düşünüyorum). Bu nedenle, bu istemci için, tek bir bağlantı noktası senaryosunda, 1 büyük dosya ve 4 küçük dosyanın toplu transferini düşünün.

Müşteri, hepsi büyük bir dory olan ilk büyük dosya için transferi başlatır. Sonra, bu transfer devam ederken, ikinci bir dosya başlatır. Nafile. Sonra üçüncü, ayrıca zilch (teknik terim). Sonunda, kütük 1 başarılı ve 4 başarısız transfer göstermelidir. Buradaki iş, müşteriyi oturum başına tek bir bağlantıyla sınırlamak olacaktır ve gitmeniz iyi olur (bir başkasının ayağını kapıya sokmadığını ve bir mikrosaniye işleminin tamamlandığını ve bir başkasının henüz başlamadığını varsayarsak). )


2
Ne? Bu tamamen yanlıştır. Bir TCP soketi 4-tuple (kaynak IP, kaynak port, hedef port, hedef IP) ile tanımlanır. IP eşleme: Birçok TCP soketi aynı hedef porttan aynı anda yaratılabilir ve sunulabilir. FTP sunucusu işlemi, aynı anda hem iki, hem de herhangi bir ağ istemcisinden veri sunabilir.
EEAA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.