VPS mới mua giống như một cánh cửa chưa khóa vậy, script kiddies khắp thế giới đang gõ cửa bài bài. Bài viết này sẽ hướng dẫn bạn khóa cửa cẩn thận, để con “tôm hùm” (openclaw) của bạn không lo chạy nhảy lung tung nữa.

0. Nói trước đã

Vừa sắm một con VPS, háo hức nhận được IP và mật khẩu root, rồi sao tiếp?

Nhiều bạn的做法 là: cài phần mềm、deploy project luôn.

这是个危险的习惯。

VPS của bạn có một public IP, nghĩa là bất kỳ ai trên thế giới cũng có thể thử kết nối vào. Mà trong cấu hình mặc định thì:

  • Port đang mở công khai là 22
  • Username ai cũng biết là root
  • Chỉ còn mỗi cái password bảo vệ bạn thôi

Ngày nào cũng có vô số script tự động quét các dải IP, thử brute-force bằng các mật khẩu phổ biến. Server của bạn từ lúc lên mạng là đã bị tấn công rồi.

Cho nên, việc đầu tiên cần làm sau khi nhận VPS không phải là cài phần mềm, mà là làm security init.


1. Mục tiêu kỳ vọng

Mục tiêu của bài viết này là:

  • ✅ Thiết lập truy cập từ xa an toàn: đăng nhập bằng SSH key + đổi port mặc định
  • ✅ Tạo user thông thường: hạn chế dùng thẳng tài khoản root
  • ✅ Cấu hình firewall: chỉ mở những port thực sự cần thiết
  • ✅ Bật tăng tốc mạng: BBR giúp mạng bay lượn
  • ✅ Chống brute-force: fail2ban tự động ban IP độc hại

Làm xong mấy bước này, VPS của bạn sẽ có một nền tảng vững chắc, tha hồ deploy đủ thứ service mà không lo.


2. Lên kế hoạch

Tại sao phải làm mấy bước cấu hình này?

VPS mới mua giống như một căn nhà thô vừa bàn giao vậy:

Trạng thái mặc định Rủi ro Giải pháp của chúng ta
Đăng nhập trực tiếp bằng user root Quyền quá lớn, sai một thao tác là hậu quả nặng Tạo user thường + sudo
Đăng nhập bằng mật khẩu Dễ bị dò mật khẩu (brute-force) Đăng nhập bằng SSH key
Mặc định dùng port 22 Bị scanner quét tới tấp Đổi sang port không chuẩn
Tường lửa tắt Mọi port đều mở ngỏ cho bên ngoài Dùng UFW, chỉ mở port cần thiết
Mạng gốc Tỷ lệ rớt gói tin cao, độ trễ lớn Thuật toán kiểm soát tắc nghẽn BBR

Toàn bộ quy trình

VPS初始化流程

Chúng ta cứ thao tác theo đúng thứ tự này, mình sẽ giải thích rõ “tại sao phải làm thế” ở từng bước một.

3. Các bước thao tác

3.1 Lần đầu đăng nhập và cập nhật hệ thống

Lấy IP của server

Sau khi mua VPS, nhà cung cấp sẽ gửi cho bạn:

  • Địa chỉ IP: ví dụ 192.168.1.100
  • Port: thường là 22 (một số nhà cung cấp có thể đổi sang port khác)
  • Username: thường là root
  • Password: một chuỗi ký tự được tạo ngẫu nhiên

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

Kết nối SSH

Dân dùng Mac / Linux: mở Terminal lên, gõ thẳng lệnh này vào:

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

Dân dùng Windows:

  • Windows 10/11 đã có sẵn OpenSSH, bạn dùng lệnh trên trực tiếp trong PowerShell hoặc CMD luôn
  • Hoặc xài mấy tool như Termius, MobaXterm cũng được

Lần đầu kết nối nó sẽ hỏi bạn xác nhận 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])?

