VPS เครื่องใหม่ที่เพิ่งซื้อมาก็เหมือนประตูบ้านที่ยังไม่ได้ล็อก มีสคริปต์คิดดีจากทั่วโลกคอยมาเคาะอยู่ตลอดเวลา บทความนี้จะพาคุณมาล็อกประตูให้แน่นหนา เผื่อกันลูกเล่นตัวป่วน (openclaw) ของคุณไม่ให้วิ่งแจ๋นไปไกล

0、มาวางม้ากันก่อน

เพิ่งซื้อ VPS มาใหม่ ตื่นเต้นจัด คว้า IP กับพาสเวิร์ด root มาได้แล้ว แล้วจะทำยังไงต่อ?

คนส่วนใหญ่มักจะรีบลงมือติดตั้งซอฟต์แวร์และเดployโปรเจกต์กันเลย

นี่คือนิสัยที่อันตรายชะมัด

VPS ของคุณมี Public IP อยู่ นั่นหมายความว่าใครก็ตามในโลกนี้สามารถลองเชื่อมต่อเข้ามาได้ และในค่าเริ่มต้นนั้น:

  • พอร์ตเปิดเผยเป็น 22
  • ยูสเซอร์เนมที่คนรู้จักกันดีคือ root
  • เหลือแค่พาสเวิร์ดตัวเดียวที่คอยปกป้องคุณอยู่

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

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


1、เป้าหมายที่เราจะทำ

เป้าหมายของบทความนี้คือ:

  • ✅ ตั้งค่า การเข้าถึงระยะไกลอย่างปลอดภัย: ล็อกอินด้วย SSH Key + เปลี่ยนจากพอร์ตเริ่มต้น
  • ✅ สร้าง ผู้ใช้ทั่วไป: เลิกใช้ root โดยตรงกันเถอะ
  • ✅ ตั้งค่า ไฟร์วอลล์: เปิดเฉพาะพอร์ตที่จำเป็นจริงๆ
  • ✅ เปิดใช้งาน ตัวเร่งเครือข่าย: BBR ช่วยให้เน็ตพุ่งสุดป้าย
  • ✅ ป้องกัน การถอนรหัสผ่านแบบเดรัจฉีน: fail2ban แบน IP ตัวการให้เองอัตโนมัติ

ทำครบทุกข้อแล้ว ตอนนี้ VPS ของคุณจะมีพื้นฐานที่แน่นอน พร้อมที่จะลงมือเดploy บริการต่างๆ ได้อย่างสบายใจแล้วล่ะ


2. วางแผนและทำความเข้าใจ

ทำไมต้องมาตั้งค่าพวกนี้กันนะ?

VPS ที่เพิ่งซื้อมาใหม่ก็เหมือนบ้านที่เพิ่งสร้างเสร็จยังไม่ได้ตกแต่งเลยนั่นแหละ:

สถานะเริ่มต้น ความเสี่ยง ทางออกของเรา
ล็อกอินด้วย root ตรงๆ สิทธิ์สูงเกินไป พลาดทีเดียวพังใหญ่ สร้าง user ปกติ + sudo
ล็อกอินด้วยรหัสผ่าน โดน brute force แตกได้ ล็อกอินด้วย SSH Key
พอร์ต 22 ค่าเริ่มต้น โดนสแกนเน้นๆ เปลี่ยนเป็นพอร์ตที่ไม่มาตรฐาน
ปิดไฟร์วอลล์ เปิดพอร์ตหมดทุกอย่าง UFW เปิดเฉพาะพอร์ตที่จำเป็น
เน็ตเวิร์กเดิมๆ 丢包สูง ดีเลย์มาก อัลกอริทึมควบคุม BBR

ขั้นตอนโดยรวม

VPS初始化流程

เราจะทำตามลำดับนี้เลยนะ แล้วก็จะอธิบายให้ฟังทุกขั้นตอนว่าทำไมถึงทำแบบนี้

3. ขั้นตอนการจัดการ

3.1 ล็อกอินครั้งแรกและอัปเดตระบบ

ดึง IP ของเซิร์ฟเวอร์

หลังจากซื้อ VPS แล้ว ผู้ให้บริการจะส่งอะไรมาให้บ้าง:

  • IP Address: เช่น 192.168.1.100
  • Port: ปกติจะเป็น 22 (บางผู้ให้บริการอาจเปลี่ยนเป็นพอร์ตอื่น)
  • Username: ปกติจะเป็น root
  • Password: สตริงตัวอักษรที่สุ่มสร้างขึ้นมา

VPS 服务商后台的登录信息页面

การเชื่อมต่อ SSH

สำหรับสาวก Mac / Linux: เปิด Terminal แล้วพิมพ์คำสั่งนี้ลงไปได้เลย:

1
2
ssh root@你的服务器IP
# 例如:ssh [email protected]

สำหรับสาวก Windows:

  • Windows 10/11 มี OpenSSH มาให้ในตัว สามารถใช้คำสั่งด้านบนใน PowerShell หรือ CMD ได้เลย
  • หรือจะใช้โปรแกรมอย่าง Termius, MobaXterm ก็ได้เช่นกัน

ตอนเชื่อมต่อครั้งแรก จะมีข้อความให้ยืนยัน Fingerprint แบบนี้:

1
2
3
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

นี่คือระบบกำลังถามเราอยู่ว่า: “ตู้นี้ของใหม่ ไม่คุ้นเคยนะ แน่ใจนะว่าจะเชื่อมต่อ?”

พิมพ์ yes แล้วกด Enter จากนั้นก็ใส่ Password (ข้อควรระวัง: ตอนพิมพ์จะไม่มีตัวอักษรขึ้นมาโชว์ให้เห็นเลย นี่คือฟีเจอร์ความปลอดภัยปกติ) แล้วกด Enter ไป

首次 SSH 连接的完整过程,包含指纹确认

ถ้าเจอข้อความประมาณนี้ แปลว่าล็อกอินสำเร็จแล้ว:

1
2
3
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64)
...
root@hostname:~#

💡 ทำไมต้องเช็ค Fingerprint?

เพื่อป้องกัน “Man-in-the-Middle Attack” นะฮะ การจดจำ fingerprint ตั้งแต่ครั้งแรกที่เชื่อมต่อ แล้วคราวหน้าถ้ามันเปลี่ยนไป แสดงว่าอาจมีคนแอบปลอมตัวเป็นเซิร์ฟเวอร์ของเราก็ได้

登录成功了

มาทำความรู้จักกับเซิร์ฟเวอร์ของคุณกันก่อน

หลังจากล็อกอินเข้าไปแล้ว มาดูสภาพรวมๆ ของเครื่องนี้กันก่อนเลย:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看 CPU 核心数和型号
nproc
lscpu | grep "Model name"

# 查看内存
free -h

# 查看磁盘
df -h

服务器基本信息输出

จำข้อมูลพวกนี้เอาไว้นะ เดี๋ยวตอนเช็คปัญหาทีหลังจะได้มีใช้

อัปเดตระบบ

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

1
2
# 更新软件包列表 + 升级所有软件 + 清理
apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean

อธิบายพารามิเตอร์:

  • apt update: อัปเดต index ของแพ็กเกจ
  • apt full-upgrade: อัปเกรดซอฟต์แวร์ทุกตัว รวมไปถึงเคอร์เนลด้วย
  • -y: ยืนยันอัตโนมัติ ไม่ต้องมานั่งพิมพ์ yes เอง
  • apt autoremove: ลบ dependency ที่ไม่ต้องใช้แล้วทิ้ง
  • apt autoclean: ล้างแคชของแพ็กเกจที่ดาวน์โหลดมา

apt update 和 apt upgrade 执行过程

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

เช็คดูว่าต้องรีบูตไหม

หลังอัปเดตเคอร์เนล ปกติแล้วมักจะต้องรีบูตถึงจะมีผล:

1
2
# 检查是否需要重启
cat /var/run/reboot-required 2>/dev/null && echo ">>> 需要重启" || echo ">>> 无需重启"

是否需要重启

ถ้าขึ้นมาบอกว่าต้องรีบูต:

1
reboot

หลังรีบูตเสร็จก็ต้องเข้ามาเชื่อมต่อ SSH ใหม่อีกรอบนะ

ติดตั้งเครื่องมือที่ใช้บ่อยๆ

1
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

เครื่องมือพวกนี้เอาไว้ทำอะไร:

เครื่องมือ ไว้ทำอะไร
sudo ให้ยูสเซอร์ทั่วไปรันคำสั่งแอดมินได้
curl / wget โหลดไฟล์
git คุมเวอร์ชัน
vim เอดิเตอร์แต่งข้อความ
htop โมนิเตอร์โปรเซสที่หน้าตาดีกว่า
tree โชว์โครงสร้างโฟลเดอร์แบบต้นไม้
net-tools เครื่องมือเน็ตเวิร์ก (ifconfig, netstat ฯลฯ)
ufw ไฟร์วอลล์ใช้ง่ายๆ
fail2ban กัน Brute-force
neofetch โชว์ข้อมูลระบบสวยๆ
neofetch 显示的系统信息

3.2 สร้าง User ที่ไม่ใช่ root

ทำไมไม่ใช้ root ไปเลย?

สิทธิ์ของ root มันสูงเกินไป พลาดนิดเดียว rm -rf / ก็อาจหายหมดทั้งเครื่องเลย ปกติเราควรใช้งานผ่าน user ทั่วไป แล้วค่อยเรียกใช้สิทธิ์แอดมินผ่าน sudo เมื่อไหร่ที่ต้องการจริงๆ

ลอบสเตอร์ (openclaw) มันคือมอนสเตอร์นะ จะกล้าไปยกสิทธิ์ root ให้มันใช้ได้ยังไงกัน?

สร้าง User ใหม่

1
2
# 创建用户(把 ittinker 换成你想要的用户名)
adduser ittinker

ระบบจะให้เราตั้งรหัสผ่านและกรอกข้อมูลนิดหน่อย:

1
2
3
4
5
6
7
8
New password:              # 输入密码(不会显示)
Retype new password: # 再输入一次
Full Name []: # 可以直接回车跳过
Room Number []: # 回车跳过
Work Phone []: # 回车跳过
Home Phone []: # 回车跳过
Other []: # 回车跳过
Is the information correct? [Y/n] # 输入 Y 确认

