Hướng dẫn thực chiến về SSH tunnel: chuyển tiếp cổng cục bộ và từ xa
(labs.iximiuz.com)Tóm tắt
- SSH tunnel là kỹ thuật giúp truy cập an toàn vào các dịch vụ không thể truy cập trực tiếp từ bên ngoài, hoặc tạm thời công khai dịch vụ nội bộ ra bên ngoài.
- SSH port forwarding được chia thành 4 loại chính: chuyển tiếp cổng cục bộ, chuyển tiếp cổng từ xa, chuyển tiếp cục bộ động, chuyển tiếp từ xa động.
-Lđể SSH client cục bộ mở cổng, còn-Rđể SSH server từ xa mở cổng.- Khi dùng Bastion Host, bạn không chỉ kết nối được tới chính SSH server mà còn tới các dịch vụ mạng riêng khác mà máy chủ đó có thể truy cập.
- Chuyển tiếp động không cố định một đích cụ thể mà tạo SOCKS proxy để truy cập nhiều host và cổng khác nhau.
- Muốn công khai chuyển tiếp từ xa ra mạng bên ngoài thì cần xem xét cấu hình
GatewayPortscủa SSH server.
Giới thiệu
Mục đích của SSH tunnel
-
SSH không chỉ dùng để thực thi lệnh từ xa mà còn cung cấp tính năng tunnel để truyền lưu lượng mạng dưới dạng mã hóa.
-
Không cần VPN riêng hay chương trình proxy chuyên dụng, chỉ với lệnh SSH chuẩn là có thể truy cập mạng riêng và công khai dịch vụ.
-
Một số trường hợp sử dụng tiêu biểu như sau.
- Truy cập dịch vụ nội bộ trong VPC thông qua một máy chủ công khai
- Mở cổng cục bộ của máy chủ phát triển từ xa trên trình duyệt ở PC người dùng
- Tạm thời công khai dịch vụ trong mạng gia đình hoặc mạng riêng ra bên ngoài
- Kết nối cổng debug của trình duyệt cục bộ tới tác nhân phát triển từ xa
-
Khi tìm hiểu SSH tunnel, cần phân biệt hai điểm sau.
- Thiết bị nào sẽ mở cổng mới và chờ kết nối
- Sau khi đi qua tunnel, lưu lượng sẽ truy cập đích từ góc nhìn của thiết bị nào
Nội dung chính
Chuyển tiếp cục bộ kết nối dịch vụ từ xa vào máy cục bộ
- Chuyển tiếp cổng cục bộ là cách kết nối máy chủ từ xa hoặc dịch vụ mà máy chủ từ xa có thể truy cập tới một cổng cục bộ trên PC người dùng.
- Cấu trúc lệnh cơ bản như sau.
ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr
-
SSH client sẽ chờ kết nối tại
local_porttrên PC người dùng. -
Lưu lượng đi vào cổng này sẽ được chuyển qua SSH tunnel tới
remote_addr:remote_port. -
Đích cuối sẽ được truy cập từ góc nhìn của mạng nơi SSH server đang nằm.
-
Một số trường hợp sử dụng chính như sau.
- Kết nối tới MySQL, PostgreSQL, Redis từ xa
- Truy cập ứng dụng web chỉ mở trong mạng riêng
- Truy cập cổng container không công khai trên giao diện bên ngoài của server
Bastion Host làm trung gian truy cập mạng riêng
-
remote_addrvàsshd_addrlà đích kết nối SSH không nhất thiết phải là cùng một thiết bị. -
Nếu SSH server có thể truy cập các dịch vụ nội bộ khác thì có thể dùng máy chủ đó làm điểm trung chuyển.
-
Máy chủ trung gian như vậy được gọi là Bastion Host hoặc Jump Host.
-
Cấu trúc kết nối phổ biến như sau.
- Từ PC người dùng SSH tới Bastion Host công khai
- Bastion Host chuyển lưu lượng tới dịch vụ nội bộ trong VPC mà nó có thể truy cập
-
Nhờ đó có thể truy cập cơ sở dữ liệu, cụm tìm kiếm, API nội bộ... vốn không công khai ra bên ngoài.
Chuyển tiếp từ xa công khai dịch vụ cục bộ lên máy từ xa
- Chuyển tiếp cổng từ xa là cách kết nối dịch vụ trên PC người dùng hoặc trong mạng nội bộ tới một cổng trên SSH server bên ngoài.
- Cấu trúc lệnh cơ bản như sau.
ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr
-
SSH server từ xa sẽ mở
remote_portvà chờ kết nối. -
Lưu lượng đi vào cổng đó sẽ được chuyển qua SSH tunnel tới
local_addr:local_portphía SSH client. -
Một số trường hợp sử dụng chính như sau.
- Công khai máy chủ phát triển đang chạy trên laptop để demo ra bên ngoài
- Kết nối dịch vụ homelab để có thể truy cập từ Internet
- Cung cấp cổng debug của trình duyệt cục bộ cho môi trường phát triển từ xa
Muốn công khai ra ngoài cần cấu hình GatewayPorts
- Với cấu hình mặc định, cổng chuyển tiếp từ xa có thể chỉ được bind vào
localhostcủa SSH server. - Khi đó dịch vụ này có thể truy cập từ bên trong máy chủ từ xa nhưng không thể truy cập từ bên ngoài.
- Nếu muốn kết nối qua IP công khai của máy chủ từ xa thì cần xem xét cấu hình sau trong
sshd_config.
GatewayPorts yes
- Vì cấu hình này có thể làm lộ cổng ra giao diện mạng bên ngoài nên cần áp dụng kèm firewall và kiểm soát truy cập.
- Nếu công khai dịch vụ phát triển trực tiếp lên Internet, nguy cơ bị truy cập trái phép hoặc bị tấn công có thể tăng lên.
Thiết bị cục bộ có thể trở thành Jump Host của mạng riêng
-
Đích của chuyển tiếp từ xa không chỉ giới hạn ở chính thiết bị đang chạy SSH client.
-
Nếu PC người dùng có thể truy cập máy chủ khác trong mạng gia đình thì cũng có thể công khai cổng của máy chủ nội bộ đó thông qua SSH server từ xa.
-
Lúc này PC người dùng sẽ trở thành thiết bị trung chuyển nối hai mạng sau.
- Mạng gia đình hoặc mạng phát triển riêng
- Máy chủ SSH gateway công khai
-
Nhờ vậy, các dịch vụ trên máy chủ gia đình hoặc máy chủ phát triển nội bộ không kết nối trực tiếp Internet vẫn có thể được truy cập từ bên ngoài.
Chuyển tiếp cục bộ động tạo SOCKS proxy cục bộ
- Chuyển tiếp cục bộ thông thường sẽ cố định một cổng cục bộ vào một đích duy nhất.
- Chuyển tiếp cục bộ động sẽ tạo SOCKS proxy trên SSH client.
- Cấu trúc lệnh cơ bản như sau.
ssh -D [local_addr:]local_port [user@]sshd_addr
-
SOCKS proxy sẽ chạy trên cổng được chỉ định của PC người dùng.
-
Ứng dụng hỗ trợ SOCKS có thể chỉ định địa chỉ đích và cổng khác nhau cho từng kết nối.
-
Kết nối tới đích thực tế sẽ được thực hiện từ góc nhìn mạng của SSH server từ xa.
-
Điểm khác với chuyển tiếp cục bộ cố định là có thể dùng một kết nối SSH duy nhất để truy cập nhiều dịch vụ khác nhau trong mạng riêng từ xa.
-
Một số trường hợp sử dụng chính như sau.
- Gọi nhiều API nội bộ thông qua Bastion Host
- Duyệt các ứng dụng web trong mạng riêng
- Truy cập nhiều VPC endpoint thông qua một EC2 instance duy nhất
Chuyển tiếp từ xa động tạo SOCKS proxy từ xa
- Nếu bỏ qua đích cố định trong tùy chọn
-Rthì có thể tạo SOCKS proxy trên SSH server từ xa. - Cấu trúc lệnh cơ bản như sau.
ssh -R [bind_address:]port [user@]gateway_addr
- Máy chủ gateway từ xa sẽ chờ kết nối SOCKS tại cổng được chỉ định.
- Các yêu cầu đi vào proxy sẽ được chuyển qua SSH tunnel tới phía client.
- Đích cuối sẽ được kết nối từ góc nhìn của mạng nơi SSH client đang nằm.
- Nhờ đó, từ máy chủ từ xa có thể truy cập toàn bộ mạng gia đình hoặc mạng riêng mà PC người dùng có thể truy cập.
- Chuyển tiếp từ xa động yêu cầu OpenSSH 7.6 trở lên ở phía client.
- Nếu muốn công khai SOCKS proxy từ xa ra giao diện ngoài thì cũng cần cấu hình
GatewayPortsgiống như chuyển tiếp từ xa thông thường.
Tùy chọn chạy nền chỉ giữ lại tunnel
- Nếu muốn chỉ duy trì port forwarding mà không chạy lệnh sau khi SSH kết nối thì dùng tùy chọn
-N. - Nếu muốn chuyển tunnel xuống nền thì có thể dùng thêm tùy chọn
-f. - Ví dụ theo từng loại như sau.
ssh -f -N -L ...
ssh -f -N -R ...
ssh -f -N -D ...
- Trong môi trường tự động hóa hoặc vận hành dài hạn, cũng cần chuẩn bị riêng cơ chế dừng tunnel, tự kết nối lại và phát hiện sự cố.
Có thể phân biệt lệnh theo vị trí mở cổng
ssh -Lsẽ mở cổng mới ở SSH client cục bộ.ssh -Rsẽ mở cổng mới ở SSH server từ xa.ssh -Dsẽ tạo SOCKS proxy trên SSH client cục bộ.ssh -Rkhi bỏ qua đích sẽ tạo SOCKS proxy trên SSH server từ xa.- Quy tắc cơ bản để ghi nhớ lệnh như sau.
-L = local:remote
-R = remote:local
- Địa chỉ và cổng ở bên trái dấu hai chấm là điểm lắng nghe mới được mở ra.
localcó thể là chính SSH client hoặc một thiết bị nội bộ mà client có thể truy cập.remotecó thể là chính SSH server hoặc một thiết bị nội bộ khác mà server có thể truy cập.
Kết luận
Chọn SSH tunnel theo hướng truy cập
-
Nếu muốn dùng dịch vụ từ xa trên PC của mình thì dùng chuyển tiếp cục bộ
-L. -
Nếu muốn công khai PC của mình hoặc dịch vụ nội bộ về phía máy chủ từ xa thì dùng chuyển tiếp từ xa
-R. -
Nếu muốn truy cập linh hoạt nhiều đích trong mạng từ xa thì dùng chuyển tiếp cục bộ động
-D. -
Nếu muốn từ gateway từ xa truy cập linh hoạt toàn bộ mạng phía client thì dùng chuyển tiếp từ xa động
-Rvới đích được bỏ qua. -
Khi thiết kế SSH tunnel, trước tiên cần kiểm tra các mục sau.
- Vị trí cần mở cổng mới
- Thiết bị có thể truy cập đích cuối
- Cấu hình
GatewayPorts, firewall và quyền truy cập SSH - Các rủi ro bảo mật có thể phát sinh khi công khai ra bên ngoài
-
Tiêu chí quan trọng nhất để quyết định là muốn làm cho dịch vụ hiển thị ở phía nào và thiết bị nào thực sự có thể truy cập đích đó.
Chưa có bình luận nào.