Mengapa mode pasif FTP memerlukan rentang port yang bertentangan dengan hanya satu port?

34

Saya berjuang untuk memahami mengapa semua server FTP membutuhkan penggunaan rentang port untuk saluran data mode pasif dan hanya menggunakan satu port data untuk semua koneksi saluran data yang masuk.

Server FTP menangani banyak klien yang terhubung secara bersamaan di port 21. Server web menangani banyak klien yang terhubung secara bersamaan di port 80. Dll.

Lalu mengapa server FTP tidak dapat menggunakan hanya satu port saluran data untuk semua koneksi data pasif yang masuk (dan masih dapat menangani banyak klien yang terhubung secara bersamaan di port itu, katakan port 1024)?

Atau bisakah itu?

Saya tertarik mengetahui detail teknis mengapa hal ini tidak mungkin atau tidak direkomendasikan.

Kurt
sumber
1
Ini mungkin menarik bagi Anda: w3.org/Protocols/rfc959
Matt Simmons
1
Terima kasih, Matt. Ya, saya telah membaca sebagian besar rfc 959, tetapi saya merasa saya tidak benar-benar bisa mendapatkan jawaban yang jelas dari itu untuk apa yang saya ingin tahu. Jawaban dari Karol Piczak adalah jenis informasi yang saya cari.
Kurt

Jawaban:

20

penjelasan yang jelas dan teknis berkaitan dengan beberapa sesi sesi FTP bersamaan ketika mengunci port data ke hanya satu port adalah hal yang paling saya tertarik ketahui secara mendalam. Kapan itu bisa bekerja, kapan itu tidak akan bekerja, mengapa itu mungkin tidak direkomendasikan, dll.

Ini akan menjadi tebakan liar, karena saya belum mengujinya, Anda harus mencobanya sendiri dan melihat apakah ada beberapa masalah lain yang mungkin saya lewatkan.

Saya kira Anda dapat membatasi rentang port pasif ke satu port tunggal . Bahkan Anda dapat melihat dalam pertanyaan ini bahwa rentang port kecil digunakan dalam praktiknya . Secara teoritis, untuk mendukung beberapa koneksi konkuren Anda hanya perlu 4 nilai: IP lokal, port lokal, IP jarak jauh, port jarak jauh menjadi unik. Ini adalah bagaimana Anda membedakan antara koneksi yang berbeda.

Jika Anda mengunci port pada server Anda ke satu nilai tunggal, maka satu-satunya variabel yang tersisa adalah port yang digunakan oleh klien. Ini bukan masalah, selama klien memiliki kumpulan porta singkat gratis yang cukup banyak untuk dipilih. Kecuali itu melakukan NAT berat, Anda tidak perlu khawatir tentang ini. Sekarang, berhati-hatilah karena ini hanya hal-hal teoritis : jika Anda menggunakan banyak port pada server Anda, Anda dapat melipatgandakan jumlah koneksi konkuren hipotetis dengan mengaktifkannumber of ports in rangekoneksi per satu port sisi klien. Tapi itu tidak akan terjadi dalam praktik, karena saya ragu ada implementasi dari klien FTP yang akan mendukung ini (karena itu tidak masuk akal). Ditambah lagi jika klien harus berbagi porta fana dengan cara ini dan tidak bisa hanya membuka yang baru, maka ia memiliki masalah yang jauh lebih parah untuk dihadapi. Jadi, dari perspektif ini Anda harus benar-benar aman menggunakan satu port.

Mari kita pikirkan mengapa satu port saja mungkin tidak cukup .

Pertama-tama, saya bisa menemukan situasi di mana implementasi server FTP yang benar-benar buggy menggunakan hanya nomor port lokal sebagai cara untuk mengidentifikasi transfer data klien. Sekali lagi, saya tidak berpikir FTPd yang layak akan melakukan itu.

Masalah sebenarnya ( ya, Anda dapat mengabaikan semua hal di atas sebagai penyimpangan besar ;-)) adalah rentang port pasif dalam rentang non-privilege .