adduser 创建用户的完整交互过程

ตั้งสิทธิ์ sudo

1
2
# 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户
usermod -aG sudo ittinker

ลองเช็คดูหน่อย:

1
2
3
4
5
# 切换到新用户 ittinker 换成你自己上面创建的那个用户
su - ittinker

# 测试 sudo 是否生效
sudo whoami

ถ้าขึ้นผลลัพธ์ว่า root แปลว่าตั้งค่า sudo สำเร็จแล้ว
测试sudo

💡 ทริคเล็กๆ

พิมพ์ exit เพื่อสลับกลับไปใช้งาน root ขั้นตอนต่อจากนี้เราจะใช้ root ตั้งค่าต่อไปก่อน พอเสร็จแล้วค่อยสลับกลับไปใช้ user ทั่วไปนะ


3.3 ตั้งค่าล็อกอินด้วย SSH Key

ยืนยันตัวตนด้วย Key vs. ใช้รหัสผ่าน

SSH密钥认证原理

การใช้ Key ปลอดภัยกว่าใช้รหัสผ่านเยอะเลย:

  • รหัสผ่านโดน Brute force ได้ แต่ Key แทบจะเป็นไปไม่ได้เลย
  • สะดวกกว่า ไม่ต้องคอยพิมพ์รหัสผ่านทุกครั้ง
  • แม้รหัสผ่านจะรั่ว ถ้าไม่มี Private key ก็เข้ามาไม่ได้อยู่ดี

ขั้นตอนที่ 1: สร้าง Key pair ที่เครื่องตัวเอง

รันบน เครื่องของคุณเอง (ไม่ใช่เซิร์ฟเวอร์) นะ:

1
2
# 生成 ED25519 密钥(推荐,更安全更快)
ssh-keygen -t ed25519 -C "[email protected]"

ระบบจะขึ้นข้อความถามแบบนี้:

1
Enter file in which to save the key (/Users/你/.ssh/id_ed25519):

กด Enter ผ่านไปเลยเพื่อใช้พาธเริ่มต้นเลยก็ได้ ในที่นี้เราใช้ ./ittinker หมายความว่าเซฟไว้ในโฟลเดอร์ปัจจุบัน ชื่อไฟล์ ittinker

1
Enter passphrase (empty for no passphrase):

จะให้ตั้งพาสเวิร์ดป้องกันคีย์ (เพิ่มชั้นความปลอดภัย) หรือจะกด Enter ผ่านเพื่อเว้นว่างไว้เลยก็ได้

本地生成 SSH 密钥的过程

พอสร้างเสร็จ คุณจะเห็นไฟล์อยู่ในโฟลเดอร์ ~/.ssh/ 2 ไฟล์ (ด้านล่างคือชื่อไฟล์เริ่มต้นนะ ถ้ากด Enter ผ่านไปก็จะได้แบบนี้):

  • id_ed25519: Private Key ห้ามปล่อยให้รั่วไหลเด็ดขาด!
  • id_ed25519.pub: Public Key เอาไว้สำหรับอัปโหลดขึ้นเซิร์ฟเวอร์

💡 ed25519 vs RSA

ed25519 คืออัลกอริทึมที่แนะนำในตอนนี้ ปลอดภัยกว่าและคีย์สั้นกว่า RSA แบบดั้งเดิม ถ้าระบบของคุณเก่าเกินไปและไม่รองรับ ก็ใช้ ssh-keygen -t rsa -b 4096 แทนได้

เกร็ดเล็กๆ น้อยๆ นะ คีย์ที่สร้างจาก ed25519 จะมีขนาดเล็กกว่าคีย์จาก rsa ที่ไฟล์ใหญ่กว่าเยอะมาก ลองไปถาม AI ดูถึงรู้ว่าขนาดไม่ได้มีผลอะไรหรอก มันขึ้นอยู่กับอัลกอริทึมต่างหาก

ขั้นตอนที่สอง: อัปโหลด Public Key ขึ้นเซิร์ฟเวอร์

วิธี A: ใช้ ssh-copy-id (แนะนำ)

1
2
# 在你的电脑上执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@你的服务器IP

ใส่พาสเวิร์ดเสร็จ Public Key ก็จะถูกคัดลอกขึ้นเซิร์ฟเวอร์ให้อัตโนมัติเลย

ssh-copy-id 执行成功

วิธี B: คัดลอกเองแบบแมนนวล

ถ้า ssh-copy-id ใช้ไม่ได้ ก็ทำแบบแมนนวลได้เลย:

1
2
# 1. 在你的电脑上,查看公钥内容
cat ~/.ssh/id_ed25519.pub

ก๊อปปี้ข้อความที่ได้ (มันจะเป็นข้อความยาวๆ ที่ขึ้นต้นด้วย ssh-ed25519)

1
2
3
4
5
6
7
8
9
10
11
# 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名
mkdir -p /home/ittinker/.ssh
chmod 700 /home/ittinker/.ssh

# 3. 创建 authorized_keys 文件并粘贴公钥
vim /home/ittinker/.ssh/authorized_keys
# 按 i 进入编辑模式,粘贴公钥,按 Esc,输入 :wq 保存退出

# 4. 设置正确的权限
chmod 600 /home/ittinker/.ssh/authorized_keys
chown -R ittinker:ittinker /home/ittinker/.ssh

