ห้องสอนสด

Linux และการดูแลเซิร์ฟเวอร์ VPS

คู่มือภาคปฏิบัติสำหรับดูแลเซิร์ฟเวอร์ Linux จริง โดยถือว่าคุณมี VPS ของ Hostinger อยู่แล้ว และพาเดินครบทั้งเส้นทาง: เชื่อมต่อผ่าน SSH, หาทางในระบบไฟล์, จัดการไฟล์ สิทธิ์ และผู้ใช้, ติดตั้งซอฟต์แวร์, ควบคุมโปรเซสและเซอร์วิส, ทำงานกับเครือข่าย และปิดท้ายด้วยการล็อกเครื่องให้แน่นหนาด้วยกุญแจ SSH, ไฟร์วอลล์ และเช็กลิสต์เสริมความปลอดภัย ทุกคำสั่งอ้างอิงกับ VPS แบบ Debian/Ubuntu (ค่าเริ่มต้นที่ Hostinger ติดตั้งให้) ข้อความเชิงข้อเท็จจริงทุกข้ออ้างอิงจากแหล่งที่ระบุไว้ท้ายแต่ละหัวข้อ

01 / 12

รู้จัก Linux และการเชื่อมต่อ VPS

VPS เกือบทุกตัวรัน Linux เพราะฟรี เสถียร เขียนสคริปต์ควบคุมได้ และออกแบบมาสำหรับเซิร์ฟเวอร์ที่ไม่มีจอ คุณควบคุมมันทั้งหมดผ่านเชลล์แบบข้อความที่เข้าถึงด้วย SSH

Linux คืออะไรกันแน่

Linux คือเคอร์เนล — โปรแกรมแกนกลางที่คุยกับฮาร์ดแวร์ ส่วน “ดิสทริบิวชัน” (distro) คือการรวมเคอร์เนลนั้นเข้ากับตัวจัดการแพ็กเกจ เครื่องมือระบบ และค่าเริ่มต้นต่าง ๆ เซิร์ฟเวอร์บนอินเทอร์เน็ตส่วนใหญ่รัน Linux จึงเป็นเหตุผลที่คู่มือ VPS แทบทุกฉบับถือว่าใช้ Linux [1] บนเซิร์ฟเวอร์จะไม่มีหน้าจอเดสก์ท็อป คุณพิมพ์คำสั่งลงในเชลล์ (มักเป็น bash) แล้วระบบตอบกลับเป็นข้อความ

Debian และ Ubuntu

เทมเพลต VPS ของ Hostinger เป็นตระกูล Debian โดยค่าเริ่มต้น และ Ubuntu เป็นตัวเลือกที่พบบ่อยที่สุด ทั้งคู่ใช้ตัวจัดการแพ็กเกจ APT และ systemd ดังนั้นทุกคำสั่งในคู่มือนี้ใช้ได้กับทั้งสอง [2] ตรวจดูว่าใช้รุ่นใดด้วย `cat /etc/os-release`

กายวิภาคของพรอมป์เชลล์

ส่วนตัวอย่างความหมาย
userrootคุณล็อกอินในชื่อผู้ใช้ใด
hostsrv01ชื่อโฮสต์ของเครื่อง
path~ไดเรกทอรีปัจจุบัน (~ = โฮมของคุณ)
symbol# vs $# = root (อำนาจเต็ม), $ = ผู้ใช้ทั่วไป

พรอมป์อย่าง root@srv01:~# บอกว่าใคร อยู่ที่ไหน และมีอำนาจแค่ไหน

เชื่อมต่อผ่าน SSH ครั้งแรก

แผงควบคุมของ Hostinger จะแสดงไอพีของ VPS และรหัสผ่าน root เริ่มต้น (หรือให้ตั้งกุญแจ SSH ได้) จากเทอร์มินัลในเครื่องคุณเอง:

  1. 1เปิดเทอร์มินัล (macOS/Linux: Terminal; Windows: PowerShell หรือ Windows Terminal)
  2. 2รัน `ssh root@YOUR_SERVER_IP` แล้วกด Enter
  3. 3ครั้งแรกที่เชื่อมต่อ ให้พิมพ์ `yes` เพื่อยอมรับ fingerprint ของเซิร์ฟเวอร์
  4. 4ใส่รหัสผ่าน root จากแผงควบคุม Hostinger (จะไม่มีอะไรแสดงระหว่างพิมพ์ — เป็นเรื่องปกติ)
  5. 5ตอนนี้คุณอยู่ที่พรอมป์ `#` ล็อกอินเข้าเซิร์ฟเวอร์แล้ว [3][4]

เซสชัน SSH ครั้งแรก

$ ssh root@203.0.113.10
The authenticity of host '203.0.113.10' can't be established.
ED25519 key fingerprint is SHA256:abc123...
Are you sure you want to continue connecting? yes
root@203.0.113.10's password:
Welcome to Ubuntu 24.04 LTS
root@srv01:~#

อย่าใช้ชีวิตเป็น root

การล็อกอินเป็น root ใช้งานได้ แต่ root สามารถทำลายระบบได้ด้วยการพิมพ์ผิดครั้งเดียว และเป็นเป้าหมายอันดับหนึ่งของผู้โจมตี ในหัวข้อ “ผู้ใช้” คุณจะสร้างบัญชีผู้ใช้ทั่วไปที่มี sudo แล้วเลิกใช้ root โดยตรง ตอนนี้แค่จำไว้ว่าเป้าหมายคือทิ้ง root ไป

02 / 12