Nó đang hỏi: “Tao chưa quen con máy này, mày chắc chắn muốn kết nối chứ?”

yes rồi Enter. Tiếp theo nhập password vào (lưu ý: lúc gõ sẽ không hiện ký tự nào hết, đây là cơ chế bảo mật bình thường nhé), rồi Enter.

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

Thấy dòng thông báo kiểu thế này là login thành công rồi:

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

💡 Tại sao phải kiểm tra fingerprint?

Đây là để phòng tránh “tấn công trung gian” (Man-in-the-Middle). Lần đầu kết nối bạn ghi lại fingerprint của server, về sau nếu kết nối mà fingerprint bị thay đổi, chứng tỏ có khả năng ai đó đang mạo danh server của bạn.

登录成功了

Làm quen với server của bạn

Sau khi đăng nhập, trước hết hãy tìm hiểu chút về thông tin cơ bản của con máy này nhé:

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

服务器基本信息输出

Nhớ kỹ mấy thông tin này nhé, về sau khi gặp lỗi cần debug thì sẽ dùng đến đấy.

Cập nhật hệ thống

Sau khi nắm được thông tin server, việc chính đáng làm đầu tiên là update hệ thống. Image hệ thống của server mới có thể là từ mấy tháng trước, trong khoảng thời gian đó có thể đã có bản vá bảo mật được tung ra rồi:

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

Giải thích các tham số:

  • apt update: Cập nhật chỉ mục gói phần mềm
  • apt full-upgrade: Nâng cấp toàn bộ phần mềm, bao gồm cả kernel
  • -y: Tự động xác nhận, không cần gõ yes thủ công
  • apt autoremove: Xóa các dependency không còn cần thiết
  • apt autoclean: Dọn dẹp bộ nhớ đệm của các gói cài đã tải về

apt update 和 apt upgrade 执行过程

⏱️ Bước này có thể mất vài phút, tùy vào lượng update mà có. Đôi khi giữa chừng nó có hỏi xác nhận, cứ theo logic của nó mà bấm thôi, không sao cả.

Kiểm tra xem có cần reboot không

Sau khi update kernel, thường thì phải reboot mới có hiệu lực:

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

是否需要重启

Nếu nó báo cần reboot:

1
reboot

Sau khi reboot xong, bạn cần kết nối SSH lại nhé.

Cài đặt các công cụ thông dụng

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

Mấy cái tool này dùng để làm gì:

Công cụ Mục đích sử dụng
sudo Cho phép user thường chạy lệnh admin
curl / wget Tải file
git Quản lý phiên bản (version control)
vim Trình soạn thảo văn bản
htop Trình theo dõi process xịn xò hơn
tree Hiển thị cấu trúc thư mục dạng cây
net-tools Công cụ mạng (ifconfig, netstat, v.v.)
ufw Tường lửa đơn giản, dễ xài
fail2ban Chống brute-force
neofetch Hiển thị thông tin hệ thống cho đẹp
neofetch 显示的系统信息

3.2 Tạo user không phải root

Tại sao không dùng root luôn?

Quyền của user root lớn quá, lỡ tay gõ nhầm một phát rm -rf / là bay màu toàn bộ luôn. Vậy nên, thao tác hàng ngày cứ dùng user thường, khi nào cần quyền admin thì gọi sudo lên là được.

Con lobster (openclaw) dữ lắm, sao dám giao root cho nó xài chứ?

Tạo user

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

Hệ thống sẽ hỏi bạn đặt mật khẩu và điền vài thông tin:

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 创建用户的完整交互过程

Cấp quyền sudo

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

Kiểm tra thử nhé:

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

# 测试 sudo 是否生效
sudo whoami

Nếu kết quả in ra root, nghĩa là bạn cấu hình sudo thành công rồi đó.
测试sudo

💡 Mẹo nhỏ

exit để quay lại user root. Vài bước setup tiếp theo tụi mình cứ dùng root cho tiện, setup xong hẵng chuyển về user thường nhé.


