เมื่อเตรียม Ubuntu Server สำหรับใช้งานในห้องปฏิบัติการหรือองค์กร เรามักต้องทำสามอย่างต่อเนื่องกัน: กำหนด IP ที่เข้าถึงได้แน่นอน เปิดบริการ SSH เพื่อดูแลเครื่องจากระยะไกล และเลือกวิธีส่งไฟล์ที่เหมาะสม บทความนี้แสดงคำสั่งทีละขั้น พร้อมวิธีตรวจผลและแก้ปัญหาเบื้องต้น

ขอบเขตตัวอย่าง: Ubuntu Server รุ่นปัจจุบันที่ใช้ Netplan; ตัวอย่างเครือข่าย 192.168.1.0/24, เซิร์ฟเวอร์ 192.168.1.10, เกตเวย์ 192.168.1.1, อินเทอร์เฟซ ens33 และชื่อผู้ดูแล admin เปลี่ยนค่าเหล่านี้ให้ตรงกับเครื่องของคุณก่อนรันคำสั่ง โดยเฉพาะชื่ออินเทอร์เฟซและช่วง IP ห้ามเลือก IP ที่มีอุปกรณ์อื่นใช้อยู่

#เลือกโปรโตคอลส่งไฟล์ก่อน

วิธี ใช้บริการ พอร์ตทั่วไป การเข้ารหัส เหมาะกับ
FTP vsftpd TCP 21 และพอร์ตข้อมูล ไม่มี ห้องทดลองเครือข่ายที่แยกออกจากอินเทอร์เน็ตเท่านั้น
SFTP OpenSSH TCP 22 เข้ารหัสผ่าน SSH งานส่งไฟล์ทั่วไป แนะนำให้เริ่มจากวิธีนี้
FTPS แบบ explicit vsftpd + TLS TCP 21 และช่วงพอร์ต passive เข้ารหัสด้วย TLS ลูกค้าหรือระบบเดิมที่กำหนดให้ใช้ FTP/FTPS

SFTP ไม่ใช่ FTP ที่เปิด TLS: SFTP ทำงานผ่าน SSH ส่วน FTPS คือ FTP ที่เพิ่ม TLS หากไม่มีข้อกำหนดให้ใช้ FTP ให้ติดตั้ง SSH แล้วใช้ SFTP ได้เลย โดยไม่ต้องติดตั้ง vsftpd หรือเปิดพอร์ต 21 เอกสาร Ubuntu เตือนว่า FTP ปกติส่งรหัสผ่านและข้อมูลโดยไม่เข้ารหัส [1][2]

#1. ตรวจข้อมูลเครือข่ายก่อนแก้ไข

บนเซิร์ฟเวอร์ รันคำสั่ง:

ip -br address
ip route
ls -l /etc/netplan/
sudo netplan get

จดชื่ออินเทอร์เฟซจริง เช่น ens33, enp0s3 หรือ eth0 พร้อม IP, default gateway และไฟล์ YAML ที่กำหนดค่าอยู่แล้ว หากเป็น VM บนคลาวด์หรือไฟล์ชื่อ 50-cloud-init.yaml ที่สร้างโดย cloud-init ให้ตรวจวิธีกำหนดเครือข่ายของผู้ให้บริการก่อนแก้ Netplan เพราะระบบจัดการคลาวด์อาจสร้างไฟล์ใหม่ทับภายหลัง

เครื่องที่เข้าผ่าน SSH อยู่: เตรียม console ของ VM, hypervisor หรือ cloud provider ให้พร้อมก่อนเปลี่ยน IP การเปลี่ยนที่อยู่เครือข่ายอาจทำให้ SSH เดิมหลุดทันที

#2. กำหนด IP แบบคงที่ด้วย Netplan

เปิดไฟล์ YAML ที่กำหนดอินเทอร์เฟซนี้อยู่แล้ว เช่น:

sudo cp -a /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
sudo nano /etc/netplan/00-installer-config.yaml

