SSH không có Host header
SSH has no Host header
Việc SSH không có cơ chế tương tự "Host" header như HTTP gây khó khăn khi muốn multiplex (truy cập đồng thời nhiều máy ảo) qua một địa chỉ IPv4 công cộng duy nhất. Giải pháp ở đây là tạo một pool địa chỉ IP công cộng, mỗi máy ảo được gán một IP riêng biệt *so với chủ sở hữu của nó*. Điều này đảm bảo mỗi máy ảo có thể được định danh duy nhất bằng cặp `{user, IP}`. Các bạn developer có thể rút ra bài học là dù việc chia sẻ IP cho SSH một cách "hoàn hảo" rất phức tạp, nhưng để giữ cho hành vi DNS nhất quán giữa các protocol (như HTTP và SSH), chúng ta cần xây dựng hạ tầng tùy chỉnh (custom infrastructure) và quản lý địa chỉ IP một cách cẩn thận.
Chúng tôi có một thử thách với ssh. Mỗi VM đều có một URL tiêu chuẩn mà chúng tôi sử dụng cho cả HTTPS và SSH, ví dụ: không xác định-behavior.exe.xyz. Giống như bạn có thể nhập tên miền vào trình duyệt web (và lấy TLS và xác thực...
Chúng tôi có một thử thách với ssh. Mỗi VM đều có một URL tiêu chuẩn mà chúng tôi sử dụng cho cả HTTPS và SSH, ví dụ: không xác định-behavior.exe.xyz. Giống như bạn có thể nhập miền vào trình duyệt web (và có TLS cũng như xác thực giúp bạn), bạn có thể chạy:
ssh không xác định-behavior.exe.xyz
Để có shell trong máy ảo của bạn.
Điều này rất dễ thực hiện nếu bạn cấp cho mỗi máy một địa chỉ IP riêng, nhưng exe.dev cung cấp cho bạn nhiều máy ảo với gói đăng ký cố định.
Chúng tôi không thể cấp địa chỉ IPv4 cho mỗi máy mà không làm tăng chi phí đăng ký. Chúng tôi không thể chỉ sử dụng IPv6 vì điều đó có nghĩa là một số mạng Internet không thể truy cập VM qua web. Điều đó có nghĩa là chúng tôi phải chia sẻ địa chỉ IPv4 giữa các máy ảo.
Đối với web, đây là một vấn đề đã được giải quyết từ lâu. Nhiều trang web có thể và có cùng một địa chỉ IP. Các trình duyệt web gửi miền mà họ đã sử dụng để truy cập máy chủ trong yêu cầu HTTP dưới dạng tiêu đề Host. Proxy exe.dev bật tiêu đề này và gửi yêu cầu đến máy ảo thích hợp.
Mặt khác, SSH không có tiêu đề Máy chủ tương đương. Nếu chúng tôi sử dụng lại địa chỉ IPv4 giữa các máy ảo, chúng tôi sẽ không có cách nào gửi kết nối SSH đến đúng máy ảo.
Cách chúng tôi giải quyết vấn đề này: Chia sẻ IP SSH
Thay vì sử dụng một địa chỉ IP cho tất cả máy ảo, chúng tôi có một nhóm địa chỉ IPv4 công cộng. Mỗi VM được gán một địa chỉ duy nhất liên quan đến chủ sở hữu của nó.
Vì vậy, thay vì bản ghi A, bạn sẽ tìm thấy
$ đào không xác định-behavior.exe.xyz
; <<>> DiG 9.10.6 <<>> không xác định-behavior.exe.xyz
...
;; PHẦN TRẢ LỜI:
không xác định-behavior.exe.xyz. 230 TRONG CNAME s003.exe.xyz.
s003.exe.xyz. 230 TRONG 16.145.102.7
Liên quan đến chủ sở hữu của nó có nghĩa là mặc dù IP đại diện bởi s003 được nhiều máy ảo sử dụng nhưng nó chỉ được sử dụng bởi một máy ảo do người dùng này sở hữu.
Đây là tất cả thông tin bổ sung mà chúng tôi cần để định tuyến các kết nối SSH. Khi SSH kết nối, nó sẽ hiển thị khóa chung và truy cập thông qua một địa chỉ IP cụ thể. Khóa chung cho chúng tôi biết người dùng và bộ {user, IP xác định duy nhất máy ảo mà họ đang kết nối. Ở dạng sơ đồ:
Việc xây dựng một proxy thực hiện điều này yêu cầu một số giao tiếp giữa các hệ thống: khi tạo một VM, chúng ta phải phân bổ IP một cách cẩn thận dựa trên người dùng (hoặc trong tương lai gần: nhóm) sở hữu nó. Proxy ssh của chúng tôi phải có khả năng xác định IP cục bộ mà một yêu cầu được đưa ra, điều này dễ dàng trên kim loại trần, khó hơn trong môi trường đám mây nơi IP công cộng được NAT trên địa chỉ VPC riêng. Tất cả điều này yêu cầu phần mềm quản lý riêng, vì vậy chúng tôi không thể đề xuất phần mềm này như một giải pháp chung cho những người muốn ghép kênh truy cập VM SSH vào một IP. Tuy nhiên, hành vi thống nhất, có thể dự đoán của tên miền rất quan trọng đối với chúng tôi, vì vậy chúng tôi đã dành thời gian để xây dựng tính năng này cho exe.dev.
Tác giả: apitman