⚠️ เรื่อง Permission สำคัญมาก!

SSH จะเข้มงวดเรื่องสิทธิ์การเข้าถึงไฟล์อยู่แล้ว:

  • โฟลเดอร์ .ssh: 700 (ให้เข้าถึงได้แค่ยูสเซอร์ตัวเอง)
  • ไฟล์ authorized_keys: 600 (ให้แค่ยูสเซอร์ตัวเองอ่านและเขียนได้)

ถ้าตั้งสิทธิ์ผิด SSH จะไม่ยอมให้ล็อกอินด้วย Key แน่นอน

ขั้นตอนที่ 3: ทดสอบการล็อกอินด้วย Key

เปิดหน้าต่าง Terminal ใหม่ขึ้นมา (อย่าพึ่งปิดหน้าต่างเดิมนะ เผื่อไปตั้งค่าพลา้ยยังได้กู้คืน) แล้วลองทดสอบล็อกอินด้วย Key ดู:

1
ssh ittinker@你的服务器IP

ถ้าเข้าได้โดยไม่ต้องกรอกพาสเวิร์ด แปลว่าตั้งค่า Key สำเร็จแล้วจ้า! 🎉

(ถ้าตอนสร้าง Private key คุณตั้ง passphrase ไว้ มันจะขึ้นให้กรอกพาสเวิร์ดของ Private key นะ อันนี้ปกติแล้ว)
使用密钥成功登录(无需服务器密码)

ตรงนี้เราเพิ่มพารามิเตอร์ -i เข้าไป เพราะ Key อันนี้เราไม่ได้เก็บไว้ที่ Path เริ่มต้น แต่เก็บไว้ที่ Path ปัจจุบันแทน ถ้าไม่ระบุให้ชัดเจน ระบบจะไปเรียกใช้ Key ใน Path เริ่มต้นให้เอง


3.4 ปรับแต่งความปลอดภัยให้ SSH

ตอนนี้ล็อกอินด้วย Key ใช้ได้แล้ว เรามาล็อคความปลอดภัยของ SSH ให้แน่นหนาขึ้นกันเถอะ:

  1. เปลี่ยน Port เริ่มต้น (เพื่อกันโดนสแกน)
  2. ปิดการล็อกอินด้วยพาสเวิร์ด
  3. ห้าม root ล็อกอินตรงๆ

แก้ไขไฟล์ Config ของ SSH

1
2
3
4
5
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑配置
nano /etc/ssh/sshd_config

修改前

