ขอบคุณสำหรับคำตอบของ @ till'sมันเป็นแรงบันดาลใจให้ฉันมาก
ผมพบว่าคุณ forcely ProxyCommand nc dst dst-port
สามารถเปลี่ยนเส้นทางการเชื่อมต่อของคุณด้วย
ตัวอย่างเช่นในความเป็นจริงคุณจะเชื่อมต่อกับB.com
ถ้าคุณใช้
ssh A.com -o ProxyCommand="nc B.com 22"
แต่UserKnownHostsFile
จะยังบันทึกเป็นA.com
ดังนั้นคุณสามารถเพิ่มโดเมน "อัตโนมัติ" ในของคุณ 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'
ฉันแทนที่nc -w 1 %h %p
ด้วย(timeout 0.1 nc -z %h %p) && nc %h %p
มันจะเร็วขึ้นถ้าคุณสามารถเข้าถึงเซิร์ฟเวอร์ภายในน้อยกว่า 100ms
หรือคุณสามารถแทนที่ด้วยping
แต่มันอาจบ่งบอกถึงข้อมูลที่ไม่ดีถ้าคุณใช้พร็อกซีที่ใช้ TCP proxychains
หรือเซิร์ฟเวอร์ไม่อนุญาตให้ใช้ ICMP echo
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'
คุณสามารถแทนที่(timeout 0.1 nc -z %h %p)
ด้วยสิ่งที่ตรวจพบว่าคุณอยู่ในเซิร์ฟเวอร์ภายใน
หากคุณมี IP หลายตัวคุณสามารถใช้สิ่งนี้:
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'
มันจะพยายามที่จะเชื่อมต่อ1.1.1.1
ถ้าล้มเหลวพยายามเชื่อมต่อแล้ว2.2.2.2
3.3.3.3