Chuyển tiếp kết nối ssh đến docker container theo tên máy chủ


10

Tôi đã gặp phải một tình huống rất cụ thể và mặc dù có nhiều cách khác để làm điều này, tôi đã bị ám ảnh bởi điều này và muốn tìm ra cách để thực hiện chính xác như thế này:

Lý lịch

Giả sử tôi có một máy chủ đang chạy một số dịch vụ trong các container docker bị cô lập. Vì hầu hết các dịch vụ đó là http, tôi đang sử dụng proxy nginx để hiển thị các tên miền phụ cụ thể cho từng dịch vụ. Ví dụ, một máy chủ nút đang chạy trên một container docker với cổng của nó được 80liên kết với 127.0.0.1:8000máy chủ. Tôi sẽ tạo ra một vhost trong nginx mà proxy tất cả các yêu cầu myapp.mydomain.comđến http://127.0.0.1:8000. Bằng cách đó, container docker không thể được truy cập từ bên ngoài, ngoại trừ thông qua myapp.mydomain.com.

Bây giờ tôi muốn bắt đầu một container docker gogs theo cách mà gogs.mydomain.comtrỏ đến container gogs. Vì vậy, tôi bắt đầu container gogs này với cổng 8000bị ràng buộc 127.0.0.1:8001trên máy chủ. Và một yêu cầu ủy quyền trang web nginx gogs.mydomain.comđến http://127.0.0.1:8001và nó hoạt động tốt ...

Tuy nhiên, gogs là một thùng chứa git, tôi cũng muốn truy cập các repos như thông qua git@gogs.mydomain.com:org/reponhưng điều đó không hoạt động với thiết lập hiện tại. Một cách để thực hiện công việc đó là liên kết cổng 22của container với cổng 0.0.0.0:8022trên máy chủ, và sau đó url git ssh có thể giống như vậy git@gogs.mydomain.com:8022/repo.

(Điều đó dường như không hoạt động; khi tôi chuyển sang nguồn gốc với uri như vậy, git yêu cầu mật khẩu cho người dùng gittrên gogs.mydomain.com- thay vì gogs.mydomain.com:8022- nhưng đó có lẽ là điều tôi đang làm sai và nằm ngoài phạm vi cho câu hỏi này, tuy nhiên, Tôi sẽ đánh giá cao bất kỳ chẩn đoán cho điều đó quá)

Vấn đề

Mối quan tâm chính của tôi là, tôi muốn cổng ssh <gogs container>:22được ủy quyền giống như tôi đang ủy quyền các cổng http bằng nginx; tức là bất kỳ kết nối ssh nào gogs.mydomain.comđược chuyển đến cổng của bộ chứa 22. Bây giờ tôi không thể liên kết cổng ssh của người chứa với cổng ssh của máy chủ vì đã có một sshd đang chạy trên máy chủ. Ngoài ra, điều đó có nghĩa là bất kỳ kết nối nào *.mydomain.comđược chuyển đến sshd của bộ chứa.


Tôi muốn bất kỳ kết nối ssh để:

  • mydomain.com host.mydomain.com hoặc địa chỉ IP của mydomain được chấp nhận và chuyển tiếp đến sshd trên máy chủ
  • gogs.mydomain.comhoặc git.mydomain.comđược chấp nhận chuyển qua sshd trên thùng chứa gogs
  • *.mydomain.com(nơi *nào khác ngoài khả năng ở trên) bị từ chối

Nếu là http, tôi có thể dễ dàng thực hiện công việc đó thông qua nginx. Có cách nào để làm điều đó cho ssh?


(Cũng muốn đi ra ngoài một chi và hỏi: có cách nào để thực hiện điều đó với bất kỳ dịch vụ tcp nào nói chung không?)

Bất kỳ hiểu biết nào về cách tôi đang cố gắng thực hiện ở đây, cũng được hoan nghênh. Tôi không phiền khi được nói khi những gì tôi đang cố gắng làm là hoàn toàn ngu ngốc.


Những gì tôi đã có trong tâm trí:

Có lẽ tôi có thể chia sẻ ổ cắm sshd trên máy chủ với bộ chứa dưới dạng roâm lượng? Điều đó có nghĩa là sshd bên trong container có thể nhận tất cả các kết nối tới *.mydomain.com. Có thể có một cách để làm cho sshd bên trong container từ chối tất cả các kết nối khác hơn gogs.mydomain.comhoặc git.mydomain.comkhông? Tuy nhiên, sshd trên máy chủ sẽ nhận tất cả các kết nối để *.mydomain.combao gồm gogs.mydomain.com; do đó sẽ có một cuộc xung đột. Tôi không biết, tôi đã không thực sự thử nó. Tôi có nên thử nó không?

Câu trả lời:


2

Làm điều này "bằng tên máy chủ" đơn giản là không nằm trong phạm vi của ssh. Bản thân giao thức ssh không hỗ trợ lưu trữ ảo dựa trên tên (thực tế HTTP là ngoại lệ so với quy tắc ở đây).

SSHd ở phía bên nhận không bao giờ có thể biết tên máy chủ mà bạn đã yêu cầu khách hàng của mình kết nối vì thông tin này không được truyền vào bên trong giao thức.

Nếu bạn chỉ cần một vài máy khách để làm việc với điều này, bạn có thể định cấu hình từng máy khách để kết nối với máy chủ của mình và sau đó chuyển đến bộ chứa docker như sau:

Host yourcontainer
        Hostname internal.ip.of.your.container
        ProxyCommand ssh your.docker.host nc %h %p

Bằng cách này, ssh sẽ gọi lệnh proxy sẽ mở một phiên ssh đến máy chủ của bạn và gọi netcatđể thiết lập kết nối đến vùng chứa của bạn. Bằng cách này, bạn không thực sự cần phải đưa cổng ssh container của mình ra thế giới bên ngoài.


0

Các phiên bản OpenSSH gần đây có chỉ thị ProxyJump và cờ -J:

ssh -J proxyuser@jumphost user@target
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.