Ini berarti bahwa nomor port yang Anda pilih tidak dicadangkan per se , dan sebenarnya setiap proses pengguna (tidak memerlukan hak akses root ) dapat mengambilnya sebelum server FTP Anda melakukannya. Jika Anda memiliki kumpulan port yang melimpah untuk dipilih, Anda hanya perlu yang gratis. Jika Anda terikat untuk menggunakan satu-satunya dan itu sudah digunakan, Anda tidak akan dapat menangani transfer dengan benar.

Maaf, jika jawabannya agak terlalu spekulatif. Sejujurnya, saya berusaha keras untuk menemukan alasan mengapa Anda tidak boleh menggunakan satu port dan, selain dari yang terakhir, saya tidak bisa memikirkan bukti keras yang menentangnya. Meskipun demikian, Anda mengajukan pertanyaan yang menarik dan menantang.

Karol J. Piczak
sumber
BTW, jangan ragu untuk mengomentari poin yang terlewat dan ketidakkonsistenan di sini. Bahkan saya sendiri, saya merasa seolah-olah saya sedang mencari jawaban sederhana - ya, Anda bisa. ;-)
Karol J. Piczak
Terima kasih banyak, Karol! Ini tepat pada jenis informasi yang saya cari (dan benar-benar tidak ditemukan di tempat lain). Alasan utama saya mengajukan pertanyaan ini adalah saya ingin tahu apakah aman untuk menyiapkan server FTP di Windows Azure dan mengunci mode pasif ke hanya 1 port (karena Azure membatasi titik akhir). Saya sudah mencobanya, berhasil, dan dengan info Anda, saya juga merasa aman untuk melakukannya. Namun satu-satunya masalah yang tersisa adalah bahwa penyeimbang beban Azure menjatuhkan koneksi kontrol setelah 1 menit selama transfer file (karena idle), jadi saya sedang bekerja pada terowongan TCP dengan tetap hidup untuk memperbaikinya.
Kurt
1
Saya percaya alasan sebenarnya adalah bahwa protokol saluran data tidak memiliki informasi pengenal. Server hanya tahu file mana yang sedang ditransfer dari klien mana yang didasarkan pada nomor port.
Monstieur
4

FTP bergantung pada dua koneksi terpisah, satu untuk aliran kontrol atau perintah, dan satu untuk meneruskan file data dan informasi lain seperti daftar direktori. Aliran kontrol dilakukan melalui koneksi TCP tradisional. Klien mengikat ke port unprivileged tinggi dan mengirim permintaan koneksi ke server FTP, yang terikat ke port 21. Koneksi ini digunakan untuk meneruskan perintah.

Dalam mode Port atau aktif, klien memberi tahu server mana yang merupakan port sekunder dan tidak privat yang akan didengarkan. Server kemudian memulai koneksi data dari port 20 ke port unprivileged yang ditentukan klien.

Mode pasif, mekanisme yang lebih baru, adalah default ketika klien adalah browser web. Alih-alih terikat ke port 20, server memberi tahu klien port mana yang tinggi untuk digunakan untuk transfer data. Data kemudian ditransmisikan melalui port yang tidak privat antara klien dan server.

Untuk detail lebih lanjut, silakan lihat:

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

EDIT

Untuk mengunci server ke port tunggal tertentu, dimungkinkan di beberapa server. Misalnya di vsftpd, Anda memiliki opsi konfigurasi berikut.

   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)

Jika Anda mengatur kedua port ke yang sama, misalnya pasv_max_port = 12345, pasv_min_port = 12345, Anda mungkin bisa mendapatkan apa yang Anda cari. Saya menduga ini akan membatasi jumlah sesi FTP bersamaan yang akan didukung server Anda. Silakan uji untuk memastikan.