ชื่อไฟล์เป็น ตัวอย่าง ให้แทนด้วยไฟล์ที่พบจริงจาก ls -l /etc/netplan/ และอย่าสร้างคำจำกัดความ ens33 ซ้ำหลายไฟล์โดยไม่ตรวจผลรวมจาก sudo netplan get ใส่ค่าแบบนี้สำหรับเครือข่ายตัวอย่าง:

network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: false
      addresses:
        - 192.168.1.10/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [192.168.1.1, 1.1.1.1]

/24 เท่ากับ subnet mask 255.255.255.0; routes ระบุ default gateway; nameservers ระบุ DNS ไฟล์ YAML ใช้การย่อหน้าด้วยช่องว่าง ห้ามใช้แท็บ ตรวจแล้วทดลองใช้:

sudo netplan generate
sudo netplan try --timeout 120

ถ้าเครือข่ายใหม่เข้าถึงได้ ให้ยืนยันในหน้าต่าง netplan try ภายในเวลาที่กำหนด แล้วตรวจ:

ip -br address show ens33
ip route
resolvectl status ens33
ping -c 3 192.168.1.1
ping -c 3 1.1.1.1
getent hosts ubuntu.com

ระหว่างการลองผ่าน SSH ให้เปิดการเชื่อมต่อใหม่ไปยัง 192.168.1.10 เพื่อตรวจด้วย หาก netplan try หมดเวลา ระบบจะพยายามย้อนค่ากลับ แต่ควรตรวจสภาพเครือข่ายจริงผ่าน console อีกครั้ง เพราะการย้อนค่าอาจไม่สมบูรณ์ในบางสถานการณ์ [3]

ถ้าต้องการรับ IP จาก DHCP แทน ให้กำหนด dhcp4: true สำหรับอินเทอร์เฟซ แล้วนำ addresses, routes และ DNS แบบคงที่ออก การจอง IP ตาม MAC address ที่เราเตอร์/DHCP server เป็นอีกทางสำหรับเครื่องใน LAN โดยไม่ต้องเปลี่ยนการตั้งค่า IP บนเซิร์ฟเวอร์ [1]

#3. ติดตั้งและเปิด SSH Server

sudo apt update
sudo apt install openssh-server
sudo systemctl enable --now ssh
sudo systemctl status ssh --no-pager

ก่อนเปิด UFW ให้เพิ่มกฎ SSH ให้ตรงกับต้นทางที่ต้องเชื่อมต่อ ตัวอย่างนี้อนุญาตเฉพาะ LAN 192.168.1.0/24:

sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
sudo ufw status
sudo ufw enable
sudo ufw status verbose

หากเชื่อมต่อจากนอก LAN ให้ใช้ IP สาธารณะของผู้ดูแลหรือ VPN แทนช่วง LAN ในกฎนี้ และเปิดพอร์ตที่บริการเดิมต้องใช้อยู่ก่อนสั่ง ufw enable ด้วย ถ้าเซิร์ฟเวอร์อยู่บนคลาวด์ ให้ตรวจ firewall/security group ของผู้ให้บริการควบคู่กัน [4]

จากเครื่องลูกข่ายที่มีโปรแกรม SSH:

ssh admin@192.168.1.10

admin ต้องเป็นบัญชีผู้ใช้ที่มีอยู่จริงบนเซิร์ฟเวอร์; การติดตั้ง openssh-server ไม่ได้สร้างบัญชี admin ให้โดยอัตโนมัติ

#แนะนำ: ใช้ SSH key

รันบน เครื่องลูกข่าย:

ssh-keygen -t ed25519
ssh-copy-id admin@192.168.1.10
ssh admin@192.168.1.10

ตั้ง passphrase ให้ private key และเก็บไฟล์ private key ไว้กับตัวเอง ssh-copy-id พบได้ทั่วไปบน Linux/macOS; บน Windows สามารถใช้ OpenSSH client แล้วนำเนื้อหาจากไฟล์ public key id_ed25519.pub ไปเพิ่มใน ~/.ssh/authorized_keys ของผู้ใช้บนเซิร์ฟเวอร์ ตรวจสิทธิ์ของ .ssh และ authorized_keys หากเข้าด้วย key ไม่ได้ [2]

