ProxyCort แบบมีเงื่อนไขใน ~ / .ssh / config?


14

ฉันมี~/.ssh/configการกำหนดค่าของฉันกับโฮสต์ต่างๆที่สามารถเข้าถึงได้ทั้งใน บริษัท VPN ของเราหรือผ่านพร็อกซีเซิร์ฟเวอร์ SSH

ตอนนี้ฉันเพิ่งมี

Host internal-server
    ProxyCommand ssh -W internal.ip:22 external-server

อย่างไรก็ตามถ้าฉันอยู่ในเครือข่ายภายในฉันสามารถเข้าถึง ip ภายในได้โดยตรงดังนั้นการพร็อกซี่ผ่านเซิร์ฟเวอร์ภายนอกเพิ่งเพิ่มความล่าช้าในการเชื่อมต่อ

มีวิธีที่ฉันสามารถพร็อกซีชั่วคราวถ้า IP ภายในไม่สามารถเข้าถึงได้และเชื่อมต่อโดยตรงเป็นอย่างอื่น?

คำตอบ:


8

ฉันมักจะติดตั้งสิ่งนี้ โดยถือว่าโฮสต์ระดับกลางจะสามารถแก้ไขชื่อได้

Host *%homeproxy
    ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22

ssh blah%homeproxyดังนั้นฉันจะเชื่อมต่อกับชอบ


google-fu ของฉันล้มเหลว คุณช่วยอธิบายเพิ่มเติมได้ไหม? ฉันไม่เคยเห็น *% ไวยากรณ์นี้มาก่อน
fukawi2

3
ไม่มีอะไรพิเศษเกี่ยวกับ%ตัวละคร คุณสามารถใช้อะไรก็ได้จริงๆ เปอร์เซ็นต์จะใช้เนื่องจากไม่ถูกต้องในชื่อโฮสต์หรือชื่อผู้ใช้ cutคำสั่งภายใน ProxyCommand ใช้%เป็นตัวคั่นที่จะดึงออกชื่อโฮสต์ที่
Zoredache

1
นี้เป็นสิ่งที่ดี แต่ก็หมายความว่าฉันต้องสะกดชื่อโฮสต์เต็มแทนนามแฝง ssh
alt

@mobiusnz จริงๆแล้วหมายถึงว่าคุณต้องการชื่อที่แตกต่างกันสำหรับการเชื่อมต่อที่แตกต่างกัน ในกรณีของฉันตัวอย่างเช่นถ้าผมที่บ้านผมใช้ssh targetHความหมายเป้าหมายจากที่บ้าน ssh targetหากในเครือข่ายท้องถิ่นในการกำหนดเป้าหมายเพียง มันคงจะดีถ้าเราได้พูดเรื่องนี้ออกมาตรงๆในคำตอบ
รูเบนส์

4

ฉันใช้วิธีอื่นโดยใช้การจับคู่ ในกรณีของฉันฉันต้องการใช้พร็อกซีในพื้นที่ถ้ามันทำงานอยู่หรือไม่ถ้าไม่ใช่ คำสั่งดังต่อไปนี้ประสบความสำเร็จอย่างนี้:

Match Exec "nc -z 127.0.0.1 1086"
    ProxyCommand nc -X 5 -x 127.0.0.1:1086 %h %p

มันตรงกับทุกความพยายามของ ssh และดำเนินการตรวจสอบอย่างรวดเร็วโดยใช้ncเพื่อดูว่าพร็อกซีของฉันเปิดใช้งานและทำงานบน 1086 (ในกรณีนี้ncออกโดยไม่มีข้อผิดพลาด) หากเป็นเช่นนั้นจะตั้งค่า ProxyCommand


2

ทศวรรษที่ผ่านมาฉันเขียนคำสั่งพร็อกซีสำหรับสถานการณ์ประเภทนี้ ในกรณีที่คุณใช้งานคำสั่ง proxy ของฉันสามารถใช้ดังนี้:

Host internal-server
    ProxyCommand ssh-multipath-proxy %h:%p -- ssh -W %h:%p external-server

ข้อควรจำสองสามข้อ: ฉันค่อนข้างอายที่จะยอมรับว่ามันไม่รองรับ IPv6 และจะลองใช้ที่อยู่ IP เพียงชื่อเดียวต่อชื่อโฮสต์ และจะไม่ถ่ายโอนแบนเนอร์ไคลเอ็นต์ไปยังเซิร์ฟเวอร์ก่อนที่จะส่งแบนเนอร์เซิร์ฟเวอร์ แต่นั่นไม่น่าจะทำให้เกิดปัญหา


2

ขอบคุณสำหรับคำตอบของ @ 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.23.3.3.3


0

วิธีนี้ใช้งานได้มากขึ้นโดยอัตโนมัติด้วยความล่าช้าเล็กน้อย 0.1 วินาทีเพิ่มเติม:

Host proxyhost.example.com
ProxyCommand none

Host *.example.com
ProxyCommand sh -c "socat 2>/dev/null - tcp4:%h:%p,connect-timeout=0.1 || exec ssh -W  %h:%p proxyhost.example.com"

0

ฉันมักจะสร้างรายการอื่น ๆ เช่นนี้ -

Host myVM
    ProxyCommand ssh -W internal.ip:22 external-server
    User ubuntu

Host myVM-np
    User ubuntu

จากนั้นเพียงแค่เรียกสิ่งที่คุณต้องการขึ้นอยู่กับสภาพแวดล้อมพร็อกซีปัจจุบันของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.