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.comhost.mydomain.comhoặ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ặcgit.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?