Cảm ơn câu trả lời của @ Until , nó đã truyền cảm hứng cho tôi rất nhiều.
Tôi thấy rằng bạn có thể buộc chuyển hướng kết nối của bạn với ProxyCommand nc dst dst-port
.
Ví dụ, trên thực tế bạn sẽ kết nối với B.com
nếu bạn sử dụng
ssh A.com -o ProxyCommand="nc B.com 22"
Nhưng UserKnownHostsFile
vẫn sẽ ghi làA.com
Vì vậy, bạn có thể thêm một tên miền "tự động" vào ssh_config
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(timeout 0.1 nc -z %h %p) && nc %h %p || ssh -W %h:%p external-server'
Tôi đã thay thế nc -w 1 %h %p
bằng (timeout 0.1 nc -z %h %p) && nc %h %p
, nó sẽ nhanh hơn nếu bạn có thể truy cập máy chủ nội bộ ít hơn 100ms.
Hoặc bạn có thể thay thế bằng ping
, nhưng nó có thể chỉ ra thông tin xấu nếu bạn sử dụng proxy dựa trên TCP như proxychains
, hoặc máy chủ không cho phép tiếng vang ICMP.
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(ping %h &>/dev/null) && nc %h %p || ssh -W %h:%p external-server'
Bạn có thể thay thế (timeout 0.1 nc -z %h %p)
bằng bất cứ thứ gì phát hiện xem bạn có ở trong máy chủ nội bộ hay không.
Nếu bạn có nhiều IP ứng cử viên, thậm chí bạn có thể sử dụng điều này:
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c 'f(){(timeout 0.1 ping -c 1 $1 &>/dev/null) && nc $1 %p;}; f 1.1.1.1 || f 2.2.2.2 || f 3.3.3.3'
Nó sẽ cố gắng kết nối 1.1.1.1
, nếu thất bại hãy thử kết nối 2.2.2.2
, và sau đó 3.3.3.3
.