Tại sao Stunnel vẫn cực kỳ hữu dụng dù đã có VPN hay SSH Tunnel?
Anh em làm SysAdmin chắc không lạ gì cảnh phải duy trì những ứng dụng “đồ cổ” như Redis bản cũ, Memcached, hoặc các script Python/Go chạy socket TCP thuần. Những dịch vụ này thường truyền dữ liệu ở dạng clear-text. Chỉ cần hacker nằm cùng dải mạng và thực hiện sniffing, toàn bộ thông tin nhạy cảm của bạn sẽ bị lộ sạch.
Sau 6 tháng trực tiếp vận hành Stunnel cho hệ thống phân phối dữ liệu nội bộ, mình thấy đây là giải pháp “nhẹ cân” nhất. Thay vì dựng một hệ thống VPN cồng kềnh gây tốn 20-30% tài nguyên xử lý, Stunnel hoạt động như một Proxy SSL tinh gọn. Nó bọc (wrapper) kết nối TCP vào một đường ống TLS vững chắc. Ứng dụng gốc của bạn hoàn toàn không cần thay đổi code, vì mọi việc mã hóa và giải mã đều diễn ra trong suốt ở lớp dưới.
Cài đặt Stunnel trên Linux
Việc cài đặt Stunnel cực kỳ nhanh, hầu như distro nào cũng có sẵn trong repo chính thức.
Trên Ubuntu/Debian
sudo apt update
sudo apt install stunnel4 -y
Trên CentOS/RHEL/AlmaLinux
sudo yum install stunnel -y
Một lưu ý nhỏ cho anh em dùng Debian/Ubuntu: Bạn phải sửa file /etc/default/stunnel4. Hãy chuyển ENABLED=0 thành ENABLED=1, nếu không dịch vụ sẽ không thể tự khởi động cùng hệ thống.
Tạo Certificate (Chứng chỉ) nhanh chóng
Stunnel bắt buộc phải có cặp Private Key và Certificate để hoạt động. Nếu bạn chỉ dùng trong mạng nội bộ giữa các server với nhau, chứng chỉ tự ký (Self-signed) là lựa chọn nhanh nhất.
Dưới đây là cách tạo nhanh chứng chỉ có thời hạn 365 ngày:
openssl genrsa -out key.pem 2048
openssl req -new -x509 -key key.pem -out cert.pem -days 365
cat key.pem cert.pem > /etc/stunnel/stunnel.pem
chmod 600 /etc/stunnel/stunnel.pem
Đừng quên lệnh chmod 600. File stunnel.pem chứa khóa bí mật, nên chỉ user root hoặc user chạy dịch vụ mới được phép đọc nó.
Cấu hình Stunnel cho Server và Client
Hãy tưởng tượng bạn có dịch vụ Backend chạy port 9000 (không mã hóa) và muốn client kết nối an toàn qua port 9443.
1. Thiết lập tại Server (Đầu nhận)
Mở file /etc/stunnel/stunnel.conf và dán nội dung sau:
pid = /var/run/stunnel4.pid
cert = /etc/stunnel/stunnel.pem
sslVersion = TLSv1.2
foreground = no
[my-secure-service]
accept = 9443
connect = 127.0.0.1:9000
Trong đó, accept là cổng “mặt tiền” đón kết nối đã mã hóa, còn connect là cổng nội bộ mà dịch vụ cũ đang lắng nghe.
2. Thiết lập tại Client (Đầu gửi)
Phía máy khách, Stunnel sẽ làm nhiệm vụ ngược lại: nhận dữ liệu thường từ ứng dụng local rồi bọc lại để gửi đi qua SSL. Cấu hình như sau:
client = yes
pid = /var/run/stunnel4.pid
[my-secure-service-client]
accept = 127.0.0.1:8000
connect = SERVER_IP_NGOAI:9443
Bây giờ, ứng dụng của bạn chỉ cần trỏ tới localhost:8000. Stunnel sẽ tự lo phần còn lại.
Để giới hạn IP truy cập vào Stunnel qua firewall, mình thường dùng toolcraft.app/vi/tools/developer/ip-subnet-calculator. Công cụ này giúp tính toán CIDR và dải IP cực nhanh, tránh sai sót khi bạn cần whitelist chính xác từng subnet nội bộ.
Kiểm tra và Giám sát vận hành
Kích hoạt cấu hình mới bằng lệnh:
sudo systemctl restart stunnel4
Để chắc chắn port đã mở, hãy dùng lệnh ss. Nó nhanh và cho thông tin chi tiết hơn netstat trên các server có hàng ngàn kết nối:
ss -tlnp | grep stunnel
Kinh nghiệm thực tế cho thấy, bạn nên thêm dòng debug = 7 vào file config khi mới triển khai. Log sẽ được ghi chi tiết vào /var/log/syslog, giúp bạn phát hiện ngay nếu có lỗi bắt tay (handshake) SSL xảy ra. Đặc biệt, hãy đặt cảnh báo (alert) khi chứng chỉ sắp hết hạn để tránh việc dịch vụ đột ngột bị ngắt kết nối.
Những lưu ý “xương máu” khi chạy Production
Mặc định Stunnel chỉ lo phần mã hóa chứ không xác thực người dùng. Để bảo mật tối đa, bạn nên dùng Client Certificate Authentication. Khi đó, chỉ những máy khách có chứng chỉ hợp lệ mới có thể kết nối vào hệ thống.
Về hiệu năng, Stunnel xử lý rất tốt các tác vụ mã hóa. Tuy nhiên, nếu hệ thống phải chịu tải hàng chục nghìn kết nối mỗi giây (high concurrency), CPU sẽ bị đẩy lên cao do quá trình bắt tay SSL liên tục. Trong trường hợp đó, giải pháp SSL Termination trên HAProxy sẽ chuyên nghiệp hơn.
Cuối cùng là vấn đề Firewall. Hãy chỉ mở port accept cho những IP tin cậy và tuyệt đối khóa chặt port connect (dịch vụ gốc) để tránh hacker đi vòng qua lớp bảo mật của bạn.
Stunnel là lựa chọn “nhanh-bổ-rẻ” nhất để hiện đại hóa các hệ thống cũ mà không cần can thiệp vào code. Anh em có gặp khó khăn gì khi cấu hình cứ thoải mái để lại comment nhé!

