ติดตั้ง vsftpd FTP Server บน VPS

ติดตั้ง vsftpd FTP Server บน VPS

กรกฎาคม 2026 · อ่าน 7 นาที

vsftpd (Very Secure FTP Daemon) เป็น FTP server ตัวเบา, ปลอดภัย และง่ายต่อการตั้งค่า ใช้บน Ubuntu/Debian VPS ได้เลย แม้ว่าวันนี้ SFTP (FTP over SSH) ได้รับความนิยมมากขึ้น แต่ FTP/FTPS ยังมีความจำเป็นในบางสถานการณ์ เช่นเมื่อ legacy application ต้องการ FTP หรือเมื่อต้องอนุญาตให้ non-technical users อัพโหลดไฟล์ผ่านโปรแกรม FTP client ธรรมดา วิธีการตั้งค่า vsftpd ให้ปลอดภัยด้วย chroot jail, passive mode, และ TLS encryption เป็นหัวใจสำคัญของบทความนี้

ติดตั้ง vsftpd

sudo apt update
sudo apt install vsftpd -y

# เปิดใช้งาน vsftpd ให้ start โดยอัตโนมัติ
sudo systemctl enable vsftpd
sudo systemctl start vsftpd

ตั้งค่า vsftpd Configuration

ไฟล์หลักสำหรับตั้งค่าอยู่ที่ /etc/vsftpd.conf ให้สำรองไฟล์ต้นฉบับก่อน:

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo nano /etc/vsftpd.conf

แก้ไขเนื้อหาให้มีค่าต่อไปนี้ (ค้นหาและแก้ที่มีอยู่แล้ว, ส่วนที่ไม่มีให้เพิ่มต่อท้าย):

# อนุญาต local users login
local_enable=YES
write_enable=YES

# Chroot jail - จำกัด users ไม่ให้ออกนอก home directory
chroot_local_user=YES
chroot_list_enable=NO

# ปลอดภัยขึ้น: ห้าม anonymous login
anonymous_enable=NO

# Passive mode
pasv_enable=YES
pasv_address=YOUR.VPS.IP.ADDRESS
pasv_min_port=40000
pasv_max_port=40100

# FTPS (FTP over TLS)
ssl_enable=YES
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_tlsv1_2=YES
ssl_tlsv1_3=YES
require_ssl_reuse=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES

# Logging
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES

# Performance
max_clients=200
max_per_ip=4

เปลี่ยน YOUR.VPS.IP.ADDRESS เป็น IP จริงของ VPS (เช่น 192.0.2.10) หรือชื่อ domain ที่ชี้มายัง VPS

สร้าง Self-Signed SSL Certificate สำหรับ FTPS

สำหรับ internal use หรือทดสอบ สามารถสร้าง self-signed certificate:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/ssl/private/vsftpd.pem \
  -out /etc/ssl/private/vsftpd.pem

# ตั้งค่า permission
sudo chmod 600 /etc/ssl/private/vsftpd.pem

สำหรับ production ควรใช้ certificate จากผู้ออกใบรับรอง (CA) เช่น Let's Encrypt หรือจ่าย CA พาณิชย์ แล้วแก้ไข config ให้ชี้ไปยัง certificate ทั่วไป + private key แยกกัน

สร้าง FTP User

สร้าง system user ที่มี home directory สำหรับ FTP:

# สร้าง user ชื่อ ftpuser
sudo useradd -m -d /home/ftpuser -s /usr/sbin/nologin ftpuser

# ตั้งรหัสผ่าน
sudo passwd ftpuser

# ตั้ง permission ให้ home directory เป็น chroot jail
sudo chmod 555 /home/ftpuser
sudo mkdir -p /home/ftpuser/upload
sudo chmod 755 /home/ftpuser/upload
sudo chown ftpuser:ftpuser /home/ftpuser/upload

user นี้จะเข้าถึงไฟล์ได้แต่เฉพาะใน /home/ftpuser และ subdirectories ที่สามารถเขียนได้เช่น upload/ เท่านั้น

เปิด Firewall Ports

FTP ใช้ port 21 สำหรับ control connection และ port range 40000-40100 สำหรับ passive data:

# ถ้าใช้ ufw
sudo ufw allow 21/tcp
sudo ufw allow 40000:40100/tcp

# หรือ iptables
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 40000:40100 -j ACCEPT
Tip: หลังแก้ไข vsftpd.conf ต้องรีสตาร์ทเซอร์วิส: sudo systemctl restart vsftpd ค่าใหม่จึงเข้าใจจริง ตรวจสอบ config syntax ด้วยคำสั่ง sudo vsftpd -olisten=NO /etc/vsftpd.conf (ถ้าไม่มี error ก็ OK)

ตรวจสอบว่า vsftpd ทำงานถูกต้อง

# ตรวจสอบ status
sudo systemctl status vsftpd

# ตรวจว่า port 21 listening
sudo ss -tlnp | grep :21

# ลอง connect ด้วย ftp client (สั่งจากเครื่องอื่น)
ftp YOUR.VPS.IP.ADDRESS
# ป้อน username และ password

# หรือใช้ lftp แบบ one-liner
lftp -u ftpuser,PASSWORD YOUR.VPS.IP.ADDRESS

# ดู log
sudo tail -20 /var/log/vsftpd.log
Tip: ถ้าไม่สามารถเชื่อมต่อได้ ให้ดู /var/log/vsftpd.log หรือ syslog ของระบบ บ่อยครั้งปัญหาแรกคือ firewall, permission ของ home directory, หรือ passive mode address ตั้งผิด

แก้ปัญหาที่พบบ่อย

Error: "500 OOPS: vsftpd: refusing to run with writable root inside chroot()"

vsftpd จะไม่อนุญาตให้ home directory มี write permission เมื่อใช้ chroot ให้ตั้ง permission เป็น 555 หรือ 755 (ไม่มี write bit):

sudo chmod 555 /home/ftpuser

Error: "530 Login incorrect" แม้ username/password ถูก

ตรวจว่า user shell ตั้งเป็น nologin หรือ false:

grep ftpuser /etc/passwd
# ควรเห็น /usr/sbin/nologin หรือ /bin/false ท้ายบรรทัด

# ถ้ายังไม่ถูก ให้แก้:
sudo usermod -s /usr/sbin/nologin ftpuser

Error: "Passive mode connection timeout" หรือ "PASV command returns IP ที่ผิด"

ตรวจสอบ pasv_address ใน /etc/vsftpd.conf ให้ชี้ไปยัง IP จริงที่ client สามารถเข้าถึง หากใช้ load balancer หรือ NAT ให้ใช้ public IP หรือ domain name:

sudo nano /etc/vsftpd.conf
# หา pasv_address= และแก้ให้ถูกต้อง
# pasv_address=1.2.3.4  (public IP)

sudo systemctl restart vsftpd

FTPS client ปฏิเสธ self-signed certificate

เมื่อใช้ self-signed certificate FTP client มักจะเตือนว่า certificate ไม่ถูกต้อง บน ftp CLI สามารถใช้ set ssl:verify-certificate no หรือใน graphical client (เช่น FileZilla) ให้ click "Always trust this host"

Permission denied เมื่ออัพโหลดไฟล์

ตรวจสอบว่า directory ที่อนุญาต write (เช่น upload/) มี owner และ permission ถูกต้อง:

sudo chown ftpuser:ftpuser /home/ftpuser/upload
sudo chmod 755 /home/ftpuser/upload

คำถามที่พบบ่อย

ทำไมถึงต้องใช้ FTP เมื่อมี SFTP อยู่แล้ว?

SFTP ปลอดภัยกว่า FTP มาก และเป็นที่นิยมในปัจจุบัน แต่บางสถานการณ์ยังต้องใช้ FTP เช่น legacy application ที่ถูก hard-code ให้เชื่อมต่อ FTP, ข้อจำกัดของ shared hosting ที่ไม่อนุญาต SSH, หรือเมื่อ non-technical users ใช้ graphical FTP client ที่มีความสะดวกมากกว่า SFTP

Chroot jail มีความสำคัญอย่างไร?

Chroot jail หมายความว่า FTP user จะมองเห็นและเข้าถึงได้เฉพาะไฟล์ใน home directory เท่านั้น แม้ admin account มีสิทธิ์อ่านไฟล์ทั้งระบบ หากไฟล์ FTP server ถูก compromise attacker ก็ไม่สามารถเข้าถึง /etc, /root, หรือ /var/www เว็บไซต์อื่นได้

ควรใช้ FTP หรือ FTPS?

ถ้าใช้บน VPS ส่วนตัว ควรเปิด FTPS (FTP over TLS) เสมอ มิฉะนั้น username/password จะส่งเป็น plain text บนเครือข่าย SFTP ก็ดีเช่นกัน แต่ถ้าระบบหรือ application ต้องการ FTP อย่างเดิม FTPS เป็นตัวเลือกที่ดีขึ้น