dmourati
sumber
1
Terima kasih untuk balasan Anda. Namun apa yang saya tertarik ketahui adalah mengapa, dalam mode pasif, server ftp tidak dapat memberi tahu semua klien untuk menggunakan port yang sama untuk saluran data (katakanlah misalnya port 1024) yang bertentangan dengan memberikan masing-masing klien port acak dari rentang port yang ditentukan? Apa alasan teknisnya, jika ada, mengapa hanya menentukan satu port data tunggal dalam konfigurasi kisaran port server FTP tidak dimungkinkan atau disarankan? Saya akan berpikir server ftp dapat menangani banyak / banyak koneksi simultan bahkan hanya pada satu port saluran data, bukan?
Kurt
1
Karena FTP adalah iblis dan akhirnya harus mati. : D
1
Terima kasih atas hasil edit Anda sehubungan dengan mengunci server ke port tunggal tertentu. Saya sebenarnya telah memikirkan metode itu (dan inilah yang ingin saya capai), tetapi apa yang saya tidak mengerti adalah mengapa hal itu akan membatasi jumlah sesi FTP bersamaan yang dapat didukung server. Apa sebenarnya yang akan mencegah server dari mendukung beberapa sesi FTP bersamaan dalam kasus ini? Karena server FTP jelas mendukung beberapa koneksi konkuren pada port 21, jadi mengapa tidak juga pada port 12345, diambil dari contoh Anda? Saya harus menguji ini secara lebih mendalam.
Kurt
Ini mungkin tidak membatasi jumlah koneksi bersamaan. Itu benar-benar tergantung pada bagaimana server melacak koneksi di beberapa sesi. Cobalah!
dmourati
btw saya harus menunggu dengan menandai jawaban apa pun sebagai jawaban yang diterima, karena penjelasan yang jelas dan teknis mengenai beberapa masalah sesi FTP bersamaan ketika mengunci port data ke hanya satu port adalah hal yang paling saya tertarik ketahui secara mendalam. Kapan itu bisa bekerja, kapan itu tidak akan berhasil, mengapa itu mungkin tidak direkomendasikan, dll.
Kurt
1

Server FTP mungkin dapat mencocokkan koneksi Data Port klien dengan koneksi Control Port mereka berdasarkan IP sumber saja, bukan berdasarkan pada nomor port yang digunakan.

Ini akan memecah FXP (yang mungkin bukan hal buruk) di mana klien terhubung ke dua server (satu dalam mode pasif), kemudian setelah menerima informasi PORT server pasif, meneruskannya ke server mode aktif sebagai perintah PORT sehingga aktif server mode terhubung ke server mode pasif.

Saya menduga bahwa banyak server tidak membuat soket data sampai klien meminta mode pasif. Dalam hal itu, jika dua klien meminta mode pasif pada saat yang sama, soket yang dibuat akan membutuhkan nomor port yang unik.

EDIT : pikirkan alasan lain mengapa server FTP tidak melakukan ini: server tidak dapat membedakan beberapa pengguna dengan alamat IP yang sama.

DerfK
sumber
Terima kasih. Saya kira apa yang saya tidak mengerti adalah mengapa soket saluran data tersebut memerlukan port unik (di server) jika dua atau lebih klien meminta mode pasif pada saat yang sama? Karena saya berpikir, dua atau lebih klien jelas dapat terhubung ke port 21 pada saat yang sama jadi mengapa tidak mengatakan port 1024 (untuk saluran data) pada saat yang sama? Saya merasa ini mungkin pertanyaan bodoh, tapi penolakan saya adalah saya sudah terlalu lama bangun :)
Kurt
Soket itu sendiri harus unik. Anda dapat membuat satu soket mendengarkan pada port dan menerima koneksi sebanyak yang Anda inginkan dari satu socket, atau Anda dapat membuat satu socket per pengguna pada port yang berbeda dan menerima satu koneksi dari setiap socket. Jika Anda telah merancang server untuk bekerja satu soket per pengguna, maka Anda pada dasarnya akan menulis ulang semuanya untuk mengubahnya sebaliknya, dan pada akhirnya, orang-orang di host bersama atau di belakang alamat IP yang sama tidak akan dapat terhubung pada saat yang sama, karena tidak ada cara untuk membedakan koneksi data mereka.
DerfK
Terima kasih. Saya bersyukur atas semua jawaban yang saya terima tentang masalah ini dan saya pikir saya mulai mendapatkan penanganan yang cukup baik sekarang.
Kurt
0

Pada port 21 atau 80 (seperti pada semua port terkenal), ada satu set protokol, yang digunakan klien untuk memberi tahu apa yang diinginkannya. Dengan cara ini server tahu apa yang Anda hubungkan. Pada port koneksi data, tidak ada protokol. Semua yang diketahui server - satu-satunya hal yang unik tentang koneksi itu - adalah nomor port yang Anda hubungkan.

