❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Một trong những vấn đề bảo mật nghiêm trọng nhất khi quản lý VPS là mở port SSH 22 ra public Internet. Trong bài viết này, AZDIGI sẽ hướng dẫn cách sử dụng Tailscale để bảo vệ SSH, loại bỏ hoàn toàn nguy cơ brute force attack mà vẫn có thể truy cập VPS từ bất kỳ đâu.

Tại sao không nên mở port SSH 22 ra public?

Rủi ro thực tế

Theo kinh nghiệm vận hành hạ tầng tại AZDIGI, một VPS mới với port 22 mở ra public có thể nhận:

  • Hàng nghìn request đăng nhập SSH trái phép mỗi ngày
  • Các bot tự động quét và thử đăng nhập 24/7
  • Tấn công brute force (thử đăng nhập qua SSH bằng danh sách mật khẩu bị rò rỉ cho đến khi thành công)

Kiểm tra logs trên VPS của bạn với lệnh này để xem:

grep "ssh" /var/log/auth.log | tail -20

Bạn sẽ thấy hàng loạt IP lạ cố gắng đăng nhập với các username phổ biến như root, admin, ubuntu, v.v.

Hậu quả nếu bị xâm nhập

  • Mất quyền kiểm soát server
  • Dữ liệu bị đánh cắp hoặc mã hóa (ransomware)
  • Server bị lợi dụng để gửi spam hoặc tấn công DDoS
  • Ảnh hưởng đến các khách hàng khác (nếu là hosting)

Giải pháp: SSH qua Tailscale

Thay vì mở port 22 ra public Internet, ta cấu hình SSH chỉ lắng nghe trên IP Tailscale. Chỉ những thiết bị trong tailnet của bạn mới có thể kết nối SSH.

Lợi ích

  1. Port 22 biến mất hoàn toàn trên Internet: Port 22 không tồn tại trên public IP
  2. Mã hóa kép: WireGuard + SSH encryption
  3. Xác thực 2 lớp: Phải có Tailscale + SSH credentials
  4. Không cần IP tĩnh: Truy cập qua hostname Tailscale
  5. Không cần VPN truyền thống: Tailscale xử lý tất cả

Cách hoạt động của SSH qua Tailscale

┌─────────────┐     Tailscale      ┌─────────────┐
│   Laptop    │◄──────────────────►│     VPS     │
│ (Client)    │   WireGuard VPN    │   (Server)  │
│100.64.0.2   │                    │100.64.0.1   │
└─────────────┘                    └──────┬──────┘
                                          │
                                   SSH chỉ listen
                                   trên 100.64.0.1
                                          │
                                   Port 22 public
                                   = ĐÓNG

Cấu hình SSH chỉ listen trên Tailscale IP

Bước 1: Xác nhận Tailscale đã hoạt động

Đảm bảo Tailscale đã được cài đặt và kết nối:

tailscale status
tailscale ip -4
# Ghi nhớ IP này, ví dụ: 100.64.0.1

Bước 2: Backup cấu hình SSH hiện tại

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

Bước 3: Chỉnh sửa cấu hình SSH

sudo nano /etc/ssh/sshd_config

Tìm và sửa dòng ListenAddress:

# Thay 100.64.0.1 bằng IP Tailscale thực tế của VPS
ListenAddress 100.64.0.1
# Hoặc nếu muốn listen trên cả localhost (cho các service local)
ListenAddress 100.64.0.1
ListenAddress 127.0.0.1

Quan trọng: Xóa hoặc comment dòng ListenAddress 0.0.0.0 nếu có.

Bước 4: Kiểm tra cấu hình

Trước khi restart SSH, kiểm tra cú pháp:

sudo sshd -t

Nếu không có output (không báo lỗi), cấu hình OK.

Bước 5: Restart SSH service

sudo systemctl restart sshd

Bước 6: Test kết nối

Từ thiết bị trong tailnet:

ssh user@100.64.0.1
# Hoặc dùng hostname Tailscale
ssh user@vps-name

Từ bên ngoài tailnet (public IP):

ssh user@<public-ip>
# Kết quả: Connection refused

Sử dụng Tailscale SSH (Native)

Tailscale cung cấp tính năng SSH tích hợp, cho phép SSH mà không cần cấu hình key:

Bật Tailscale SSH trên VPS

sudo tailscale up --ssh

Kết nối từ client

tailscale ssh user@vps-name

Ưu điểm của Tailscale SSH:

  • Không cần quản lý SSH keys
  • Xác thực dựa trên Tailscale identity
  • Có thể kiểm soát qua ACLs
  • Logging tập trung

Nhược điểm:

  • Chỉ hoạt động từ thiết bị có Tailscale
  • Một số tính năng SSH nâng cao có thể không hỗ trợ đầy đủ

SSH config cho Tailscale