โครงสร้างระบบไฟล์และการนำทาง

Linux วางทุกอย่างไว้ในต้นไม้เดียวที่เริ่มจาก `/` (ไดเรกทอรีราก) — ไม่มีไดรฟ์ C: หรือ D: การรู้จักไดเรกทอรีมาตรฐานจะบอกได้ว่าไฟล์คอนฟิก ล็อก และไฟล์ของคุณเองอยู่ที่ไหน

ต้นไม้เดียว ทุกอย่างคือไฟล์

ต่างจาก Windows ตรงที่ Linux ไม่มีตัวอักษรไดรฟ์ ดิสก์ พาร์ทิชัน และอุปกรณ์จำนวนมากปรากฏอยู่ที่ใดที่หนึ่งภายใต้ `/` โครงสร้างนี้เป็นไปตาม Filesystem Hierarchy Standard เพื่อให้แอดมินรู้ว่าควรไปหาที่ไหนในทุกดิสโทร [1]

ไดเรกทอรีที่คุณจะได้ใช้จริง

พาธเก็บอะไรหมายเหตุ
/รากของทุกสิ่งพาธอื่นทั้งหมดแตกออกจากตรงนี้
/homeไฟล์ของผู้ใช้ทั่วไปบัญชีของคุณอยู่ใน /home/<ชื่อ>
/rootโฮมของผู้ใช้ rootไม่ใช่ตัวเดียวกับ /
/etcไฟล์คอนฟิกของระบบsshd_config, nginx ฯลฯ — เป็นไฟล์ข้อความ [2]
/varข้อมูลที่เปลี่ยนแปลง/var/log เก็บล็อก รวมถึงข้อมูลเว็บ
/tmpไฟล์ชั่วคราวถูกล้างเมื่อรีบูต
/usrโปรแกรมที่ติดตั้ง/usr/bin เก็บคำสั่งส่วนใหญ่

พาธสัมบูรณ์ vs พาธสัมพัทธ์

พาธสัมบูรณ์ (absolute) เริ่มจาก `/` และไม่กำกวม (`/etc/ssh/sshd_config`) ส่วนพาธสัมพัทธ์ (relative) อ่านจากตำแหน่งที่คุณอยู่ตอนนั้น มีทางลัดสามตัวช่วยประหยัดการพิมพ์: `~` คือโฮมของคุณ, `.` คือไดเรกทอรีปัจจุบัน และ `..` คือไดเรกทอรีแม่

การเคลื่อนที่ไปมา

คำสั่งทำอะไร
pwdแสดงไดเรกทอรีที่คุณอยู่
lsแสดงรายการไฟล์ตรงนี้
ls -lahแสดงแบบยาว ทุกไฟล์ ขนาดอ่านง่าย [3]
cd /etcไปยังพาธสัมบูรณ์
cd ..ขึ้นไปหนึ่งระดับ
cd (หรือ cd ~)กลับไปไดเรกทอรีโฮมของคุณ
cd -กลับไปไดเรกทอรีก่อนหน้า

การนำทาง

root@srv01:~# pwd
/root
root@srv01:~# cd /var/log
root@srv01:/var/log# ls -lah
drwxr-xr-x 2 root root 4.0K Jun 29 09:12 .
-rw-r----- 1 syslog adm 88K Jun 29 09:30 syslog
-rw-r----- 1 syslog adm 12K Jun 29 09:30 auth.log
root@srv01:/var/log# cd ~

03 / 12

การทำงานกับไฟล์และไดเรกทอรี

การสร้าง คัดลอก ย้าย อ่าน และลบไฟล์คืองานประจำวันของการดูแลเซิร์ฟเวอร์ คำสั่งไม่กี่ตัวบวกกับการเปลี่ยนทิศทาง (redirection) และไปป์ (pipe) ครอบคลุมงานเกือบทั้งหมด

คำสั่งจัดการไฟล์หลัก

คำสั่งทำอะไร
mkdir dirสร้างไดเรกทอรี (mkdir -p a/b/c สร้างทั้งพาธ) [1]
touch fileสร้างไฟล์ว่าง / อัปเดตเวลาแก้ไข
cp a bคัดลอก a ไป b (cp -r สำหรับไดเรกทอรี) [2]
mv a bย้ายหรือเปลี่ยนชื่อ a เป็น b
rm fileลบไฟล์ (rm -r สำหรับไดเรกทอรี) [3]
cat fileแสดงทั้งไฟล์
less fileเลื่อนอ่านไฟล์ (กด q เพื่อออก)
head / tail file10 บรรทัดแรก / ท้าย (tail -f ตามแบบสด)
nano fileแก้ไขไฟล์ในโปรแกรมแก้ไขแบบง่ายบนเทอร์มินัล

ลำดับงานทั่วไป

root@srv01:~# mkdir -p projects/site
root@srv01:~# cd projects/site
root@srv01:~/projects/site# touch index.html
root@srv01:~/projects/site# cp index.html backup.html
root@srv01:~/projects/site# mv backup.html index.bak
root@srv01:~/projects/site# ls
index.bak index.html

rm ไม่มีปุ่มย้อนกลับ

ไม่มีถังขยะ `rm -rf /path` ลบไดเรกทอรีและทุกอย่างข้างในอย่างถาวรและเงียบ ๆ ตรวจพาธให้ดีก่อนกด Enter และอย่ารัน `rm -rf` กับตัวแปรที่ยังไม่ได้ตรวจสอบ — `rm -rf $DIR/` เมื่อ $DIR ว่าง จะกลายเป็น `rm -rf /`