3.3 Cấu hình đăng nhập bằng SSH Key

Xác thực bằng Key vs xác thực bằng mật khẩu

SSH密钥认证原理

Xác thực bằng Key an toàn hơn dùng mật khẩu rất nhiều:

  • Mật khẩu có thể bị brute-force (dò bạo lực), còn key thì gần như không thể
  • Không phải gõ mật khẩu mỗi lần, tiện hơn hẳn
  • Dù mật khẩu có bị lộ, mà không có private key thì cũng chẳng ai login được

Bước 1: Tạo cặp key ở máy local

Chạy trên máy tính của bạn (không phải máy chủ):

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

Nó sẽ hiện ra như sau:

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

Cứ bấm Enter luôn để dùng đường dẫn mặc định. Ở đây mình dùng ./ittinker , nghĩa là lưu ở thư mục hiện tại với tên file là ittinker

1
Enter passphrase (empty for no passphrase):

Bạn có thể đặt mật khẩu cho key (thêm một lớp bảo vệ), hoặc cứ bấm Enter để bỏ qua cũng được.

本地生成 SSH 密钥的过程

Sau khi tạo xong, bạn sẽ thấy hai file trong thư mục ~/.ssh/ (dưới đây là tên file mặc định nếu bạn bấm Enter ở bước trước):

  • id_ed25519: Private key (khóa bí mật), tuyệt đối không được để lộ nhé!
  • id_ed25519.pub: Public key (khóa công khai), cái này thì sẽ upload lên máy chủ

💡 ed25519 vs RSA

ed25519 là thuật toán được khuyên dùng hiện nay, an toàn hơn và key ngắn hơn so với RSA truyền thống. Nếu hệ thống của bạn quá cũ không hỗ trợ, thì dùng ssh-keygen -t rsa -b 4096 cũng được.

Một chút chi tiết nha, key ed25519 sinh ra khá nhỏ, còn file RSA thì to đùng, hỏi AI mới biết là kích thước không quan trọng đâu, nó là do thuật toán quyết định.

Bước hai: Upload public key lên máy chủ

Cách A: Dùng ssh-copy-id (khuyên dùng)

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

Sau khi nhập mật khẩu, public key sẽ tự động được copy lên máy chủ.

ssh-copy-id 执行成功

Cách B: Copy thủ công

Nếu ssh-copy-id không dùng được, bạn có thể thao tác thủ công:

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

