ฉันสามารถทำให้ SSH ล้มเหลวได้หรือไม่เมื่อการส่งต่อพอร์ตล้มเหลว


38

หากฉันทำรีโมตพอร์ตไปข้างหน้า la -R 3690:localhost:3690เมื่อมีการเชื่อมโยงที่มีอยู่แล้วบนพอร์ตบนรีโมตโฮสต์ฉันจะได้รับคำเตือนนี้:

Warning: remote port forwarding failed for listen port 3690

มีวิธีการที่จะล้มเหลว ssh (เช่นออกด้วยรหัสกลับไม่ใช่ศูนย์) แทนที่จะปล่อยเตือน?


คุณจำเป็นต้องสร้างช่องสถานีด้วยตนเองหรือเพียงแค่ส่งต่อหรือไม่
Ignacio Vazquez-Abrams

1
@ IgnacioVazquez-Abrams: แค่ส่งต่อ
Matt Joiner

คำตอบ:


62

วิ่ง

ssh -o "ExitOnForwardFailure yes" ...

หรือใส่

ExitOnForwardFailure yes

~/.ssh/configเข้าไป ดูการssh_config(1)ใช้manรายละเอียด


น่าเสียดายที่ฉันมี OpenSSH 4. คุณสามารถบอกฉันได้เมื่อเพิ่มคุณสมบัตินี้?
Matt Joiner

2
ไม่ฉันไม่รู้ มันอาจจะเป็นคุณสมบัติรุ่น 5 แต่ตอนนี้เวอร์ชัน 4 ต้องมีอายุหลายปีและมีการแก้ไขความปลอดภัยตลอดเวลา หากคุณไม่สามารถอัพเกรดเซิร์ฟเวอร์ด้วยตัวเองคุณอาจต้องถามผู้ดูแลระบบเซิร์ฟเวอร์ของคุณว่าเขา / เธอคิดว่าปลอดภัยที่จะใช้เวอร์ชันนั้นต่อไป
Andrew Schulman

โปรดระวังว่าหากคุณไม่ได้ระบุbind_addressssh ไว้อย่างชัดเจนอาจไม่ล้มเหลว ตัวอย่างเช่นหากผู้ใช้รายอื่นฟัง ipv6 localhost อยู่[::1]:3690แล้ว ssh อาจผูกเฉพาะ ipv4 127.0.0.1:3690และไม่บ่น แต่ลูกค้า svn ของคุณอาจต้องการซ็อกเก็ต ipv6 (ของผู้โจมตี) เพื่อความปลอดภัยในการใช้งานที่ดีขึ้น-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier

3
หนึ่งยังสามารถใช้ ssh -o ExitOnForwardFailure = ใช่เพื่อหลีกเลี่ยงช่องว่างและความต้องการในการอ้างอิง
FreeSpace

1

ฉันใช้ bash script บนโฮสต์เป้าหมายเพื่อให้แน่ใจว่าการส่งต่อนั้นเปิดอย่างถูกต้อง การเชื่อมต่อ SSH จะทำงานนี้และออกหากมีปัญหากับการส่งต่อพอร์ตเช่น

สคริปต์ฝั่งไคลเอ็นต์: (ใช้. ssh / config สำหรับการตั้งค่าการส่งต่อพอร์ต)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

สคริปต์ฝั่งเซิร์ฟเวอร์ (bin / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

อาจจะเรียกใช้สคริปต์ฝั่งไคลเอ็นต์ภายใต้หน้าจอด้วย -dmS


2
กรณีที่ฉันพยายามหลีกเลี่ยงคือพอร์ตไปข้างหน้ามีอยู่แล้วและได้รับคำเตือน ฉันคิดว่าสคริปต์นี้จะถือว่าการเชื่อมต่อพอร์ตที่มีอยู่เป็นความสำเร็จมากกว่าความล้มเหลว
Matt Joiner

1
นี่เป็นเรื่องจริง ปัญหาของฉันเกิดจากสคริปต์เดียวกันเปิดพอร์ตไม่กี่นาทีก่อนหมดเวลา สคริปต์ Thsi จะออกและรันใหม่สองสามครั้งหลังจากที่พอร์ตจะเปิดอีกครั้ง หากคุณจำเป็นต้องรู้ว่าใครเป็นเจ้าของพอร์ตคุณสามารถลองใช้งาน netstat -anp ด้วย sudo และ grepping
แวดวง Antti Rytsöläปรึกษา

@ AnttiRytsöläCirclesConsult: โปรดทราบว่าคุณอาจต้องตรวจสอบ ID กระบวนการเช่นการจับคู่กับ "ssh" เป็นชื่อกระบวนการยังไม่ได้บอกคุณว่าลูกค้า SSH คนใดกำลังส่งต่อพอร์ตนั้น
Piskvor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.