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.
Jawaban:
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 mengaktifkan
number of ports in range
koneksi 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.
sumber
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.
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.
sumber
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.
sumber
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:
Lihat juga koneksi data FTP yang digunakan kembali .
sumber
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.
sumber
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. )
sumber