หาและแก้ไขค่า config ต่อไปนี้ (บางตัวอาจจะถูก comment ไว้ ให้ลบเครื่องหมาย # ด้านหน้าออกก่อนนะ):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 修改端口(选一个 1024-65535 之间的数字)
Port 22000

# 禁止 root 登录
PermitRootLogin no

# 允许密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁止密码登录(确保密钥登录测试成功后再改!)
PasswordAuthentication no

# 使用更安全的 SSH2 协议
Protocol 2

# 最大认证尝试次数
MaxAuthTries 3

# 客户端超时设置
ClientAliveInterval 300
ClientAliveCountMax 2

修改后的 sshd_config 关键配置

กดบันทึกแล้วออกจากโปรแกรม (ctrl + o)

สำหรับ Nano วิธีบันทึกคือกด ctrl + o แล้วมันจากถามชื่อไฟล์ กด Enter ผ่านได้เลย ส่วนวิธีออกคือกด ctrl + x

รีสตาร์ท Service ของ SSH

1
systemctl restart sshd.service

⚠️ ข้อควรระวัง!

อย่าพึ่งปิดหน้าต่าง Terminal อันปัจจุบันเด็ดขาด! ให้เปิดหน้าต่างใหม่ขึ้นมาทดสอบก่อนเลยว่า config ตัวใหม่ล็อกอินเข้าได้ปกติไหม:

1
ssh -p 22000 yourname@你的服务器IP

ถ้าเข้าได้สบาย ค่อยไปปิดหน้าต่างเก่าทิ้ง แต่ถ้าเข้าไม่ได้ ก็ยังพอมีโอกาสกลับไปแก้ config ในหน้าต่างเก่าได้อยู่

ถ้าคุณซื้อเป็นเซิร์ฟเวอร์ประเภท Lightweight ส่วนใหญ่พอร์ตนี้จะเปลี่ยนไม่ได้นะ แต่ถ้าเป็น ECS แบบดั้งเดิมจะเปลี่ยนได้ ระวังเรื่องนี้หน่อย


3.5 ตั้งค่า UFW Firewall

UFW防火墙规则

UFW (Uncomplicated Firewall) คือเครื่องมือ Firewall มาตรฐานของ Ubuntu ตั้งค่าง่ายแต่พลังเยอะเลย

การตั้งค่าเบื้องต้น

1
2
3
4
5
6
7
8
9
10
11
# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH(使用你设置的端口)
ufw allow 22000/tcp comment 'SSH'
ufw allow 22/tcp comment 'SSH' # 如果是轻量服务器,还是开22端口

# 允许 HTTP 和 HTTPS
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

เปิดใช้งาน Firewall

1
ufw enable

ระบบจะขึ้นข้อความเตือนมา:

1
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

พิมพ์ y เพื่อยืนยัน

เช็คสถานะ

1
ufw status verbose

ufw status 的输出结果

23022 คือผมพิมพ์ผิดเองครับ ทุกคนใส่ตามเลขพอร์ตจริงของตัวเองได้เลยนะ

ผลลัพธ์จะออกมาประมาณนี้:

1
2
3
4
5
6
7
8
9
10
11
12
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To Action From
-- ------ ----
22000/tcp (SSH) ALLOW IN Anywhere
80/tcp (HTTP) ALLOW IN Anywhere
443/tcp (HTTPS) ALLOW IN Anywhere
22000/tcp (SSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (HTTP (v6)) ALLOW IN Anywhere (v6)
443/tcp (HTTPS (v6)) ALLOW IN Anywhere (v6)

คำสั่งที่ใช้บ่อยๆ สำหรับเรียกดู

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看状态
ufw status

# 添加规则
ufw allow 8080/tcp

# 删除规则
ufw delete allow 8080/tcp

# 允许特定 IP 访问所有端口
ufw allow from 192.168.1.100

# 禁用防火墙(不推荐)
ufw disable

# 重置所有规则
ufw reset

3.6 เปิดใช้งาน BBR เร่งความเร็วเน็ต

BBR (Bottleneck Bandwidth and Round-trip propagation time) คืออัลกอริทึมควบคุมคอนเจสชัน TCP ที่ Google เป็นคนพัฒนาขึ้นมา ช่วยเพิ่มประสิทธิภาพเครือข่ายได้แบบชัดเจนเลยครับ

เปิดใช้งานแบบคลิกเดียว

1
2
3
4
5
6
# 添加 BBR 配置
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

# 使配置生效
sysctl -p

ตรวจสอบว่าเปิดสำเร็จหรือยัง

1
2
# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

ผลลัพธ์ที่ได้ควรจะเป็นแบบนี้:

1
net.ipv4.tcp_congestion_control = bbr
1
2
# 确认 BBR 模块已加载
lsmod | grep bbr

ผลลัพธ์จะออกมาประมาณนี้:

1
tcp_bbr    20480  3

💡 ผลลัพธ์จากการเปิด BBR

หลังจากเปิด BBR แล้ว โดยเฉพาะในสภาพแวดล้อมที่เน็ตไม่ค่อยเสถียรหรือมี latency สูง คุณจะรู้สึกได้ทันทีเลยว่า:

  • ความเร็วในการดาวน์โหลดเร็วขึ้น
  • พิมพ์คำสั่งผ่าน SSH ลื่นไหลขึ้น
  • โหลดหน้าเว็บเร็วกว่าเดิม

bbr 开启


3.7 ตั้งค่า fail2ban ป้องกันการถูก Brute Force

fail2ban จะคอยเฝ้าสอดส่อง log ให้เองครับ แล้วก็จะแบน IP ที่ล็อกอินผิดพลาดหลายครั้งโดยอัตโนมัติทันที

การตั้งค่าเบื้องต้น

1
2
3
4
5
# 复制默认配置(不要直接修改 jail.conf)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
vim /etc/fail2ban/jail.local

หาส่วนของ [sshd] แล้วตรวจสอบให้แน่ใจว่ามีการตั้งค่าดังนี้นะครับ:

1
2
3
4
5
6
7
8
[sshd]
enabled = true
port = 22000 # 改成你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 最大尝试次数
bantime = 3600 # 封禁时间(秒),这里是 1 小时
findtime = 600 # 在这个时间窗口内

fail2ban

สตาร์ทเซอร์วิส

1
2
3
4
5
# 重启 fail2ban
systemctl restart fail2ban

# 设置开机自启
systemctl enable fail2ban

เช็คสถานะ

1
2
3
4
5
# 查看 fail2ban 状态
fail2ban-client status

# 查看 SSH 监控状态
fail2ban-client status sshd

fail2ban-client status sshd 的输出

Output จะประมาณนี้:

1
2
3
4
5
6
7
8
9
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

คำสั่งที่ใช้บ่อย

1
2
3
4
5
6
7
8
# 手动封禁 IP
fail2ban-client set sshd banip 1.2.3.4

# 手动解封 IP
fail2ban-client set sshd unbanip 1.2.3.4

# 查看被封禁的 IP
fail2ban-client status sshd

3.8 [ไม่บังคับ] จัดการเซิร์ฟเวอร์หลายตัวด้วย SSH Config

ถ้าคุณมีเซิร์ฟเวอร์หลายตัว การพิมพ์ ssh -p 22000 user@ip ทุกครั้งก็วุ่นวายอยู่พอสมควร ลองใช้ SSH Config มาช่วยให้ชีวิตง่ายขึ้นกันเถอะ

ไฟล์ Config

เปิดแก้ไข ~/.ssh/config ใน เครื่องคอมของคุณเอง นะ:

1
vim ~/.ssh/config

แล้วเพิ่ม Config ลงไป:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 第一台服务器
Host vps1
HostName 192.168.1.100
User yourname
Port 22000
IdentityFile ~/.ssh/id_ed25519

# 第二台服务器
Host vps2
HostName 192.168.1.101
User admin
Port 22222
IdentityFile ~/.ssh/id_ed25519

# 通用设置(应用于所有连接)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes

วิธีใช้งาน

ตอนนี้เรียกใช้ผ่าน Alias ตรงๆ ได้เลย:

1
2
3
4
5
# 连接第一台服务器
ssh vps1

# 连接第二台服务器
ssh vps2

ไม่ต้องมานั่งจำ IP, Port หรือ Username ให้ปวดหัวแล้ว!


3.9 [ไม่บังคับ] อนุญาตเฉพาะ Cloudflare เท่านั้น

ถ้าเว็บไซต์ของคุณอยู่หลัง Cloudflare แทบจะทั้งหมด ก็เซ็ตให้เข้าได้แค่ IP ของ Cloudflare ผ่าน Port 80/443 อย่างเดียวเพื่อเพิ่มความปลอดภัยได้เลย

⚠️ ระวัง: การตั้งค่านี้ต้องใช้โดเมนของคุณเชื่อมต่อกับ Cloudflare CDN ไว้แล้วนะ

สคริปต์ตั้งค่าอัตโนมัติ

1
2
3
4
5
6
7
8
# 下载脚本
wget -O ~/.cloudflare-ufw.sh https://gist.githubusercontent.com/Xm798/12560579ce11f62027ea8da1fae37456/raw/b07ac8cfe09badf02fc70e2d8bc2da68cabbda50/cloudflare-ufw.sh

# 添加执行权限
chmod +x ~/.cloudflare-ufw.sh

# 执行脚本
~/.cloudflare-ufw.sh

สคริปต์นี้จะ:

  1. ไปดึง IP range ล่าสุดจากเว็บทางการของ Cloudflare
  2. เพิ่มกฎ UFW ให้ยอมรับเฉพาะ IP พวกนี้เข้าพอร์ต 80/443 เท่านั้น
  3. Reload UFW ซักรอบ

ตั้งเวลอัปเดตอัตโนมัติ

IP range ของ Cloudflare อาจจะมีการเปลี่ยนแปลง เรามาตั้งให้มันอัปเดตอัตโนมัติทุกสัปดาห์กัน:

1
2
# 添加 cron 任务(每周一凌晨执行)
(crontab -l 2>/dev/null; echo "0 0 * * 1 /root/.cloudflare-ufw.sh > /dev/null 2>&1") | crontab -

3.10 ตั้งค่า Timezone

ค่าเริ่มต้นอาจจะเป็น UTC อยู่ เปลี่ยนเป็น Timezone ของที่คุณอยู่จะได้อ่าน Log ง่ายขึ้น:

1
2
3
4
5
6
7
8
# 查看当前时区
timedatectl

# 设置为上海时区(中国用户)
sudo timedatectl set-timezone Asia/Shanghai

# 验证
date

设置时区


3.11 [ไม่บังคับ] ตั้งค่าอัปเดตความปลอดภัยอัตโนมัติ

ปล่อยให้ระบบลง Security Patch เองอัตโนมัติเลย จะได้ไม่ต้องมานั่งทำเองทุกครั้ง:

1
2
3
4
5
# 安装自动更新工具
sudo apt install -y unattended-upgrades

# 配置
sudo dpkg-reconfigure --priority=low unattended-upgrades

เลือก “Yes” เพื่อเปิดใช้งานการอัปเดตอัตโนมัติ

💡 ฟีเจอร์นี้จะลง อัปเดตด้านความปลอดภัย ให้อัตโนมัติ โดยจะไม่อัปเกรดข้ามไปเวอร์ชันหลัก (Major Version) ใหม่ ๆ ให้เลย ก็ถือว่าปลอดภัยอยู่


4. สรุป

Checklist สำหรับการเตรียมระบบ

หลังจากตั้งค่าทั้งหมดด้านบนเสร็จแล้ว ลองเอา Checklist นี้ไปเช็คทบทวนซักรอบ:

รายการตรวจสอบ คำสั่ง ผลลัพธ์ที่คาดหวัง
ระบบอัปเดตแล้ว apt update && apt list --upgradable ไม่มีแพ็กเกจให้อัปเกรด
ผู้ใช้ทั่วไปใช้ sudo ได้ sudo whoami แสดงผลลัพธ์ root
ล็อกอินด้วย Key ปกติ ssh yourname@ip -p port ล็อกอินเข้าได้โดยไม่ต้องใส่รหัสผ่าน
ปิดการล็อกอินด้วยรหัสผ่านแล้ว grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
เปลี่ยนพอร์ต SSH แล้ว grep Port /etc/ssh/sshd_config พอร์ตที่คุณตั้งไว้
เปิดใช้งาน Firewall แล้ว ufw status Status: active
เปิดใช้งาน BBR แล้ว sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban กำลังทำงาน systemctl status fail2ban active (running)
ตั้งค่า Timezone แล้ว timedatectl Asia/Shanghai หรือเขตเวลาของคุณ
SSH Config ในเครื่อง cat ~/.ssh/config ตั้งค่าชื่อย่อเซิร์ฟเวอร์ไว้แล้ว

ตำแหน่งไฟล์สำคัญ

1
2
3
4
/etc/ssh/sshd_config        # SSH 服务端配置
~/.ssh/authorized_keys # 允许登录的公钥
~/.ssh/config # 本地 SSH 客户端配置(在你电脑上)
/etc/fail2ban/jail.local # fail2ban 配置

แนวทางปฏิบัติด้านความปลอดภัยที่ดีที่สุด

  1. อัปเดตระบบเป็นประจำ: apt update && apt upgrade
  2. เช็ค Log การล็อกอินเป็นระยะ: lastb (ล็อกอินล้มเหลว), last (ล็อกอินสำเร็จ)
  3. ติดตามสถานะการแบนของ fail2ban อยู่เสมอ
  4. แบ็กอัปไฟล์ Config สำคัญก่อนแก้ไขเสมอ

5. บันทึกปัญหาผิดปกติ

Q1: ล็อกอินด้วย Key ไม่ผ่าน ยังต้องใส่รหัสผ่านอยู่?

สาเหตุที่เป็นไปได้:

  1. ปัญหาสิทธิ์ (Permission) (เจอบ่อยสุด)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. คัดลอก Public Key มาไม่ครบหรือผิด

    1
    2
    3
    # 检查 authorized_keys 内容
    cat ~/.ssh/authorized_keys
    # 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头
  3. SELinux มากวน (ระบบ CentOS/RHEL)

    1
    restorecon -Rv ~/.ssh

Q2: เปลี่ยน Port แล้วเข้าไม่ได้?

วิธีเช็ค:

  1. ดูให้แน่ใจว่าเปิด Port ใหม่ใน Firewall แล้ว:

    1
    ufw status | grep 你的端口
  2. เช็คดูว่าตั้งค่า SSH ถูกต้อง:

    1
    grep Port /etc/ssh/sshd_config
  3. ยืนยันว่า Service ของ SSH รันอยู่:

    1
    systemctl status sshd
  4. ถ้าเข้าไม่ได้เลยสักทาง ให้ใช้ VNC/Console ของผู้ให้บริการเข้าไปแก้ไข

Q2.5: เปลี่ยน Port แล้วไม่มีผลเลย? (กรณี Lightweight Server ของผู้ให้บริการ Cloud)

อาการ: แก้ /etc/ssh/sshd_config แล้ว พอ Restart Service ทีไร Port 22 ก็ยังครองอยู่ ส่วน Port ใหม่ไม่ยอมทำงาน

วิธีวินิจฉัย:

bash

1
2
# 查看是谁在监听 22 端口
netstat -lntp | grep :22

ถ้า Output ออกมาประมาณนี้:

1
tcp  0  0.0.0.0:22  0.0.0.0:*  LISTEN  1/init

แปลว่า Port 22 นั้นถูก init (PID 1) เป็นฝ่ายดักรออยู่ ไม่ใช่ Process ของ sshd นะเว้ย

เหตุผล: SSH ของบางค่ายที่เป็นแบบ “Light Application Server” หรือ “Container Instance” จะถูกจัดการผ่าน พร็อกซีระดับแพลตฟอร์ม ดังนั้นการแก้ไขค่า sshd ข้างในเซิร์ฟเวอร์ของคุณเองจึงไม่มีผล

วิธีแก้ไข:

ประเภทอินสแตนซ์ วิธีแก้ไขพอร์ต SSH
ECS แบบดั้งเดิม แก้ไข sshd_config ✅
เซิร์ฟเวอร์เบาๆ อาจต้องไปแก้ที่แผงควบคุมของค่ายคลาวด์ หรือไม่รองรับการแก้ไขเลย
Container Instance ส่วนใหญ่จะไม่รองรับการแก้ไข

ถ้าอินสแตนซ์ของคุณไม่รองรับการเปลี่ยนพอร์ต มาตรการรักษาความปลอดภัยอย่างอื่นยิ่งสำคัญกว่า:

  • ✅ สร้างผู้ใช้ทั่วไป + ปิดการล็อกอินด้วย root
  • ✅ ล็อกอินด้วย SSH Key + ปิดการล็อกอินด้วยรหัสผ่าน
  • ✅ ใช้ fail2ban ป้องกันการถูก Brute Force

ถ้าทำข้อเหล่านี้ครบและเหมาะสม ความปลอดภัยก็ยังถือว่าอยู่ในระดับสูงอยู่ดี

Q3: โดน fail2ban แบนตัวเอง?

1
2
3
4
5
# 用 VNC 登录后解封
fail2ban-client set sshd unbanip 你的IP

# 把你的 IP 加入白名单,编辑 jail.local
ignoreip = 127.0.0.1/8 ::1 你的IP

Q4: เปิด UFW แล้วเข้าเว็บไม่ได้?

1
2
3
4
5
6
# 检查 80/443 是否开放
ufw status

# 如果没有,添加规则
ufw allow 80/tcp
ufw allow 443/tcp

Q5: พิมพ์คำสั่งแล้วขึ้นว่าไม่พบ sudo?

บางที Debian แบบ Minimal Install อาจจะไม่มี sudo มาให้ ให้ใช้ root ในการติดตั้ง:

1
2
apt install sudo
usermod -aG sudo ittinker

6. สคริปต์ตั้งค่าเริ่มต้นแบบคลิกเดียว (ใช้เมื่อคุ้นเคยแล้ว)

ถ้าคุณเก่งและคุ้นเคยกับขั้นตอนข้างต้นแล้ว ก็สามารถใช้สคริปต์นี้เพื่อตั้งค่าเริ่มต้นแบบรวดเร็วได้เลย

⚠️ สำคัญ: ก่อนจะรันสคริปต์ อย่าลืมเช็คให้แน่ใจว่าเตรียม SSH Public Key ของคุณเรียบร้อยแล้วนะ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# VPS 初始化脚本
# 使用方法:以 root 身份运行

set -e

# === 配置区域(根据你的需求修改)===
NEW_USER="ittinker" # 新用户名
NEW_SSH_PORT="22000" # 新 SSH 端口
TIMEZONE="Asia/Shanghai" # 时区
# =====================================

echo "=== VPS 初始化脚本 ==="
echo ""

# 1. 更新系统
echo "[1/8] 更新系统..."
apt update && apt upgrade -y

# 2. 安装基础工具
echo "[2/8] 安装基础工具..."
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

# 3. 创建新用户
echo "[3/8] 创建用户 $NEW_USER..."
if id "$NEW_USER" &>/dev/null; then
echo "用户已存在,跳过创建"
else
adduser --gecos "" $NEW_USER
usermod -aG sudo $NEW_USER
fi

# 4. 配置 SSH 目录
echo "[4/8] 配置 SSH 目录..."
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
touch /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh

echo ""
echo ">>> 请将你的公钥粘贴到下面(粘贴后按 Ctrl+D 结束):"
cat >> /home/$NEW_USER/.ssh/authorized_keys
echo ""

# 5. 修改 SSH 配置
echo "[5/8] 修改 SSH 配置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*Port .*/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#*PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*PermitEmptyPasswords .*/PermitEmptyPasswords no/" /etc/ssh/sshd_config

# 6. 配置防火墙
echo "[6/8] 配置防火墙..."
ufw default deny incoming
ufw default allow outgoing
ufw allow $NEW_SSH_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable

# 7. 开启 BBR
echo "[7/8] 开启 BBR..."
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 8. 设置时区
echo "[8/8] 设置时区..."
timedatectl set-timezone $TIMEZONE

# 重启 SSH
systemctl restart sshd

echo ""
echo "=========================================="
echo " ✅ 初始化完成!"
echo "=========================================="
echo ""
echo " 新 SSH 端口: $NEW_SSH_PORT"
echo " 新用户: $NEW_USER"
echo " 时区: $TIMEZONE"
echo ""
echo " 请使用以下命令登录:"
echo " ssh -p $NEW_SSH_PORT $NEW_USER@$(curl -s ifconfig.me 2>/dev/null || echo '你的IP')"
echo ""
echo " ⚠️ 重要:请先测试新配置能否登录,再关闭当前终端!"
echo ""

7. ทำไปถึงนี้ ความปลอดภัยดีขึ้นขนาดไหน?

ขั้นตอน ทำอะไรไปบ้าง ทำไมถึงสำคัญ
อัปเดตระบบ ลงแพตช์ล่าสุด แก้บั๊กที่รู้ว่ามีช่องโหว่
สร้างยูสเซอร์ใหม่ เลิกใช้ root ตรงๆ ลดความเสี่ยงพิมพ์ผิดทำเรื่องเลวร้าย
SSH Key ใช้คีย์แทนรหัสผ่าน กันพวกเดาพาสเวิร์ดได้เลย
เปลี่ยนพอร์ต หนีจากพอร์ต 22 ที่เป็นค่าเริ่มต้น ลดโอกาสโดนสแกนเจอ
ปิดรหัสผ่าน อนุญาตให้ล็อกอินด้วยคีย์เท่านั้น ตัดปัญหาโดนแฮ็กผ่านพาสเวิร์ดไปเลย
ปิด root ห้ามล็อกอินด้วย root ตรงๆ ทำให้คนร้ายบุกยากขึ้น
UFW Firewall เปิดเฉพาะพอร์ตที่จำเป็น ลดพื้นที่ให้คนมาโจมตี
เปิด BBR ปรับแต่งเครือข่ายให้ลื่นขึ้น เพิ่มความเร็วในการเข้าถึง
fail2ban แบน IP ตัวการอัตโนมัติ กันพวกมาก่อกวน่นต่อเนื่อง

ทำครบทุกข้อ ความปลอดภัยเซิร์ฟเวอร์ของคุณจะแซง 90% ของ VPS ทั่วไปไปแล้ว


ตอนต่อไปเราจะมาคุยกันเรื่อง

ตอนต่อไปจะพาไปดู สรุปการตั้งค่าล็อกอินด้วย SSH Key แบบเร็วๆ โดยจะเจาะลึกให้ละเอียดขึ้นในเรื่อง:

  • วิธีสร้างคีย์บนระบบปฏิบัติการต่างๆ
  • จัดการคีย์หลายๆ อัน
  • ตั้งค่า SSH Agent
  • ตั้งค่า SSH Client ยอดฮิตต่างๆ

อัปเดตล่าสุด: มกราคม 2026

ซีรีส์กล่องเครื่องมือสำหรับ Indie Dev ฝ่าฟีเจอร์เดี่ยว กดติดตามกันไว้เลย!