หลังจาก ยืนยันว่า key ใช้เข้าสู่ระบบใน SSH หน้าต่างใหม่ได้แล้ว จึงค่อยเพิ่มการตั้งค่าบนเซิร์ฟเวอร์ เช่น /etc/ssh/sshd_config.d/00-local-hardening.conf:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no

ตรวจไฟล์และการตั้งค่าที่มีผลจริงก่อนโหลดบริการใหม่:

sudo sshd -t
sudo sshd -T | grep -E '^(permitrootlogin|pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication) '
sudo systemctl reload ssh

Ubuntu รองรับไฟล์ตั้งค่าแยกใน sshd_config.d/; ค่าเดียวกันที่ปรากฏในหลายไฟล์อาจมีลำดับการอ่านกำกับอยู่ จึงต้องตรวจด้วย sshd -T อย่าปิด SSH session ที่ใช้งานอยู่จนกว่าจะลองเปิด session ใหม่สำเร็จ [2]

#4. ส่งไฟล์ด้วย SFTP: วิธีที่ควรลองก่อน

SFTP ใช้ OpenSSH ที่ติดตั้งในขั้นก่อนและพอร์ต 22 เดิม จาก เครื่องลูกข่าย:

sftp admin@192.168.1.10

ในพรอมป์ต์ sftp> ลองคำสั่ง:

pwd
ls
put example.txt
get report.txt
bye

ไฟล์ example.txt ต้องอยู่ในเครื่องลูกข่ายก่อน และผู้ใช้ admin ต้องมีสิทธิ์เขียนในปลายทาง หากใช้ FileZilla ให้เลือก Protocol: SFTP - SSH File Transfer Protocol, Host 192.168.1.10, Port 22 แล้วระบุผู้ใช้/วิธีล็อกอินที่ตั้งไว้ การติดตั้ง SFTP ไม่ต้องเปิด TCP 21 [2]

#5. เมื่อต้องใช้ FTP Server จริง: ตั้ง vsftpd ให้เป็น FTPS

ส่วนนี้เป็น ทางเลือก สำหรับระบบที่ต้องรองรับ FTP/FTPS โดยเฉพาะ ตัวอย่างใช้ explicit FTPS บน TCP 21 และ passive data ports 40000–40100 ไม่ควรนำ FTP ที่ไม่เข้ารหัสไปใช้กับบัญชีจริงบนเครือข่ายสาธารณะ [5]

ติดตั้งบริการและสร้างผู้ใช้ตัวอย่าง:

sudo apt install vsftpd openssl
sudo adduser ftpuser
sudo chown root:root /home/ftpuser
sudo chmod 755 /home/ftpuser
sudo install -d -m 750 -o ftpuser -g ftpuser /home/ftpuser/upload
sudo cp -a /etc/vsftpd.conf /etc/vsftpd.conf.bak

ไดเรกทอรี /home/ftpuser เป็นขอบเขต chroot ที่ผู้ใช้เขียนไม่ได้ ส่วน /home/ftpuser/upload เป็นที่อัปโหลดที่ผู้ใช้เขียนได้ การจัดสิทธิ์นี้ช่วยหลีกเลี่ยงข้อผิดพลาดของ vsftpd เมื่อ chroot ไปยังไดเรกทอรีที่ผู้ใช้แก้ไขได้

สร้างใบรับรอง สำหรับทดลองใน LAN โดยแก้ชื่อ CN ให้ตรงกับชื่อเซิร์ฟเวอร์ของคุณ:

sudo openssl req -x509 -newkey rsa:3072 -nodes -days 365 \
  -keyout /etc/ssl/private/vsftpd.key \
  -out /etc/ssl/certs/vsftpd.crt \
  -subj "/CN=ftp.example.com"
sudo chmod 600 /etc/ssl/private/vsftpd.key

ใบรับรอง self-signed ทำให้ไคลเอนต์เตือนเรื่องความน่าเชื่อถือ ใช้งานจริงควรใช้ใบรับรองจาก CA ที่ไคลเอนต์เชื่อถือและตรงกับชื่อโดเมนที่เชื่อมต่อ [5]

เปิด /etc/vsftpd.conf และ แก้ค่าที่มีอยู่ให้ตรงด้านล่าง; ถ้าไม่มีจึงเพิ่มใหม่ อย่าใส่ชื่อ directive ซ้ำ โดยคงค่าอื่นของแพ็กเกจที่ไม่เกี่ยวข้องไว้:

listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
ssl_enable=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key

ตัวอย่างนี้รับ IPv4; หากใช้ IPv6 ให้ตรวจวิธี listen ที่เหมาะสมกับระบบของคุณ กรณีอยู่หลัง NAT หรือเราเตอร์ อาจต้องกำหนด pasv_address=<public-ip> และทำ port forwarding TCP 21 กับช่วง passive เดียวกัน การเปิดพอร์ตใน UFW เพียงจุดเดียวไม่เพียงพอหากมี firewall ของคลาวด์หรือเราเตอร์อยู่อีกชั้น

เปิดพอร์ต FTPS เฉพาะจากเครือข่ายที่ต้องใช้ เช่น LAN ตัวอย่าง แล้วเริ่มบริการ:

sudo ufw allow from 192.168.1.0/24 to any port 21 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 40000:40100 proto tcp
sudo systemctl enable --now vsftpd
sudo systemctl restart vsftpd
sudo systemctl status vsftpd --no-pager
sudo ufw status numbered

ใน FileZilla เลือก Protocol: FTP - File Transfer Protocol, Encryption: Require explicit FTP over TLS, Host 192.168.1.10, Port 21, User ftpuser และเลือกโหมด passive จากนั้นอัปโหลดไฟล์เข้า upload/ และทดสอบดาวน์โหลดกลับ หากใช้ใบรับรอง self-signed ให้ตรวจลายนิ้วมือใบรับรองผ่านช่องทางที่เชื่อถือได้ก่อนกดยอมรับ หลีกเลี่ยงการเลือกโหมดไม่เข้ารหัสเพื่อแก้ปัญหาเชื่อมต่อ [5]

#6. ตรวจสอบและแก้ปัญหา

ip -br address
ip route
sudo ss -lntp | grep -E ':(22|21|40000)\b'
sudo ufw status verbose
sudo journalctl -u ssh -n 50 --no-pager
sudo journalctl -u vsftpd -n 50 --no-pager
อาการ จุดที่ตรวจ
เปลี่ยน IP แล้วเข้าไม่ได้ ชื่ออินเทอร์เฟซ, IP ซ้ำ, gateway, subnet, console และผล ip route
SSH แจ้ง Connection refused systemctl status ssh, พอร์ต 22, UFW และ firewall ภายนอก
SSH แจ้ง Permission denied (publickey) ชื่อผู้ใช้, public key ใน authorized_keys, สิทธิ์ไฟล์ และผล sshd -T
FTPS ล็อกอินได้แต่แสดงรายการไฟล์ไม่ได้ passive ports, NAT/pasv_address, firewall ทุกชั้น และการตั้งค่า passive ของไคลเอนต์
FTPS แจ้งข้อผิดพลาด chroot สิทธิ์ของ /home/ftpuser และ /home/ftpuser/upload
ต่อ FTPS แล้วเตือนใบรับรอง ชื่อโฮสต์ไม่ตรงหรือใช้ self-signed; ใช้ใบรับรองที่เชื่อถือได้สำหรับงานจริง

สรุปการเลือกใช้งาน: เครื่องทั่วไปใช้ Netplan เพื่อกำหนด IP, OpenSSH สำหรับรีโมต และ SFTP สำหรับส่งไฟล์ หากจำเป็นต้องรองรับไคลเอนต์ FTP ให้ใช้ vsftpd ร่วมกับ TLS, กำหนดช่วง passive ให้ตรงทุก firewall และทดสอบการอัปโหลด/ดาวน์โหลดจริง

#แหล่งอ้างอิง

  1. Ubuntu Server: Configuring networks
  2. Ubuntu Server: OpenSSH server
  3. Ubuntu manual: netplan-try
  4. Ubuntu Server: Firewall
  5. Ubuntu Server: Set up an FTP server

ตรวจทานเนื้อหา: 26 กันยายน 2026