Cơ Chế Chuyển Tiếp Cổng (Port Forwarding)
Giao thức SSH (Secure Shell) không chỉ dừng lại ở việc cung cấp truy cập dòng lệnh từ xa an toàn. Một trong những tính năng mạnh mẽ nhất của nó là khả năng thiết lập các đường hầm mã hóa để chuyển tiếp lưu lượng mạng giữa máy client và server. Thông qua cơ chế này, dữ liệu từ các ứng dụng khác có thể được bảo vệ và định tuyến qua kênh SSH.
Có ba hình thức chuyển tiếp cổng chính: chuyển tiếp cục bộ (Local), chuyển tiếp từ xa (Remote) và chuyển tiếp động (Dynamic).
Chuyển Tiếp Cổng Cục Bộ (Local Port Forwarding)
Kỹ thuật này cho phép ánh xạ một cổng trên máy local đến một cổng trên máy chủ đích thông qua server SSH trung gian. Dữ liệu gửi đến cổng local sẽ được mã hóa và chuyển tiếp đến đích.
ssh -N -L [địa_chỉ_bind:]<cổng_local>:<máy_đích>:<cổng_đích> <tên_đăng_nhập>@<server_ssh>
Mục đích: Truy cập các dịch vụ chạy trên mạng nội bộ của server từ máy tính cá nhân.
Ví dụ thực tế: Giả sử cơ sở dữ liệu MySQL trên server chỉ lắng nghe trên localhost và không mở cổng ra ngoài. Để kết nối từ máy phát triển, ta có thể chạy lệnh:
ssh -N -L 9906:127.0.0.1:3306 dev_user@production-server
Lệnh này sẽ chuyển tiếp cổng 9906 trên máy local đến cổng 3306 trên server. Ứng dụng local chỉ cần kết nối đến localhost:9906 là có thể giao tiếp với MySQL trên server từ xa.
Chuyển Tiếp Cổng Từ Xa (Remote Port Forwarding)
Ngược lại với local forwarding, kỹ thuật này ánh xạ một cổng trên server SSH đến một dịch vụ đang chạy trên máy local của người dùng.
ssh -N -R [địa_chỉ_bind:]<cổng_server>:<máy_local>:<cổng_local> <tên_đăng_nhập>@<server_ssh>
Mục đích: Expos dịch vụ đang chạy trên máy local ra môi trường bên ngoài hoặc cho server truy cập ngược lại.
Ví dụ thực tế: Khi đang phát triển ứng dụng web trên cổng 8000 ở máy local và muốn server Nginx có thể proxy request đến ứng dụng này để kiểm tra:
ssh -N -R 9090:127.0.0.1:8000 admin@gateway-server
Sau khi kết nối, Nginx trên server có thể cấu hình proxy_pass đến localhost:9090 để truy xuất ứng dụng đang chạy trên máy của developer.
Chuyển Tiếp Cổng Động (Dynamic Port Forwarding)
Thay vì ánh xạ cố định một cổng, phương thức này tạo ra một SOCKS proxy trên máy local. Lưu lượng truy cập qua proxy này sẽ được định tuyến linh hoạt thông qua server SSH.
ssh -N -D [địa_chỉ_bind:]<cổng_local> <tên_đăng_nhập>@<server_ssh>
Mục đích: Sử dụng server SSH như một proxy trung gian để truy cập các tài nguyên mạng bị hạn chế.
Ví dụ thực tế: Tạo một SOCKS5 proxy trên cổng 7070:
ssh -N -D 7070 operator@bastion-host
Các công cụ như curl hoặc trình duyệt có thể cấu hình sử dụng proxy socks5://127.0.0.1:7070 để mọi lưu lượng đều đi qua máy chủ bastion:
curl --socks5-hostname 127.0.0.1:7070 https://example.com
Truy Cập Qua Máy Bước Nhảy (Jump Server)
Trong các hạ tầng doanh nghiệp, các server quan trọng thường được đặt trong mạng nội bộ (private network) và không thể truy cập trực tiếp từ Internet. Để quản lý các server này, người ta sử dụng một máy trung gian gọi là Jump Server hoặc Bastion Host.
Thay vì phải SSH vào máy trung gian trước rồi mới SSH tiếp vào máy đích, giao thức SSH hỗ trợ nhiều phương thức để tự động hóa quy trình này.
Sử Dụng Chuyển Tiếp Cổng Thủ Công
Cách truyền thống là dùng local forwarding để ánh xạ cổng SSH của máy đích về máy local thông qua jump server.
ssh -N -L 22222:internal-db-server:22 admin@bastion-host
Khi đường hầm này đang chạy, người dùng có thể kết nối trực tiếp đến máy đích thông qua cổng local đã映射:
ssh -p 22222 db_user@localhost
Sử Dụng Tham Số ProxyJump
Từ phiên bản OpenSSH 7.3 trở đi, tham số -J cho phép chỉ định máy trung gian ngay trong lệnh kết nối, giúp giảm thiểu thao tác thủ công.
ssh -J admin@gateway.net developer@internal-app-server
Lệnh này sẽ tự động thiết lập kết nối đến gateway.net trước, sau đó chuyển tiếp phiên làm việc đến internal-app-server.
Để tiện lợi hơn, có thể cấu hình vĩnh viễn trong file ~/.ssh/config:
Host internal-app
HostName 192.168.1.50
User developer
ProxyJump admin@gateway.net
Sau đó chỉ cần gõ ssh internal-app để kết nối.
Sử Dụng ProxyCommand Cho Phiên Bản Cũ
Đối với các client SSH đời cũ chưa hỗ trợ -J, ta có thể sử dụng tùy chọn ProxyCommand kết hợp với tham số -W để chuyển tiếp stream.
ssh -o "ProxyCommand ssh -W %h:%p admin@bastion-host" developer@internal-app-server
Tùy chọn -W %h:%p yêu cầu SSH client chuyển tiếp dữ liệu đến host và port đích thông qua kết nối tới bastion.
Cấu hình tương tự trong file ~/.ssh/config:
Host internal-app-server
User developer
ProxyCommand ssh -W %h:%p admin@bastion-host
Phương thức này đảm bảo khả năng tương thích ngược trong khi vẫn duy trì quy trình kết nối một lệnh duy nhất.