Cơ bản yêu cầu là:
- ServerB chỉ có thể truy cập được từ ServerA. Bạn không kết nối trực tiếp với nó.
- ServerA cần kích hoạt Đường hầm TCP.
- ServerA cần có thể truy cập được từ bạn.
Bạn thiết lập kết nối đến ServerB thông qua jumphost (trong .ssh/config
):
Máy chủ lưu trữB
ProxyJump ServerA
Điều này giả định rằng nếu bạn nhập máy chủ sshA
, bạn sẽ kết thúc trên ServerA và nếu bạn đang ở ServerA, hãy nhập máy chủ sshB
, bạn sẽ kết thúc trên ServerB. Ví dụ. tên "ServerB" có thể phân giải được trên ServerA, nhưng nó sẽ không quan tâm nếu nó có thể phân giải được về phía bạn. Đó có thể là tên máy chủ hoặc "sên" (biệt danh). Trong trường hợp sau, bạn liên kết lại tên máy chủ hoặc địa chỉ IP của chúng trong .ssh/config
:
Máy chủ lưu trữA
Tên máy chủ ip.add.re.ss
Máy chủ lưu trữB
ProxyJump ServerA
Tên máy chủ host.na.me
Bạn cũng có thể chỉ định tên người dùng sẽ sử dụng cho máy chủ proxy:
Máy chủ lưu trữA
người dùng proxy
Tên máy chủ ip.add.re.ss
Máy chủ lưu trữB
ProxyJump ServerA
Tên máy chủ host.na.me
Sau đó, bạn vào máy chủ sshB
. OpenSSH kết nối với ServerA và sử dụng một số cổng ngẫu nhiên để chuyển tiếp qua kết nối này tới địa chỉ của ServerB, cổng 22. Kết nối này được chia thành nền; OpenSSH ngay lập tức kết nối với cổng được chuyển tiếp ngẫu nhiên này (tới localhost, nhưng nó thực sự kiểm tra khóa của nó trong .ssh/known_hosts
dựa trên tên "ServerB" và địa chỉ IP được chỉ định trong HostName, nếu có), vì vậy bạn sẽ kết thúc trực tiếp trên ServerB. Nếu bạn phát hành "ai", nó sẽ cho biết bạn được kết nối từ địa chỉ ServerA. Bất cứ ai ngồi giữa bạn và ServerA đều không có cách nào để biết bạn đang thực sự nói chuyện với ServerB.
Bạn có thể sử dụng bất kỳ tùy chọn dòng lệnh SSH nào, chúng sẽ được sử dụng cho Máy chủB kết nối (được thực hiện thông qua cổng chuyển tiếp). Ví dụ. nếu bạn dùng ssh -D 12345 người dùng @ ServerB
, nó sẽ kết nối với ServerA với tư cách là người dùng proxy với cổng được chuyển tiếp tới ServerB:22, sau đó kết nối với cổng đó và xác thực ServerB là người dùng, đồng thời, nó sẽ cài đặt proxy SOCKS5 trên cổng 12345.Địa chỉ thoát cho SOCKS5 đó sẽ là ServerB, ví dụ: nếu bạn sử dụng proxy đó (ví dụ: trong trình duyệt), các bên ở xa sẽ thấy bạn đang kết nối từ địa chỉ của ServerB.
Bạn có thể xếp nhiều jumphost hơn, nó cũng sẽ hoạt động:
Máy chủ lưu trữB
ProxyJump ServerA
Máy chủ lưu trữC
ProxyJump ServerC
và máy chủ sshC
trước tiên sẽ kết nối với ServerA bằng chuyển tiếp cổng tới ServerB:22, sau đó, nó sẽ kết nối thông qua chuyển tiếp đó tới ServerB bằng một cổng khác chuyển tiếp tới ServerC, sau đó kết nối với cổng khác đó và bạn sẽ kết thúc với trình bao ServerC.
Lưu ý rằng bạn sẽ được yêu cầu nhập mật khẩu cho mỗi sự liên quan. Điều này là khá cồng kềnh. Tốt hơn nên thiết lập và sử dụng xác thực dựa trên khóa đại lý ssh
.