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.comnếu bạn sử dụng
ssh A.com -o ProxyCommand="nc B.com 22"
Nhưng UserKnownHostsFilevẫ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 %pbằ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.