แก้ไขไฟล์ด้วย nano

`nano /etc/hostname` เปิดโปรแกรมแก้ไขที่ใช้ง่าย พิมพ์เพื่อแก้ไขได้เลย แถบล่างแสดงคีย์ลัดโดยที่ `^` หมายถึง Ctrl บันทึกด้วย Ctrl+O แล้ว Enter และออกด้วย Ctrl+X เป็นโปรแกรมแก้ไขที่ง่ายที่สุดสำหรับไฟล์คอนฟิกเมื่อเริ่มต้น

การเปลี่ยนทิศทางและไปป์

`>` ส่งผลลัพธ์ของคำสั่งไปเขียนทับลงไฟล์ ส่วน `>>` ต่อท้าย ไปป์ `|` ป้อนผลลัพธ์ของคำสั่งหนึ่งเข้าสู่คำสั่งถัดไป และ `grep` กรองบรรทัดตามแพตเทิร์น [4] สามตัวนี้รวมกันเป็นคำสั่งบรรทัดเดียวที่ทรงพลังสำหรับค้นล็อกและคอนฟิก

การเปลี่ยนทิศทางและไปป์

# เขียน แล้วต่อท้าย
echo 'hello' > note.txt
echo 'second line' >> note.txt
# หาทุกครั้งที่ล็อกอิน SSH ล้มเหลวในล็อก auth
grep 'Failed password' /var/log/auth.log
# นับว่าเกิดขึ้นกี่ครั้ง
grep -c 'Failed password' /var/log/auth.log

แบบฝึกหัด

  • 1

    คุณอยู่ใน /root จงเขียนคำสั่งเดียวเพื่อสร้างไดเรกทอรีซ้อน /root/app/logs ในขั้นตอนเดียว

    ดูเฉลย

    คำตอบ: mkdir -p app/logs

    วิธีทำ

    -p สร้างไดเรกทอรีแม่ที่ขาดหายทุกระดับ และไม่ขึ้น error ถ้ามีอยู่แล้ว
  • 2

    `cat file.txt > out.txt` กับ `cat file.txt >> out.txt` ต่างกันอย่างไร

    ดูเฉลย

    คำตอบ: > เขียนทับ out.txt; >> ต่อท้ายลงท้ายไฟล์ out.txt

  • 3

    จงเขียนคำสั่งที่แสดงเฉพาะบรรทัดที่มีคำว่า 'error' ใน /var/log/syslog

    ดูเฉลย

    คำตอบ: grep 'error' /var/log/syslog

04 / 12

สิทธิ์และความเป็นเจ้าของไฟล์

ทุกไฟล์มีเจ้าของ กลุ่ม และชุดสิทธิ์อ่าน/เขียน/รันสำหรับผู้ใช้สามจำพวก นี่คือรากฐานของความปลอดภัยบน Linux — ตั้งผิดก็ทำให้เซอร์วิสพังหรือเปิดเผยความลับ

โมเดล rwx

แต่ละไฟล์ให้สิทธิ์สามอย่าง — อ่าน (r), เขียน (w), รัน (x) — แก่ผู้ใช้สามจำพวก: เจ้าของ (user), กลุ่ม (group) และคนอื่นทั้งหมด (other) คำสั่ง `ls -l` แสดงเป็นสตริง 10 ตัวอักษร: ตัวอักษรบอกชนิดหนึ่งตัว ตามด้วย rwx สามชุด [3]

อ่านผลลัพธ์ของ ls -l

-rwxr-xr-- 1 deploy www 2048 Jun 29 app.sh
│└┬┘└┬┘└┬┘ │ │
│ │ │ └ other: r-- (อ่านอย่างเดียว)
│ │ └─── group: r-x (อ่าน + รัน)
│ └────── owner: rwx (อ่าน + เขียน + รัน)
└──────── type: - ไฟล์, d ไดเรกทอรี, l ลิงก์
owner=deploy group=www

สิทธิ์แบบเลขฐานแปด (r=4, w=2, x=1)

ฐานแปดสัญลักษณ์หมายความว่าใช้ทั่วไปกับ
644rw-r--r--เจ้าของแก้ไข คนอื่นอ่านไฟล์ทั่วไป
600rw-------เจ้าของเท่านั้นความลับ, กุญแจส่วนตัว SSH
755rwxr-xr-xเจ้าของแก้ไข คนอื่นรันสคริปต์, ไดเรกทอรี
700rwx------เจ้าของเท่านั้น เต็มสิทธิ์ไดเรกทอรีส่วนตัว
777rwxrwxrwxทุกคนทำได้ทุกอย่างแทบไม่ควรใช้ — สัญญาณอันตราย

เปลี่ยนสิทธิ์และเจ้าของ

  1. 1`chmod 600 secret.key` ตั้งสิทธิ์ตรงตัวด้วยเลขฐานแปด [1]
  2. 2`chmod +x script.sh` เพิ่มบิตรันเพื่อให้รันสคริปต์ได้
  3. 3`chown deploy file` เปลี่ยนเจ้าของ; `chown deploy:www file` ตั้งทั้งเจ้าของและกลุ่ม [2]
  4. 4`chmod -R 755 dir/` ใช้แบบเรียกซ้ำกับไดเรกทอรีและทุกอย่างข้างใน

sudo: ยืมอำนาจ root เพื่อคำสั่งเดียว

ผู้ใช้ทั่วไปรันคำสั่งระดับแอดมินด้วยการเติม `sudo` นำหน้า เช่น `sudo systemctl restart nginx` มันจะถามรหัสผ่านของคุณ รันคำสั่งเดียวนั้นในฐานะ root และบันทึกล็อกไว้ — ปลอดภัยกว่าการล็อกอินเป็น root มาก

แบบฝึกหัด

  • 1

    กุญแจส่วนตัว SSH ต้องอ่านและเขียนได้โดยเจ้าของเท่านั้น เลขฐานแปดคืออะไร และคำสั่งใดตั้งค่านี้กับ ~/.ssh/id_ed25519

    ดูเฉลย

    คำตอบ: 600 — chmod 600 ~/.ssh/id_ed25519

    วิธีทำ

    เจ้าของ rw = 4+2 = 6, กลุ่ม 0, คนอื่น 0 → 600
    ถ้าเปิดมากกว่านี้ SSH จะปฏิเสธไม่ใช้กุญแจ
  • 2

    โหมด 755 ให้สิทธิ์อะไร ทีละหลัก

    ดูเฉลย

    คำตอบ: เจ้าของ rwx (7), กลุ่ม r-x (5), คนอื่น r-x (5)

    วิธีทำ

    7 = 4+2+1 (rwx)
    5 = 4+0+1 (r-x)
  • 3

    ทำไม chmod 777 บนไดเรกทอรีเว็บจึงอันตราย

    ดูเฉลย

    คำตอบ: มันยอมให้ผู้ใช้ใด ๆ (รวมถึงโปรเซสที่ถูกเจาะ) เขียนและรันไฟล์ในนั้นได้ ผู้โจมตีที่ได้ช่องทางเข้ามาเพียงเล็กน้อยก็ฝังโค้ดได้

05 / 12

ผู้ใช้ กลุ่ม และ sudo

การรันทุกอย่างเป็น root คือความผิดพลาดใหญ่ที่สุดของมือใหม่ ทางแก้คือบัญชีผู้ใช้ทั่วไปที่ยกระดับเป็น root เฉพาะเมื่อจำเป็นผ่าน sudo

root vs ผู้ใช้ทั่วไป

root (UID 0) ทำได้ทุกอย่าง รวมถึงความเสียหายที่ย้อนกลับไม่ได้ ผู้ใช้ทั่วไปถูกจำกัดอยู่กับไฟล์ของตัวเอง หลักการสิทธิ์น้อยที่สุด (least privilege) บอกว่า: ทำงานประจำวันในฐานะผู้ใช้ทั่วไป แล้วยืมอำนาจ root เพียงชั่วคราวผ่าน sudo [2][3]

สร้างผู้ใช้ sudo ของคุณเอง

รันคำสั่งเหล่านี้ในฐานะ root บน VPS ที่เพิ่งติดตั้งใหม่:

  1. 1`adduser deploy` — สร้างผู้ใช้และถามรหัสผ่าน [1]
  2. 2`usermod -aG sudo deploy` — เพิ่มผู้ใช้เข้ากลุ่ม sudo (`-aG` = ต่อท้ายเข้ากลุ่ม)
  3. 3`su - deploy` — สลับไปเป็นผู้ใช้ใหม่เพื่อทดสอบ
  4. 4`sudo whoami` — ควรแสดง `root` เป็นการยืนยันว่า sudo ใช้ได้

สร้างและทดสอบผู้ใช้

root@srv01:~# adduser deploy
Adding user `deploy' ...
New password:
Retype new password:
root@srv01:~# usermod -aG sudo deploy
root@srv01:~# su - deploy
deploy@srv01:~$ sudo whoami
[sudo] password for deploy:
root

รู้ว่าคุณคือใคร

คำสั่งบอกอะไร
whoamiชื่อผู้ใช้ปัจจุบันของคุณ
idUID, GID และกลุ่มที่คุณสังกัด
who / wใครอีกบ้างที่กำลังล็อกอินอยู่ตอนนี้
groups deployผู้ใช้นั้นอยู่ในกลุ่มใดบ้าง
passwdเปลี่ยนรหัสผ่านของคุณเอง

ทดสอบ sudo ก่อนเลิกใช้ root

ตรวจให้แน่ใจว่า `sudo whoami` คืนค่า root สำหรับผู้ใช้ใหม่ของคุณ ก่อน ที่จะออกจาก root หรือปิดการล็อกอิน root ถ้า sudo ตั้งค่าผิดและคุณล็อก root ไว้แล้ว คุณอาจเข้าเซิร์ฟเวอร์ของตัวเองไม่ได้อีก

06 / 12

ติดตั้งและอัปเดตซอฟต์แวร์

บน Debian/Ubuntu คุณติดตั้งซอฟต์แวร์จากแหล่ง (repository) ที่เชื่อถือได้ด้วย APT แทนการดาวน์โหลดตัวติดตั้งเอง APT จัดการ dependency และส่งอัปเดตความปลอดภัยให้

APT คืออะไร

APT (Advanced Package Tool) ดาวน์โหลดแพ็กเกจจากแหล่งทางการ — คลังซอฟต์แวร์ที่ผ่านการตรวจสอบและเซ็นลายเซ็น ปลอดภัยกว่าการดาวน์โหลดมั่ว ๆ เพราะแพ็กเกจถูกตรวจความถูกต้องและแพตช์จากศูนย์กลาง [1]

คำสั่ง apt ที่ใช้ประจำ (รันด้วย sudo)

คำสั่งทำอะไร
apt updateรีเฟรชรายการแพ็กเกจที่มีให้ [2]
apt upgradeติดตั้งอัปเดตของแพ็กเกจที่ติดตั้งไว้
apt install nginxติดตั้งแพ็กเกจพร้อม dependency
apt remove nginxถอนแพ็กเกจ (เก็บคอนฟิกไว้)
apt purge nginxถอนแพ็กเกจและลบคอนฟิกด้วย
apt autoremoveลบแพ็กเกจที่ไม่มีอะไรต้องใช้แล้ว
apt search wordค้นแพ็กเกจด้วยคำสำคัญ

อัปเดตเซิร์ฟเวอร์ (ทำสิ่งนี้ก่อน และทำสม่ำเสมอ)

  1. 1`sudo apt update` — ดึงดัชนีแพ็กเกจล่าสุด
  2. 2`sudo apt upgrade -y` — ติดตั้งอัปเดตทั้งหมดที่มี (`-y` ยืนยันอัตโนมัติ)
  3. 3รีบูตถ้ามีการอัปเดตเคอร์เนล: `sudo reboot`

อัปเดตและติดตั้ง

deploy@srv01:~$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists... Done
deploy@srv01:~$ sudo apt upgrade -y
deploy@srv01:~$ sudo apt install -y htop curl ufw

ให้แพตช์ความปลอดภัยไหลเข้าโดยอัตโนมัติ

ติดตั้ง `unattended-upgrades` เพื่อให้เซิร์ฟเวอร์แพตช์ความปลอดภัยเอง: `sudo apt install unattended-upgrades` แล้ว `sudo dpkg-reconfigure unattended-upgrades` ซอฟต์แวร์ที่ไม่ได้แพตช์คือช่องทางที่เซิร์ฟเวอร์ถูกเจาะบ่อยที่สุด [3]

07 / 12

โปรเซสและทรัพยากรระบบ

โปรแกรมที่กำลังรันทุกตัวคือโปรเซสที่มีหมายเลข PID การรู้วิธีดูว่ามีอะไรรันอยู่ กินทรัพยากรเท่าไร และจะหยุดอย่างไร เป็นสิ่งจำเป็นเมื่อเซิร์ฟเวอร์ช้าหรือเซอร์วิสมีปัญหา

ตรวจสอบโปรเซสและทรัพยากร

คำสั่งแสดงอะไร
ps auxภาพรวมของโปรเซสที่รันอยู่ทั้งหมด [1]
topมุมมองสดที่อัปเดตการใช้ CPU/RAM ตามโปรเซส [2]
htoptop แบบสีที่ใช้ง่ายกว่า (apt install htop)
free -hRAM ที่ใช้ vs ว่าง แบบอ่านง่าย
df -hพื้นที่ดิสก์ต่อระบบไฟล์
du -sh *ขนาดของแต่ละรายการในไดเรกทอรีปัจจุบัน
kill PIDขอให้โปรเซสหยุด (สัญญาณ TERM)
kill -9 PIDบังคับฆ่าโปรเซส (สัญญาณ KILL)

ค้นหาและหยุดโปรเซส

deploy@srv01:~$ ps aux | grep nginx
root 812 0.0 0.5 nginx: master process
www 813 0.1 0.8 nginx: worker process
deploy@srv01:~$ sudo kill 812 # หยุดอย่างนุ่มนวล
deploy@srv01:~$ sudo kill -9 813 # ทางเลือกสุดท้าย

สัญญาณ: TERM vs KILL

`kill PID` ส่ง SIGTERM เป็นการขอให้โปรเซสเก็บกวาดและออกอย่างสุภาพ — ลองวิธีนี้ก่อนเสมอ ส่วน `kill -9 PID` ส่ง SIGKILL ที่โปรเซสดักจับหรือเพิกเฉยไม่ได้ มันหยุดทันทีแต่อาจทิ้งไฟล์ที่เขียนค้างไว้ [3] ใช้ -9 เฉพาะตอนที่โปรเซสค้างจริง ๆ

เมื่อดิสก์เต็ม

ดิสก์เต็มทำให้แทบทุกอย่างพัง `df -h` หาว่าระบบไฟล์ใดเต็ม; `du -sh /var/* | sort -h` หาตัวที่กินที่มากที่สุด ล็อกใน /var/log และแพ็กเกจเก่า (`apt autoremove`) เป็นตัวกินพื้นที่ที่พบบ่อย

แบบฝึกหัด

  • 1

    เซอร์วิสค้างอยู่ คำสั่งใดที่ควรลองก่อนเพื่อหยุดโปรเซส 4021 และคำสั่งใดใช้เป็นทางเลือกสุดท้าย

    ดูเฉลย

    คำตอบ: ก่อน `kill 4021` (SIGTERM นุ่มนวล); ทางเลือกสุดท้าย `kill -9 4021` (SIGKILL บังคับ)

  • 2

    จงเขียนคำสั่งตรวจพื้นที่ดิสก์ที่เหลือในหน่วยที่อ่านง่าย

    ดูเฉลย

    คำตอบ: df -h

08 / 12

เซอร์วิสและล็อกด้วย systemd

โปรแกรมที่รันยาวนานอย่างเว็บเซิร์ฟเวอร์และ SSH ทำงานเป็นเซอร์วิสเบื้องหลังที่จัดการโดย systemd `systemctl` ควบคุมพวกมัน ส่วน `journalctl` อ่านล็อกของพวกมัน

systemd และยูนิต

systemd คือระบบ init ที่เริ่ม OS และคอยกำกับเซอร์วิส แต่ละเซอร์วิสอธิบายด้วย “ยูนิต” (เช่น `nginx.service`) คุณเริ่ม หยุด และเปิดยูนิตให้ทำงานด้วยเครื่องมือเดียวคือ `systemctl` [1]

จัดการเซอร์วิส (เช่น nginx)

คำสั่งทำอะไร
systemctl status nginxรันอยู่ไหม? พร้อมล็อกล่าสุด
systemctl start nginxเริ่มเดี๋ยวนี้
systemctl stop nginxหยุดเดี๋ยวนี้
systemctl restart nginxหยุดแล้วเริ่ม (ใช้คอนฟิกใหม่)
systemctl reload nginxโหลดคอนฟิกใหม่โดยไม่ตัดการเชื่อมต่อ
systemctl enable nginxเริ่มอัตโนมัติตอนบูต [3]
systemctl disable nginxไม่เริ่มตอนบูต

ตรวจและรีสตาร์ตเซอร์วิส

deploy@srv01:~$ sudo systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Active: active (running) since Sun 2026-06-29 09:00
deploy@srv01:~$ sudo systemctl restart ssh
deploy@srv01:~$ sudo systemctl enable ssh

อ่านล็อกด้วย journalctl

systemd เก็บล็อกไว้ที่ศูนย์กลาง `journalctl -u nginx` แสดงล็อกของเซอร์วิสหนึ่ง, `-e` กระโดดไปท้ายสุด และ `-f` ตามบรรทัดใหม่แบบสด [2] เมื่อเซอร์วิสไม่ยอมเริ่ม journal ของมันมักบอกเหตุผลเสมอ

ล็อก

# ล็อกล่าสุดของเซอร์วิสหนึ่ง
sudo journalctl -u ssh -e
# ตามล็อกแบบสด (Ctrl+C เพื่อหยุด)
sudo journalctl -u nginx -f
# ทุกอย่างนับตั้งแต่บูตครั้งล่าสุด
sudo journalctl -b

09 / 12

เครือข่ายบนบรรทัดคำสั่ง

เซิร์ฟเวอร์มีประโยชน์ต่อเมื่อเข้าถึงได้ เครื่องมือเหล่านี้แสดงที่อยู่ของคุณ พอร์ตใดเปิดอยู่ และคุณติดต่อโฮสต์อื่นได้หรือไม่ — เป็นสิ่งแรกที่ตรวจเมื่อบางอย่างเชื่อมต่อไม่ได้

เครื่องมือเครือข่าย

คำสั่งแสดง / ทำอะไร
ip aอินเทอร์เฟซเครือข่ายและที่อยู่ IP ของคุณ [1]
ip routeตารางเส้นทาง / เกตเวย์ปริยาย
ss -tulpnพอร์ต TCP/UDP ที่ฟังอยู่และโปรเซสของมัน [2]
ping hostโฮสต์ตอบสนองไหม (Ctrl+C เพื่อหยุด)
curl URLดึง URL; ทดสอบเว็บเซอร์วิส [3]
curl -I URLดึงเฉพาะ HTTP response header
dig nameแปลงชื่อ DNS เป็นที่อยู่
wget URLดาวน์โหลดไฟล์

ตรวจว่ามีอะไรฟังอยู่

deploy@srv01:~$ ss -tulpn
State Local Address:Port Process
LISTEN 0.0.0.0:22 sshd
LISTEN 0.0.0.0:80 nginx
LISTEN 0.0.0.0:443 nginx

พอร์ตและความหมาย

พอร์ตคือประตูที่มีหมายเลขบนเซิร์ฟเวอร์ของคุณ 22 คือ SSH, 80 คือ HTTP, 443 คือ HTTPS `ss -tulpn` แสดงทุกประตูที่เปิดอยู่และโปรแกรมที่อยู่เบื้องหลัง พอร์ตที่ฟังอยู่แบบไม่คาดคิดคือสัญญาณอันตรายด้านความปลอดภัยที่ควรสืบสวน

ทดสอบเว็บเซอร์วิสในเครื่อง

# เว็บตอบสนองบนเซิร์ฟเวอร์นี้ไหม?
curl -I http://localhost
HTTP/1.1 200 OK
Server: nginx
# แปลงโดเมน
dig +short example.com

10 / 12

กุญแจ SSH และการเสริมความปลอดภัยเซิร์ฟเวอร์ SSH

รหัสผ่านเดาได้ แต่กุญแจ SSH แทบเดาไม่ได้เลย การเปลี่ยนมาล็อกอินด้วยกุญแจอย่างเดียวและรัดกุม SSH daemon คือก้าวด้านความปลอดภัยที่ให้ผลสูงที่สุดบน VPS

ทำไมกุญแจดีกว่ารหัสผ่าน

คู่กุญแจ SSH ประกอบด้วยกุญแจส่วนตัว (เก็บเป็นความลับในเครื่องคุณ) และกุญแจสาธารณะ (วางไว้บนเซิร์ฟเวอร์) การล็อกอินพิสูจน์ว่าคุณถือกุญแจส่วนตัวโดยไม่ส่งมันออกไปเลย กุญแจที่แข็งแรงทนต่อบอตเดารหัสผ่านที่ถล่มทุกพอร์ต SSH สาธารณะ [4]

ตั้งค่าการยืนยันตัวด้วยกุญแจ

รันคำสั่งแรกบน เครื่องของคุณ ไม่ใช่บนเซิร์ฟเวอร์:

  1. 1`ssh-keygen -t ed25519 -C "you@example.com"` — สร้างคู่กุญแจสมัยใหม่; กด Enter เพื่อรับพาธปริยายและตั้งวลีรหัสผ่าน (passphrase) [2]
  2. 2`ssh-copy-id deploy@YOUR_SERVER_IP` — คัดลอกกุญแจสาธารณะไปยัง authorized_keys ของเซิร์ฟเวอร์
  3. 3`ssh deploy@YOUR_SERVER_IP` — ล็อกอินอีกครั้ง ควรไม่ถามรหัสผ่าน
  4. 4ยืนยันว่าล็อกอินด้วยกุญแจใช้ได้ ก่อน ปิดการใช้รหัสผ่านในขั้นถัดไป

สร้างและคัดลอกกุญแจ

# บนแล็ปท็อปของคุณ
$ ssh-keygen -t ed25519 -C "you@example.com"
Generating public/private ed25519 key pair.
Enter file: (กด Enter)
Enter passphrase: (แนะนำให้ตั้ง)
$ ssh-copy-id deploy@203.0.113.10
$ ssh deploy@203.0.113.10 # ไม่ถามรหัสผ่าน = สำเร็จ

รัดกุม /etc/ssh/sshd_config

แก้คอนฟิกของ SSH daemon ด้วย `sudo nano /etc/ssh/sshd_config` ตั้งสามตัวเลือกด้านล่าง แล้วใช้งานด้วย `sudo systemctl restart ssh` วิธีนี้ปิดการล็อกอิน root โดยตรงและปิดการยืนยันตัวด้วยรหัสผ่านทั้งหมด เหลือเฉพาะกุญแจเท่านั้นที่ใช้ได้ [1][3]

บรรทัดสำคัญใน sshd_config

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
# ตัวเลือก: ย้ายออกจากพอร์ต 22 เพื่อลดเสียงรบกวนในล็อก
# Port 2222

เปิดเซสชันหนึ่งค้างไว้ระหว่างทดสอบ

ก่อนรีสตาร์ต SSH ด้วยค่าใหม่ ให้เปิดเทอร์มินัล ที่สอง แล้วล็อกอินด้วยกุญแจให้สำเร็จ ถ้าค่าใดล็อกคุณออก เซสชันที่เปิดค้างไว้จะช่วยให้แก้ได้ มิฉะนั้นคอนฟิกที่ผิดอาจทำให้เชื่อมต่อกลับไม่ได้ — และต้องใช้คอนโซลของ Hostinger เพื่อกู้คืน

11 / 12

ไฟร์วอลล์ด้วย UFW

ไฟร์วอลล์ตัดสินว่าโลกภายนอกเข้าถึงพอร์ตใดได้บ้าง UFW (Uncomplicated Firewall) เป็นหน้ากากที่ใช้ง่ายบน Ubuntu: ปฏิเสธขาเข้าทั้งหมดโดยปริยาย แล้วอนุญาตเฉพาะสิ่งที่จำเป็นอย่างชัดเจน

ปฏิเสธโดยปริยาย อนุญาตเป็นข้อยกเว้น

นโยบายไฟร์วอลล์ที่ดีบล็อกการเชื่อมต่อขาเข้าทั้งหมดโดยปริยาย แล้วเปิดเฉพาะพอร์ตที่เซอร์วิสของคุณใช้ UFW ทำให้สิ่งนี้เป็นคำสั่งอ่านง่ายไม่กี่บรรทัดแทนกฎ iptables ดิบ ๆ [1]

ตั้งค่า UFW อย่างปลอดภัย

ลำดับสำคัญมาก — อนุญาต SSH ก่อน เปิดใช้งานไฟร์วอลล์:

  1. 1`sudo ufw default deny incoming` — บล็อกขาเข้าทั้งหมดโดยปริยาย
  2. 2`sudo ufw default allow outgoing` — ให้เซิร์ฟเวอร์ติดต่อออกได้
  3. 3`sudo ufw allow OpenSSH` — คงการเข้าถึง SSH ของคุณไว้ (หรือ `ufw allow 22`)
  4. 4`sudo ufw allow 80,443/tcp` — อนุญาตทราฟฟิกเว็บถ้าคุณรันเว็บไซต์
  5. 5`sudo ufw enable` — เปิดไฟร์วอลล์
  6. 6`sudo ufw status verbose` — ยืนยันกฎ [3]

ไฟร์วอลล์สำหรับเว็บเซิร์ฟเวอร์ทั่วไป

deploy@srv01:~$ sudo ufw default deny incoming
deploy@srv01:~$ sudo ufw allow OpenSSH
deploy@srv01:~$ sudo ufw allow 80,443/tcp
deploy@srv01:~$ sudo ufw enable
Firewall is active and enabled on system startup
deploy@srv01:~$ sudo ufw status
OpenSSH ALLOW Anywhere
80,443/tcp ALLOW Anywhere

คำสั่ง UFW ที่มีประโยชน์

คำสั่งทำอะไร
ufw status numberedแสดงกฎพร้อมหมายเลขลำดับ [2]
ufw delete 2ลบกฎหมายเลข 2
ufw allow from 1.2.3.4อนุญาตเฉพาะ IP ที่ระบุ
ufw deny 23บล็อกพอร์ต
ufw disableปิดไฟร์วอลล์

อนุญาต SSH ก่อนเสมอ ทุกครั้ง

ถ้าคุณรัน `ufw enable` โดยไม่มีกฎอนุญาต SSH (พอร์ต 22 หรือพอร์ตที่คุณกำหนดเอง) ไฟร์วอลล์จะตัดการเชื่อมต่อของคุณเองและคุณจะถูกล็อกออก ให้ `ufw allow OpenSSH` ก่อนเสมอ

12 / 12

เช็กลิสต์เสริมความปลอดภัย VPS

ความปลอดภัยคือชั้นป้องกันหลายชั้น ไม่ใช่สวิตช์เดียว รวมทุกอย่างจากหัวข้อก่อนหน้าเป็นเช็กลิสต์ที่ทำซ้ำได้ ซึ่งคุณรันบนเซิร์ฟเวอร์ใหม่ทุกตัว ทุกขั้นตอนไม่ยาก แต่การข้ามมันคือสิ่งที่ทำให้เซิร์ฟเวอร์ถูกเจาะ

แนวคิด: สิทธิ์น้อยที่สุดและพื้นผิวน้อยที่สุด

สองหลักการครอบคลุมความปลอดภัยเซิร์ฟเวอร์ส่วนใหญ่ สิทธิ์น้อยที่สุด (least privilege): ผู้ใช้และเซอร์วิสทุกตัวได้สิทธิ์เท่าที่จำเป็นเท่านั้น ไม่มากกว่านั้น พื้นผิวการโจมตีน้อยที่สุด (minimal attack surface): รันและเปิดเผยให้น้อยที่สุด — พอร์ตเปิดน้อยลง แพ็กเกจติดตั้งน้อยลง บัญชีน้อยลง [1]

เช็กลิสต์เสริมความปลอดภัยในชั่วโมงแรก

รันสิ่งเหล่านี้บน VPS ใหม่ทุกตัว ตามลำดับ:

  1. 1อัปเดตทุกอย่าง: `sudo apt update && sudo apt upgrade -y` [4]
  2. 2สร้างผู้ใช้ sudo ที่ไม่ใช่ root และใช้มันตั้งแต่นี้ไป (หัวข้อผู้ใช้)
  3. 3ตั้งค่าล็อกอินด้วยกุญแจ SSH แล้วปิดการล็อกอิน root และการยืนยันด้วยรหัสผ่าน (หัวข้อ SSH)
  4. 4เปิดไฟร์วอลล์ด้วย UFW อนุญาตเฉพาะ SSH และพอร์ตเซอร์วิสของคุณ
  5. 5ติดตั้ง Fail2Ban เพื่อแบนการล็อกอินที่ล้มเหลวซ้ำ ๆ อัตโนมัติ
  6. 6เปิดอัปเดตความปลอดภัยอัตโนมัติ (unattended-upgrades)

ติดตั้ง Fail2Ban (แบนผู้โจมตีแบบ brute-force)

deploy@srv01:~$ sudo apt install -y fail2ban
deploy@srv01:~$ sudo systemctl enable --now fail2ban
deploy@srv01:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Currently banned: 3
`- Total banned: 17

Fail2Ban ในประโยคเดียว

Fail2Ban เฝ้าดูไฟล์ล็อก (เช่น /var/log/auth.log) และบล็อกชั่วคราวทุก IP ที่ล็อกอินล้มเหลวมากเกินไป หยุดบอตเดารหัสผ่านที่คอยตรวจสอบเซิร์ฟเวอร์สาธารณะทุกตัวอยู่ตลอด [2]

ป้องกันเป็นชั้น (defense in depth)

ไม่มีมาตรการเดียวที่เพียงพอ กุญแจทำให้รหัสผ่านไม่สำคัญ ไฟร์วอลล์ซ่อนพอร์ต Fail2Ban ชะลอผู้โจมตี และอัปเดตปิดช่องโหว่ที่รู้แล้ว ซ้อนกันทั้งหมดจะเปลี่ยนเป้าหมายที่ง่ายให้เป็นเป้าหมายที่ยาก [3] รันเช็กลิสต์นี้ซ้ำทุกครั้งที่สร้างเครื่องใหม่

ทบทวน

  • 1

    ระบุลำดับของสามขั้นตอนแรกในการเสริมความปลอดภัย และทำไมลำดับจึงสำคัญ

    ดูเฉลย

    คำตอบ: 1) อัปเดตแพ็กเกจ, 2) สร้างผู้ใช้ sudo ที่ไม่ใช่ root, 3) ตั้งค่ากุญแจ SSH แล้วจึงปิดการล็อกอิน root/รหัสผ่าน คุณต้องมีผู้ใช้ sudo และล็อกอินด้วยกุญแจที่ใช้ได้ ก่อน ปิด root ไม่งั้นเสี่ยงล็อกตัวเองออก

  • 2

    ทำไมต้องอนุญาต SSH ใน UFW ก่อนรัน `ufw enable`

    ดูเฉลย

    คำตอบ: การเปิดใช้งานแบบ default-deny โดยไม่มีกฎ SSH จะบล็อกพอร์ต 22 และตัดการเชื่อมต่อของคุณเอง ทำให้ถูกล็อกออกจากเซิร์ฟเวอร์

  • 3

    ในหนึ่งประโยค Fail2Ban เพิ่มอะไรนอกเหนือจากกุญแจ SSH และไฟร์วอลล์

    ดูเฉลย

    คำตอบ: มันแบน IP ที่ยืนยันตัวล้มเหลวซ้ำ ๆ โดยอัตโนมัติ ตัดบอต brute-force และเสียงรบกวนในล็อก แม้กุญแจจะบล็อกพวกมันอยู่แล้วก็ตาม