ตั้ง Samba File Server แชร์ไฟล์บน VPS
Samba คือ implementation โอเพ่นซอร์สของ SMB/CIFS protocol ที่ใช้แชร์ไฟล์ระหว่าง Windows, macOS, และ Linux ตั้งแต่ปี 1992 ด้วย Samba บน VPS Linux คุณสามารถสร้าง network file share ที่เข้าได้ทั้งจากเครื่อง Windows โดยใช้ File Explorer เสมือนว่าเป็น network drive ปกติ และจากเครื่อง Linux ผ่าน mount command ทำให้ง่ายต่อการทำงานเป็นทีม ส่งไฟล์ขนาดใหญ่ หรือเก็บเอกสารส่วนกลาง บทความนี้จะอธิบายวิธีติดตั้ง Samba ตั้งค่า user account, workgroup, folder share, และ permission อย่างปลอดภัย
ติดตั้ง Samba บน Ubuntu
sudo apt update
sudo apt install samba samba-client smbclient cifs-utils -y
# เปิดใช้งาน Samba service
sudo systemctl enable --now smbd nmbd
sudo systemctl status smbd
สร้าง User สำหรับ Samba Share
Samba ต้องใช้ Linux user account ในการ authenticate กำหนด user access ดังนั้นเราต้องสร้าง Linux user ก่อน แล้วเพิ่มในฐานข้อมูล Samba
# สร้าง Linux user (หากยังไม่มี)
sudo useradd -m -s /usr/sbin/nologin fileuser
# ตั้ง password
sudo passwd fileuser
# เพิ่ม user ลงใน Samba database
sudo smbpasswd -a fileuser
# พบกับคำถาม "New SMB password:" ให้ตั้ง password ใหม่สำหรับ Samba (อาจเหมือนหรือต่างจาก Linux password ได้)
/usr/sbin/nologin ดังตัวอย่าง ทำให้ secure มากขึ้น user นั้นสามารถแชร์ไฟล์ผ่าน Samba ได้แต่ไม่สามารถเข้า shell ของ VPS ได้
ตั้งค่า Samba Configuration (smb.conf)
ไฟล์ config หลักของ Samba คือ /etc/samba/smb.conf เปิดด้วย nano แล้วแก้ไขตัวแปร global section และเพิ่ม share section
sudo nano /etc/samba/smb.conf
หา section [global] แล้วแก้ไขให้มีค่าต่อไปนี้ (ป้องกันการเข้าถึงจาก outside):
[global]
workgroup = WORKGROUP
server string = VPS File Server
netbios name = VPSFILER
security = user
map to guest = never
# ป้องกัน anonymous login
guest ok = no
# Log
log file = /var/log/samba/log.%m
max log size = 5000
# SMB protocol (ใช้ 3.0+ เพื่อ security)
min protocol = SMB2
max protocol = SMB3
หากต้องการสร้าง share folder เฉพาะผู้ใช้งาน เพิ่ม section นี้ท้ายไฟล์ (แทนที่ /shared/data ด้วยเส้นทางจริง):
[Shared]
path = /shared/data
valid users = fileuser
read only = no
browseable = yes
comment = Shared folder for team
create mask = 0755
directory mask = 0755
สร้างโฟลเดอร์จริงแล้วตั้งค่า permission:
sudo mkdir -p /shared/data
sudo chown fileuser:fileuser /shared/data
sudo chmod 755 /shared/data
ตรวจสอบและ Reload Config
ก่อน restart Samba ต้องตรวจสอบว่า config ไม่มี error ด้วยคำสั่ง testparm
# ตรวจ syntax ของ smb.conf
sudo testparm
# ถ้าไม่มี error ให้ reload Samba
sudo systemctl reload smbd nmbd
เปิด Firewall Port
Samba ใช้ port 139 (NetBIOS) และ 445 (SMB) ต้องเปิด firewall ให้ client เข้าได้
# ถ้าใช้ ufw
sudo ufw allow 139/tcp
sudo ufw allow 445/tcp
# ถ้าใช้ iptables ตรงนี้เป็นแบบ append rule (คงค่า existing rules)
sudo iptables -A INPUT -p tcp --dport 139 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 445 -j ACCEPT
ตรวจสอบว่า Samba ทำงานถูกต้อง
# ตรวจ status ของ Samba services
sudo systemctl status smbd
sudo systemctl status nmbd
# ดูรายชื่อ share ที่ server มีอยู่
sudo smbclient -L localhost
# ดูรายชื่อ user ที่ registered ใน Samba
sudo pdbedit -L
# ลอง access share ด้วย user account
smbclient //localhost/Shared -U fileuser%PASSWORD
testparm หรือ smbclient ขึ้น error ให้ดู /var/log/samba/ ไฟล์ log มี prefix คือชื่อเครื่อง client ที่เข้า ช่วยแก้ปัญหา connection issues ได้อย่างมาก
แก้ปัญหาที่พบบ่อย
Error: "Bad password for user"
Password ใน Samba database ไม่ตรงกับที่พิมพ์ หรือเคย change password ใน Linux แต่ลืมอัปเดตใน Samba ให้ reset password ใหม่:
sudo smbpasswd -a fileuser
# พิมพ์ password ใหม่ 2 ครั้ง
Error: "Permission denied" เมื่อเข้า share
เส้นทาง folder ใน config หรือ ownership/permission ของ folder ไม่ถูกต้อง ตรวจสอบ:
ls -ld /shared/data
# ควรเห็น drwxr-xr-x fileuser fileuser
# ถ้าไม่ใช่ให้แก้ไข:
sudo chown fileuser:fileuser /shared/data
sudo chmod 755 /shared/data
Error: "Share not found" หรือ share ไม่โชว์ใน File Explorer
Config อาจมี syntax error หรือ service ยังไม่ reload ให้ testparm แล้ว reload:
sudo testparm 2>&1 | grep -i error
sudo systemctl reload smbd nmbd
# รอสักครู่แล้วลอง query share ใหม่
sleep 2
smbclient -L localhost
Error: "Connection refused" จากเครื่อง Windows
Port 445 ถูก firewall บล็อก หรือ Samba service ไม่เปิด ให้ตรวจสอบ:
sudo systemctl is-active smbd
sudo netstat -tulnp | grep -E '(139|445)'
# ควรเห็น :139 และ :445 listen อยู่
Error: "The username or password is incorrect"
ตรวจว่า user มี status enable ใน Samba database:
sudo pdbedit -L fileuser
# ถ้าเห็น [U] แสดงว่า enabled หากเห็น [DU] ให้เปิด enable ใหม่:
sudo smbpasswd -e fileuser
คำถามที่พบบ่อย
ต้องใช้ domain controller ไหม?
ไม่จำเป็น สำหรับ workgroup environment เช่นบริษัทเล็กๆ หรือสำนักงาน ใช้ security = user (ตั้งในตัวอย่าง) ก็เพียงพอ Samba จะ authenticate โดยดูจาก user/password ใน pdbedit database หรือ /etc/passwd ถ้าต้องการ Active Directory integration ต้องตั้งเพิ่มเติมอีก
Samba ทำงานได้แบบ anonymous (ไม่ต้อง login) ไหม?
ได้ แต่ไม่แนะนำในการ production เพราะไม่มี access control ถ้าต้องการอยากให้ anonymous access ให้เพิ่มใน config:
[Share_Public]
path = /shared/public
guest ok = yes
read only = yes
browseable = yes
และรู้ว่ามีส่วน "ไม่ปลอดภัย" เสมอ ใช้เฉพาะ read-only public files ที่ไม่ห้ามใครเข้า
ปลอดภัยไหมในการใช้ Samba บน VPS หน้าเน็ต?
SMB/CIFS ถูกออกแบบมาสำหรับ LAN ไม่ใช่ internet ถ้าต้องให้ user ที่อยู่นอกสำนัก access ไฟล์ต้อง tunnel ผ่าน VPN หรือ SSH เช่น sshfs หรือ WireGuard ที่ดีกว่า วิธีอื่น คือลดการเปิด port 445 เฉพาะ IP ที่เชื่อถือได้ ไม่ใช่ open ให้ทั้ง world