Tôi có thể làm cho SSH thất bại khi chuyển tiếp cổng không thành công không?


39

Nếu tôi thực hiện một cổng từ xa về phía trước, -R 3690:localhost:3690khi một ràng buộc đã tồn tại trên cổng trên máy chủ từ xa, tôi nhận được cảnh báo này:

Warning: remote port forwarding failed for listen port 3690

Có cách nào để ssh thất bại (tức là thoát với mã trả lại khác không), thay vì chỉ phát ra cảnh báo?


Bạn có thực sự cần phải thực hiện một kênh thiết bị đầu cuối, hoặc chỉ chuyển tiếp?
Ignacio Vazquez-Abrams

1
@ IgnacioVazquez-Abrams: Chỉ cần chuyển tiếp.
Matt Joiner

Câu trả lời:


63

Chạy

ssh -o "ExitOnForwardFailure yes" ...

hoặc đặt

ExitOnForwardFailure yes

vào ~/.ssh/config. Xem man ssh_configđể biết chi tiết.


Thật không may, tôi có OpenSSH 4. Bạn có thể cho tôi biết khi tính năng này được thêm vào không?
Matt Joiner

2
Không, tôi không biết điều đó. Nó có thể là một tính năng phiên bản 5. Nhưng phiên bản 4 phải có nhiều năm tuổi và luôn có các bản sửa lỗi bảo mật . Nếu bạn không thể tự nâng cấp máy chủ, bạn có thể muốn hỏi quản trị viên máy chủ của mình xem họ có an toàn không khi tiếp tục sử dụng phiên bản đó.
Andrew Schulman

Xin lưu ý rằng nếu bạn không chỉ định rõ ràng bind_addressthì ssh vẫn có thể không bị lỗi. Ví dụ: nếu người dùng khác đã nghe trên ipv6 localhost [::1]:3690thì ssh có thể chỉ liên kết ipv4 127.0.0.1:3690và không khiếu nại. Nhưng máy khách svn của bạn có thể thích ổ cắm ipv6 (của kẻ tấn công). Để được an toàn sử dụng tốt hơn-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier

3
Người ta cũng có thể sử dụng ssh -o ExitOnForwardFailure = yes để tránh khoảng trắng và nhu cầu trích dẫn.
freespace

1

Tôi sử dụng tập lệnh bash trên máy chủ đích để đảm bảo chuyển tiếp được mở chính xác. Kết nối SSH sẽ chạy cái này và thoát nếu có vấn đề với việc chuyển tiếp cổng, vd

tập lệnh phía máy khách: (phần này sử dụng .ssh / config cho cài đặt chuyển tiếp cổng)

#!/bin/bash    

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

tập lệnh phía máy chủ (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

Thậm chí có thể chạy tập lệnh phía máy khách dưới màn hình với -dmS


2
Trường hợp tôi đang cố tránh là một cổng chuyển tiếp đã tồn tại và cảnh báo được đưa ra. Tôi nghĩ kịch bản này sẽ coi một ràng buộc hiện có với cổng là thành công, thay vì thất bại.
Matt Joiner

1
Đây là sự thật. Vấn đề của tôi là với cùng một kịch bản giữ cổng mở trong vài phút trước khi hết thời gian. Kịch bản Thsi sẽ thoát và chạy lại một vài lần sau đó cổng sẽ được mở lại. Nếu bạn cần biết chắc chắn ai là người sở hữu cổng, bạn có thể thử chạy netstat -anp với sudo và grepping đó.
Antti Rytsölä Circles Tham khảo

@ AnttiRytsöläCirclesConsult: Lưu ý rằng bạn có thể cần kiểm tra ID tiến trình, ví dụ như khớp với "ssh" vì tên tiến trình vẫn không cho bạn biết máy khách SSH nào hiện đang chuyển tiếp cổng đó.
Piskvor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.