Để tiện lợi hơn, thêm cấu hình vào ~/.ssh/config trên thiết bị của bạn để đăng nhập nhanh:

# ~/.ssh/config

Host vps-production HostName vps-production # Hostname Tailscale User root Port 22

Host vps-staging HostName 100.64.0.5 # IP Tailscale User ubuntu Port 22 IdentityFile ~/.ssh/id_ed25519

Sau đó kết nối đơn giản:

ssh vps-production
ssh vps-staging

Tắt password authentication

Để tăng cường bảo mật, nên tắt đăng nhập bằng password và chỉ dùng SSH key:

👉 Xem thêm: Bảo mật SSH với SSH Key

Bước 1: Đảm bảo đã có SSH key

Trên máy của bạn, kiểm tra hoặc tạo SSH key:

ls ~/.ssh/id_ed25519.pub
# Nếu chưa có:
ssh-keygen -t ed25519 -C "your@email.com"

Bước 2: Copy key lên VPS

ssh-copy-id user@vps-name

Sau đó hãy thực hiện đăng nhập lại vào VPS qua SSH để kiểm tra SSH key đã hoạt động chưa.

Bước 3: Tắt password authentication

Trên VPS, sửa /etc/ssh/sshd_config:

PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

Bước 4: Restart SSH

sudo systemctl restart sshd

Lưu ý: Đảm bảo SSH key đã hoạt động trước khi tắt password!

Best practices bảo mật SSH + Tailscale

1. Đổi port SSH (tùy chọn)

Dù đã ẩn sau Tailscale, đổi port vẫn là một lớp bảo vệ thêm:

# /etc/ssh/sshd_config
Port 2222

2. Giới hạn user được SSH

# /etc/ssh/sshd_config
AllowUsers admin deployer

3. Sử dụng Tailscale ACLs

Trong Tailscale Admin Console, cấu hình ACLs để giới hạn ai có thể SSH:

{
  "acls": [
    {"action": "accept", "src": ["group:admin"], "dst": ["*:22"]}
  ]
}

4. Bật SSH logging

# /etc/ssh/sshd_config
LogLevel VERBOSE

5. Giới hạn số lần thử đăng nhập

# /etc/ssh/sshd_config
MaxAuthTries 3

Kết hợp với fail2ban (tùy chọn)

Dù đã có Tailscale, fail2ban vẫn hữu ích nếu bạn giữ SSH trên localhost:

# Cài đặt fail2ban
sudo apt install fail2ban -y

# Tạo cấu hình local sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Chỉnh sửa sudo nano /etc/fail2ban/jail.local

Cấu hình cơ bản:

[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600

Khôi phục nếu bị lock out

Nếu vô tình cấu hình sai và không thể SSH:

Qua VNC/Console

Hầu hết VPS providers (bao gồm AZDIGI) cung cấp VNC hoặc web console. Sử dụng để:

  1. Đăng nhập vào VPS
  2. Sửa /etc/ssh/sshd_config
  3. Restart SSH

Khôi phục từ backup

sudo cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config
sudo systemctl restart sshd

Cài đặt Tailscale trên AlmaLinux/RHEL

Bài viết trên sử dụng Ubuntu làm ví dụ. Nếu bạn sử dụng AlmaLinux, Rocky Linux hoặc RHEL, cách cài đặt Tailscale như sau:

Cách 1: Dùng script cài đặt tự động (khuyên dùng):

curl -fsSL https://tailscale.com/install.sh | sh

Cách 2: Cài đặt thủ công qua dnf:

# Thêm Tailscale repo
sudo dnf config-manager --add-repo https://pkgs.tailscale.com/stable/rhel/9/tailscale.repo

# Cài đặt sudo dnf install tailscale -y

# Kích hoạt và khởi động sudo systemctl enable --now tailscaled

# Đăng nhập sudo tailscale up

Sau khi cài đặt, các bước cấu hình SSH qua Tailscale hoàn toàn giống nhau trên mọi distro. Chỉ cần thay lệnh apt bằng dnf khi cài đặt các gói phần mềm khác.

Kết luận

SSH qua Tailscale là cách đơn giản và hiệu quả nhất để bảo vệ VPS khỏi các cuộc tấn công brute force. Bằng cách:

  • Chỉ cho phép SSH qua Tailscale IP
  • Tắt password authentication
  • Sử dụng SSH keys

Bạn đã có một lớp bảo mật vững chắc cho server mà vẫn có thể truy cập từ bất kỳ đâu.

Để tìm hiểu thêm về Tailscale, xem bài viết Hướng dẫn Tailscale trên VPS từ A-Z.

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Thạch Phạm

Thạch Phạm

Đồng sáng lập và Giám đốc điều hành của AZDIGI. Có hơn 15 năm kinh nghiệm trong phổ biến kiến thức liên quan đến WordPress tại thachpham.com, phát triển website và phát triển hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI