|
พยายามแปลโดย อดิศร ขาวสังข์
จัดทำเมื่อ 5 พฤษภาคม 2549
อ้างอิง : active_vs_passive_ftp.pdf , http://www.redhat.com/archives/rhl-list/2004-December/msg03339.html
บทนำ
คำถามหนึ่งที่นิยมถามกับบ่อยเมื่อมีการดำเนินการเกี่ยวกับเรื่องของ Firewall และการเชื่อมต่ออินเตอร์เน็ต ก็คือความแตกต่างระกว่าง Active FTP และ Passive FTP รวมถึงวิธีที่ดีที่สุดที่จะสนับสนุนทั้ง Active FTP และ Passive FTP ซึ่งหวังว่าบทความที่จะกล่าวถึงต่อไปนี้จะช่วยสร้างความแจ่มแจ้งในความสับสนเกี่ยวกับการสนับสนุน FTP ในสถานการณ์ที่มีการใช้่งาน Firewall ได้บ้าง
พื้นฐานการทำงาน
FTP เป็นบริการที่ทำงานบน TCP อย่างเดียว นั่นคือไม่มีส่วนประกอบที่เป็น UDP โดย FTP มีการทำงานโดยใช้พอร์ตสองพอร์ตคือ data port และ command port (อาจรู้จักในนาม control port) ซึ่งโดยทั่วไปจะใช้พอร์ตที่ 21 เป็น command port และ ใช้พอร์ต 20 สำหรับ data port แต่จะมีความสับสนเกิดขึ้นเมื่อ data port ไม่เป็นพอร์ต 20 ซึ่งจะขึ้นอยู่กับโหมดการทำงาน
Active FTP
โหมดการทำงานที่เป็น Active FTP เครื่อง client จะเชื่อมต่อจากพอร์ตที่ไม่มีสิทธิพิเศษ (unprivileged port) แบบสุ่มที่มีค่าพอร์ตมากกว่า 1024 (N > 1024) ไปยัง command port (21) ของ FTP Server จากนั้นเครื่อง client ก็จะเริ่มคอยฟัง (listening) พอร์ต N+1 และส่ง FTP command port N+1 ไปยัง FTP Server แล้วเครื่อง FTP Server ก็จะเชื่อมต่อกลับมายังเครื่อง client ตาม data port ที่ได้กำหนดไว้ โดยที่ FTP Server จะเป็น Data Port 21
ดังนั้นในการจัดทำ Firewall เพื่อจะให้สนับสนุน FTP แบบ Active mode จะต้องมีการเปิดช่องทางสื่อสารดังต่อไปนี้
- FTP server's port 21 from anywhere (Client initiates connection)
- FTP server's port 21 to ports > 1024 (Server responds to client's control port)
- FTP server's port 20 to ports > 1024 (Server initiates data connection to client's data port)
- FTP server's port 20 from ports > 1024 (Client sends ACKs to server's data port)
ซึ่งสามารถแสดงรูปการเชื่อมต่อของ Active FTP ดังรูปต่อไปนี้

- Step 1 : command port ของเครื่อง client ติดต่อ command port ของเครื่อง Server และส่ง command PORT 1027
- Step 2 : Server ส่ง ACK กลับไปยัง command port ของเครื่อง client
- Step 3 : Server เริ่มต้นการเชื่อมต่อ (initiate) โดยใช้ data port ของตัวเองคือ 20 ไปยัง data port ของเครื่อง client ที่ถูกกำหนดไว้
- Step 4 : เครื่อง client ส่ง ACK กลับไปยัง Server
ปัญหาหลักของ FTP แบบ Active mode จะอยู่ที่ฝั่ง client โดย FTP client จะไม่สร้างการเชื่อมต่อที่แท้จริงไปยัง data port ของ server กล่าวคือเครื่อง Client คอยฟัง (listening) Server พอร์ตไหน เครื่อง Server ก็จะเชื่อมต่อกลับไปยังพอร์ตนั้นของ client เืมืู่อพิจารณาระบบ Firewall ทางด้าน client จะเห็นว่าเป็นการเริ่มต้น (initiate) การเชื่อมต่อจากระบบภายนอกไปยัง client ที่อยู่ภายใน ซึ่งการเ่ชื่อมต่อแบบนี้ี่มักจะถูกบล็อก
Passive FTP
เพื่อแก้ปัญหาที่ Server เริ่มต้น (initiate) การเชื่อมต่อไปยัง Client ทำให้วิธีการที่แตกต่างกันสำหรับ FTP ก็ได้ถูกพัฒนาขึ้น วิธีการนี้เรียกว่า Passive mode หรือ PASV นั่นคือหลังจาก command ที่ client ใช้สำหรับบอก Server แล้วจะเป็นช่วงของ Passive mode
FTP แบบ Pass mode เครื่อง Client จะเริ่มการเชื่อมต่อทั้งสองไปยัง Server เพื่อเป็นการแก้ปัญหาการกลั่นกรองการเชื่อมต่อ data port ขาเข้าจาก Server ไปยังเครื่อง Client ของตัว Firewall โดยเมื่อมีการเปิดการเชื่อมต่อ FTP เครื่อง Client จะเปิด unprivileged port locally ทั้อสองพอร์ตแบบ random (N > 1024 และ N + 1) โดยที่พอร์ตแรกติดต่อกับ Server บนพอร์ต 21 แต่แทนที่ด้วยการส่ง PORT command ออกมาและอนุญาตให้ Server เชื่อมต่อกลับไปยัง data port ของตัวเอง แล้วclient จะส่ง PASV command ผลที่ได้คือ Server จะเปิด random privileged port (P > 1024) และส่ง PORT P command กลับไปยัง client แล้เครื่อง client จะเริ่มต้นการเชื่อมต่อจากพอร์ต N+1 ไปยังพอร์ต P บน Server เพื่อการถ่ายโอนข้อมูล
ที่เครื่อง Firewall สามารถสนับสนุน Passive mode FTP ด้วยการเปิดช่องสื่อสารที่จำเป็นดังต่อไปนี้
- FTP server's port 21 from anywhere (Client initiates connection)
- FTP server's port 21 to ports > 1024 (Server responds to client's control port)
- FTP server's ports > 1024 from anywhere (Client initiates data connection to random port specified by server)
- FTP server's ports > 1024 to remote ports > 1024 (Server sends ACKs (and data) to client's data port
ซึ่งสามารถแสดงรูปการเชื่อมต่อ FTP แบบ passive mode ดังนี้

- Step 1 : client ติดต่อ Server บน command port และส่ง PASV command
- Step 2 : Server ตอบกลับด้วยพอร์ต 2024 เพื่อบอก client ว่าพอร์ตไหนที่ Server กำลัง listening เพื่อการเชื่อมต่อ data
- Step 3 : client เริ่มต้นการเชื่อมต่อ data จาก data port ของตัวเองไปยัง data port ของ server ที่ถูกระบุ
- Step 4 : Server ส่ง ACK กลับไปยัง data port ของ client
แม้ว่า passive mode FTP สามารถแก้ปัญหาหลายอย่างของฝั่ง client แต่ที่ฝั่ง Server จะมีการเปิดปัญหาขึ้นอย่างมากมาย ปัญหาใหญ่ที่สุดคือจำเป็นต้องอนุญาตให้การเชื่อมต่อรีโมตใด ๆ (any remote connection) สามารถเชื่อมต่อไปยัง high numbered port บน Server ได้ แต่ถ้าใครใช้ WU-FTP หรือ vsftp จะมีจุดเด่นอย่างหนึ่งคือ WU-FTP และ vsftp จะอนุญาตให้ Administrator ระบุช่วงของ Port ที่ FTP ใช้ได้
ตัวอย่างการคอนฟิก vsftp ให้รองรับ Passive FTP ทำได้ด้วยการเพิ่มค่าคอนฟิกเข้าไปใน config file ของ vsftp ดังนี้ :
- กำหนดค่า pasv_enable=YES (ปกติค่า default value จะเป็น YES)
- ระบุค่าพอร์ตสูงสุดที่จะส่งไปยัง FTP client สำหรับการเชื่อมต่อแบบ Passive Mode ซึ่งการเซ็ตค่านี้ใช้สำหรับจำกัดช่วงของพอร์ตเพื่อให้ง่ายต่อการสร้าง rule บน Firewall โดยค่า default value จะเป็น 0 ซึ่งหมายถึงไม่มีการจำกัดช่วงของพอร์ตสูงสุด โดยค่าที่จะระบุต้องไม่เกิน 65535 เช่น
pasv_max_port=33333
- ระบุค่าพอร์ตต่ำสุดที่จะส่งไปยัง FTP client สำหรับการเชื่อมต่อแบบ Passive Mode ซึ่งการเซ็ตค่านี้ใช้สำหรับจำกัดช่วงของพอร์ตเพื่อให้ง่ายต่อการสร้าง rule บน Firewall โดยค่า default value จะเป็น 0 ซึ่งหมายถึงไม่มีการจำกัดช่วงของพอร์ตต่ำสุด โดยค่าที่จะระบุต้องไม่ต่ำกว่า 1024 เช่น
pasv_min_port=3000
เรื่องที่สองเป็นเรื่องเกี่ยวกับการสนับสนุนและการแก้ปัญหา Client ว่าจะยอมสนับสนุน passive mode หรือไม่ ตัวอย่างเช่น command line FTP utility ของ Solaris ไม่สนับสนุน passive mode จึงหลีกเลี่ยงไม่ได้ที่จะต้องใช้ third-party FTP client อย่างเช่น ncftp
จากที่ World Wide Web มีความนิยมกันมาก คนจำนวนมากจึงมีการใช้ web browser เป็น FTP client ซึ่ง browser ส่วนใหญ่จะสนับสนุนเฉพาะ passive FTP เมื่อมีการเรียกใช้งานด้วย URL ที่เป็น ftp://URLs ซึ่งการใช้งานแบบนี้จะใช้งานได้ดีหรือไม่ดีจะขึ้นอยู่กับการคอนฟิก Server และ Fierwall ว่าจะให้สนับสนุนหรือไม่ |