Jika Anda terhubung ke port yang sama setiap kali, server tidak akan dapat memberi tahu file apa yang Anda hubungkan. Nomor port berfungsi sebagai penghubung antara permintaan transfer pada koneksi kontrol dan koneksi data.

Jika dua klien meminta transfer pada saat yang sama, ketika server menerima koneksi pada satu port, server tidak akan dapat memberi tahu file apa yang akan ditransfer. Tentu saja, server dapat menggunakan IP klien untuk mengambil keputusan (sebenarnya banyak server FTP yang memvalidasi bahwa IP klien cocok dengan IP yang digunakan pada koneksi kontrol, untuk keamanan).

Tetapi ini tidak akan berhasil untuk:

  • Banyak koneksi dari mesin yang sama (sebagian besar klien FTP mendukung transfer / antrian paralel).
  • Koneksi dari mesin yang berbeda dalam jaringan (perusahaan) yang sama, karena mereka memiliki IP eksternal yang sama.

Lihat juga koneksi data FTP yang digunakan kembali .

Martin Prikryl
sumber
-1

Saya tidak melihat ini disebutkan di sini, jadi saya akan melemparkannya. Penugasan jangkauan port dimaksudkan untuk menjadi semacam fitur keamanan, di mana Anda tidak dapat memonitor satu port untuk lalu lintas data, data dikirim pada port acak di kisaran, yang tidak dapat dengan mudah ditentukan. Keamanan melalui ketidakjelasan.

Grantnoturbus
sumber
1
Apakah Anda punya referensi untuk klaim ini?
Martin Prikryl
-2

Kedengarannya seperti Anda sudah tahu tentang port kontrol dan port data jadi saya akan memotong langsung ke pengejaran. Port kontrol pada dasarnya meledak komunikasi, seperti port 80 untuk situs web. mereka dapat menangani banyak permintaan yang berbeda (tidak secara bersamaan, tetapi sangat dekat karena mereka sangat cepat untuk menyelesaikan). port data di sisi lain adalah tempat keajaiban terjadi dengan FTP. Jika Anda membatasi diri pada satu port data tunggal, hanya satu transfer data yang terjadi pada suatu waktu. pertimbangkan transfer file besar. Dengan satu port data terbuka, tidak ada data lain yang dapat bergerak sampai transfer selesai. Ini berarti bahwa saat mentransfer, pengguna kedua bahkan tidak akan dapat membuat daftar isi direktori folder ftp. Tentu mereka akan dapat masuk dengan sukses, tetapi perilaku mereka akan sama seperti jika port data tidak terbuka sama sekali. Jika Anda setuju dengan ini, satu port akan bekerja bagus untuk Anda. Perlu diingat bahwa beberapa klien ftp (saya bisa memikirkan 1 langsung dari kelelawar) secara default mengatur beberapa koneksi dalam satu sesi untuk mengunduh. Jadi untuk klien ini, dalam skenario port tunggal, pertimbangkan transfer batch 1 file besar dan 4 file kecil.

Klien memulai transfer untuk file besar pertama, semua keren. Kemudian, saat transfer berlangsung, ia memulai file kedua. Tidak ada dadu. Lalu yang ketiga, juga nihil (istilah teknis). Pada akhirnya, log harus menunjukkan 1 transfer berhasil dan 4 gagal. Pekerjaan di sekitar adalah membatasi klien untuk satu koneksi per sesi dan Anda akan baik untuk pergi (dengan asumsi orang lain tidak mendapatkan kaki mereka di pintu yang sangat mikrodetik satu transfer selesai dan yang lain belum dimulai. )

Andrew
sumber
2
Apa? Ini sepenuhnya salah. Soket TCP didefinisikan oleh tupel 4 (sumber IP, port sumber, port tujuan, IP tujuan). Banyak soket TCP dapat dibuat dan disajikan secara bersamaan dari port tujuan yang sama: pemetaan IP. Proses server FTP dapat melayani data dua dan dari sejumlah klien jaringan secara bersamaan.
EEAA