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 80
liên kết với 127.0.0.1:8000
má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.com
trỏ đến container gogs. Vì vậy, tôi bắt đầu container gogs này với cổng 8000
bị ràng buộc 127.0.0.1:8001
trê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:8001
và 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/repo
như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 22
của container với cổng 0.0.0.0:8022
trê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 git
trê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.com
hoặ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.com
hoặc git.mydomain.com
không? Tuy nhiên, sshd trên máy chủ sẽ nhận tất cả các kết nối để *.mydomain.com
bao 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?