Copy đoạn nội dung được xuất ra (một chuỗi dài bắt đầu bằng 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

⚠️ Quyền truy cập rất quan trọng!

SSH yêu cầu rất khắt khe về quyền của file:

  • Thư mục .ssh: 700 (chỉ user đó mới được truy cập)
  • File authorized_keys: 600 (chỉ user đó mới được đọc và ghi)

Nếu thiết lập sai quyền, SSH sẽ từ chối đăng nhập bằng key.

Bước 3: Test đăng nhập bằng key

Mở một cửa sổ terminal mới (đừng đóng cửa sổ cũ vội, lỡ config sai còn có đường lui), sau đó test đăng nhập bằng key xem sao:

1
ssh ittinker@你的服务器IP

Nếu đăng nhập được mà không cần nhập mật khẩu là key đã config thành công rồi! 🎉

(Nếu bạn có đặt passphrase cho private key, hệ thống sẽ hỏi mật khẩu của key, đây là chuyện bình thường nhé)
使用密钥成功登录(无需服务器密码)

Ở đây mình thêm tham số -i là vì cái key này không nằm ở đường dẫn mặc định, mà được đặt ở thư mục hiện tại. Nếu không chỉ định rõ, hệ thống sẽ dùng key mặc định.


3.4 Tăng cường bảo mật cho SSH

Giờ đăng nhập bằng key đã chạy ngon rồi, chúng ta cùng tiến hành harden SSH nhé:

  1. Đổi port mặc định (tránh bị quét rà)
  2. Tắt đăng nhập bằng mật khẩu
  3. Cấm root đăng nhập trực tiếp

Chỉnh sửa file cấu hình SSH

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

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

修改前

Tìm và chỉnh sửa các cấu hình sau (mấy cái có thể đang bị comment, bạn nhớ xóa dấu # ở đầu đi nhé):

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 关键配置

Lưu lại rồi thoát ra (ctrl + o).

Với Nano thì nhấn ctrl + o để lưu, nó sẽ hỏi tên file, cứ Enter luôn là xong, còn thoát ra thì nhấn ctrl + x.

Khởi động lại dịch vụ SSH

1
systemctl restart sshd.service

⚠️ Lưu ý quan trọng!

Đừng vội đóng terminal hiện tại nha! Cứ mở một cửa sổ mới lên test thử xem cấu hình mới có đăng nhập bình thường không đã:

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

Nếu đăng nhập được rồi thì hẵng đóng cửa sổ cũ. Còn nếu không vào được, bạn vẫn có thể quay lại cửa sổ cũ để sửa config.

Nếu bạn mua mấy VPS giá rẻ nhẹ thì khả năng cao là cái port này không cho đổi đâu, còn mấy con ECS truyền thống thì đổi được, chú ý nha.


3.5 Cấu hình tường lửa UFW

UFW防火墙规则

UFW (Uncomplicated Firewall) là công cụ tường lửa mặc định của Ubuntu, cấu hình thì đơn giản mà tính năng thì xịn xò.

Cấu hình cơ bản

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'

Bật tường lửa

1
ufw enable

Nó sẽ hiện thông báo:

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

y để xác nhận.

Kiểm tra trạng thái

1
ufw status verbose

ufw status 的输出结果

23022 là mình gõ nhầm thôi, mấy bạn cứ chỉnh theo tình hình thực tế của mình là được nha

Kết quả sẽ kiểu như:

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)

Bảng tham khảo lệnh thường dùng

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 Bật tăng tốc BBR

BBR (Bottleneck Bandwidth and Round-trip propagation time) là thuật toán kiểm soát tắc nghẽn TCP do Google phát triển, giúp tăng cường hiệu suất mạng đáng kể.

Bật nhanh chỉ với một lệnh

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

Kiểm tra xem đã bật chưa

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

Kết quả trả về sẽ là:

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

Kết quả sẽ kiểu như:

1
tcp_bbr    20480  3

💡 Hiệu quả của BBR

Sau khi bật BBR, đặc biệt là trong môi trường mạng không ổn định hoặc độ trễ cao, bạn sẽ cảm nhận rõ rệt:

  • Tốc độ tải xuống nhanh hơn
  • Thao tác SSH mượt mà hơn
  • Tốc độ tải trang web nhanh hơn

bbr 开启


3.7 Cấu hình fail2ban chống brute-force

fail2ban sẽ theo dõi log, phát hiện IP đăng nhập thất bại nhiều lần thì tự động block.

Cấu hình cơ bản

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

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

Tìm phần [sshd], đảm bảo có các cấu hình sau:

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

Khởi động dịch vụ

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

# 设置开机自启
systemctl enable fail2ban

Kiểm tra trạng thái

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

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

fail2ban-client status sshd 的输出

Kết quả trả về sẽ trông kiểu thế này:

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:

Các lệnh thường dùng

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 [Tùy chọn] Quản lý nhiều server với SSH Config

Nếu bạn có nhiều server, mỗi lần gõ ssh -p 22000 user@ip thì mệt lắm. Dùng SSH Config cho gọn nhé.

File cấu hình

Trên máy tính cá nhân của bạn, mở file ~/.ssh/config ra sửa:

1
vim ~/.ssh/config

Thêm cấu hình vào:

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

Cách dùng

Giờ bạn có thể kết nối trực tiếp bằng alias luôn:

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

# 连接第二台服务器
ssh vps2

Không cần phải nhớ IP, port hay username nữa, tiện cực!


3.9 [Tùy chọn] Chỉ cho phép Cloudflare truy cập

Nếu website của bạn nằm hoàn toàn phía sau Cloudflare, bạn có thể thiết lập chỉ cho phép IP của Cloudflare truy cập vào port 80/443 để tăng độ bảo mật.

⚠️ Lưu ý: Cấu hình này yêu cầu tên miền của bạn đã trỏ qua Cloudflare CDN rồi nhé.

Script tự động cấu hình

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

Script này sẽ:

  1. Lấy dải IP mới nhất từ trang chủ Cloudflare
  2. Thêm rule UFW, chỉ cho phép các IP này truy cập port 80/443
  3. Reload lại UFW

Cài đặt cập nhật tự động

Dải IP của Cloudflare có thể thay đổi, nên set cho nó tự cập nhật mỗi tuần:

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

3.10 Cài đặt múi giờ

Múi giờ mặc định có thể là UTC, đổi sang múi giờ của bạn cho dễ xem log:

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

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

# 验证
date

设置时区


3.11 [Tùy chọn] Cấu hình cập nhật bảo mật tự động

Để hệ thống tự cài patch bảo mật, khỏi phải làm thủ công mỗi lần:

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

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

Chọn “Yes” để bật tính năng tự cập nhật.

💡 Tính năng này sẽ tự cài bản cập nhật bảo mật, không tự động nâng cấp lên phiên bản lớn mới, nên khá an tâm.


4. Tổng kết

Checklist kiểm tra khởi tạo

Sau khi xong hết mấy bước trên, dùng checklist này rà lại một lượt nha:

Mục kiểm tra Lệnh Kết quả mong đợi
Hệ thống đã cập nhật apt update && apt list --upgradable Không có gói nào cần nâng cấp
User thường có quyền sudo sudo whoami Output ra root
Đăng nhập bằng key hoạt động bình thường ssh yourname@ip -p port Đăng nhập không cần mật khẩu
Đăng nhập bằng mật khẩu đã tắt grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
Port SSH đã đổi grep Port /etc/ssh/sshd_config Port mà bạn cài đặt
Tường lửa đã bật ufw status Status: active
BBR đã kích hoạt sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban đang chạy systemctl status fail2ban active (running)
Múi giờ đã cài đặt timedatectl Asia/Shanghai hoặc múi giờ của bạn
Local SSH Config cat ~/.ssh/config Đã cấu hình alias cho server

Vị trí các file quan trọng

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

Các phương pháp bảo mật tối ưu

  1. Cập nhật hệ thống thường xuyên: apt update && apt upgrade
  2. Kiểm tra log đăng nhập định kỳ: lastb (đăng nhập thất bại), last (đăng nhập thành công)
  3. Theo dõi tình trạng block của fail2ban thường xuyên
  4. Backup trước khi chỉnh sửa các file cấu hình quan trọng

5. Ghi chú xử lý sự cố

Q1: Đăng nhập bằng key bị lỗi, vẫn phải nhập mật khẩu?

Nguyên nhân khả dĩ:

  1. Lỗi phân quyền (thường gặp nhất)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. Public key copy chưa chuẩn

    1
    2
    3
    # 检查 authorized_keys 内容
    cat ~/.ssh/authorized_keys
    # 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头
  3. SELinux quấy phá (trên hệ thống CentOS/RHEL)

    1
    restorecon -Rv ~/.ssh

Q2: Đổi port xong không kết nối được?

Các bước gỡ lỗi:

  1. Chắc chắn port mới đã được mở trên tường lửa:

    1
    ufw status | grep 你的端口
  2. Kiểm tra lại xem cấu hình SSH đã chuẩn chưa:

    1
    grep Port /etc/ssh/sshd_config
  3. Đảm bảo dịch vụ SSH đang chạy:

    1
    systemctl status sshd
  4. Nếu tịt ngõ hoàn toàn, dùng VNC/console của nhà cung cấp để đăng nhập vào sửa.

Q2.5: Đổi port mà không hề có tác dụng? (Máy chủ lightweight của nhà cung cấp cloud)

Triệu chứng: Đã sửa /etc/ssh/sshd_config, restart service xong mà port 22 vẫn còn, port mới không tác dụng.

Cách chẩn đoán:

bash

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

Nếu output ra kiểu:

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

Tức là port 22 đang được init (PID 1) lắng nghe, chứ không phải tiến trình sshd.

Lý do: Với một số nhà cung cấp cloud, SSH của các loại “Light Application Server” hoặc “Container Instance” được proxy qua lớp nền tảng, nên cấu hình sshd bên trong server của bạn sẽ không có tác dụng.

Cách giải quyết:

Loại instance Cách đổi cổng SSH
ECS truyền thống Sửa sshd_config ✅
Light server Có thể phải đổi trong console của cloud, hoặc có khi không hỗ trợ luôn
Container instance Thường không hỗ trợ đổi

Nếu instance của bạn không cho đổi cổng, thì các biện pháp bảo mật khác lại càng quan trọng hơn:

  • ✅ Tạo user thường + vô hiệu hóa đăng nhập bằng root
  • ✅ Đăng nhập SSH bằng key + vô hiệu hóa đăng nhập bằng mật khẩu
  • ✅ Dùng fail2ban chống brute-force

Làm cho đủ các bước này là độ bảo mật vẫn rất cao rồi.

Q3: fail2ban tự block chính mình?

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

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

Q4: Bật UFW xong không vào được web?

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

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

Q5: Chạy command báo không tìm thấy sudo?

Bản cài tối giản của Debian có thể không có sẵn sudo, bạn dùng root để cài:

1
2
apt install sudo
usermod -aG sudo ittinker

6. Script khởi tạo một chạm (dùng khi đã quen tay)

Nếu bạn đã rành các bước ở trên rồi, thì dùng script này để khởi tạo nhanh cho lẹ.

⚠️ Lưu ý: Trước khi chạy script, hãy đảm bảo là bạn đã chuẩn bị sẵn SSH public key nhé.

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. Làm xong mấy bước này, bảo mật tăng lên bao nhiêu rồi?

Bước Đã làm gì Tại sao quan trọng
Update hệ thống Cài các bản vá mới nhất Fix các lỗ hổng đã biết
Tạo user mới Không dùng thẳng root nữa Giảm rủi ro lỡ tay
SSH key Dùng key thay cho password Không thể bị brute-force
Đổi port Tránh thẳng port 22 mặc định Giảm xác suất bị quét tới
Tắt password Chỉ cho phép đăng nhập bằng key Triệt tiêu hoàn toàn tấn công dò mật khẩu
Tắt root root không thể đăng nhập trực tiếp Tăng độ khó cho kẻ tấn công
UFW firewall Chỉ mở những port cần thiết Thu nhỏ bề mặt tấn công
Tăng tốc BBR Tối ưu hiệu năng mạng Nâng tốc độ truy cập
fail2ban Tự động ban IP độc Chặn tấn công liên tục

Làm xon những bước này, server của bạn đã an toàn hơn 90% VPS khác rồi đấy.


Hẹn gặp ở bài tiếp theo

Bài sau tụi mình sẽ nói về Cheat sheet cấu hình đăng nhập bằng SSH key, sẽ đi chi tiết hơn về:

  • Cách tạo key trên các hệ điều hành khác nhau
  • Quản lý nhiều key
  • Cấu hình SSH Agent
  • Cài đặt các SSH client phổ biến

Bài viết cập nhật lần cuối: Tháng 1, 2026

Bộ công cụ cho indie dev series, follow mình nhé!