Kết nối ssh nền vĩnh viễn để tạo đường hầm ngược: cách chính xác là gì?


41

Câu hỏi liên quan: bắt đầu kết nối ssh từ máy chủ đến máy khách

Trả lời từ đó đã giúp tôi rất nhiều, lệnh này làm những gì tôi cần:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Vì vậy, tôi đã viết kịch bản để kết nối lại mọi lúc:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

Và thêm nó vào /etc/crontab. Nhưng tôi phát hiện ra rằng nó hoạt động nếu chỉ tôi thực hiện nó "bằng tay" từ shell, nhưng nếu nó được gọi bằng cron, ssh kết nối và ngay lập tức kết thúc. (vì vậy, đoạn script trên kết nối lại mọi lúc)

Từ đó man ssh, tôi thấy rằng đối với các kết nối nền tôi nên gọi nó bằng -nkhóa, nhưng nó không giúp được gì. Sau đó, tôi chỉ tìm xung quanh các tập lệnh tương tự và tôi thấy rằng nó hoạt động nếu tôi gọi tail -f something, tức là một số lệnh "không bao giờ", vì vậy tôi chỉ tạo tập tin trống /tmp/dummy_filevà bây giờ lệnh ssh của tôi trông như thế này:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

Nó hoạt dộng bây giờ! Nhưng, giải pháp này có vẻ hơi xấu, cộng với tôi không thực sự hiểu lý do thực sự của hành vi đó. Chỉ là tình cờ, tôi đã cố gắng gọi bashthay vì tail -f( bashdường như cũng là lệnh "không bao giờ"), nhưng nó không hoạt động.

Vì vậy, bất cứ ai cũng có thể giải thích hành vi này, và cách chính xác để tạo kết nối ssh nền để giữ đường hầm ssh ngược lên là gì?


những gì về việc sử dụng &ở cuối lệnh ssh của bạn:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker

Nhưng sau đó, whilevòng lặp của tôi sẽ chạy đi chạy lại, bắt đầu sshkết nối nền mới cứ sau 5 giây, phải không? Đây không phải là thứ tôi cần.
Dmitry Frank

Câu trả lời:


37

Có vẻ như bạn muốn -Ntùy chọn để ssh.

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).

16

Tôi rất muốn đề nghị bạn xem xét autossh. Nó có một số phương pháp phỏng đoán nhất định sẽ cho phép nó xác định xem mất kết nối có phải là lý do cơ bản hay không và sẽ giảm tần suất thử kết nối lại. Ngoài ra, nó giám sát kết nối bằng cách sử dụng các đường hầm bổ sung, điều này làm cho nó rất hữu ích cho các tình huống như kịch bản bạn đang hỏi.

Ví dụ: nếu bạn đang sử dụng Ubuntu, bạn có thể thực hiện tìm kiếm trên web autossh upstartđể tìm một số ví dụ hữu ích về cách định cấu hình Ubuntu để đường hầm được duy trì một cách bền bỉ.

Tôi đang sử dụng điều này để giữ cho một kết nối có đường hầm luôn mở đến máy chủ của tôi cho một số dịch vụ nhất định.


Tôi thực sự đã thử autossh, tôi đã đọc bài viết này: goo.gl/jVuuSR , nhưng nó chỉ hoạt động với tôi nếu tôi có kết nối Internet ngay khi khởi động hệ thống; nhưng nếu kết nối được thiết lập sau đó, nó không hoạt động. Không chắc, có lẽ tôi đã làm điều gì sai, nhưng ngay cả trong tác giả bài viết này có sleep 10trong mình /etc/rc.local, để chắc chắn rằng kết nối internet là đã sẵn sàng khi autossh được gọi.
Dmitry Frank

2
@DmitryFrank: loại không công bằng khi không đề cập đến điều đó trong câu hỏi của bạn, nếu bạn đã thử. Tôi vẫn khuyên bạn nên nó. Với upstartvà các thay thế init khác, bạn có thể buộc bắt đầu đường hầm với một hoặc nhiều thiết bị mạng đang hoạt động. Giải pháp tốt nhất (IMO) trên web là giải pháp này: erik.torgesta.com/tag/ssh-upstart ... và dù sao sleep 10cũng không giúp được gì trong một số trường hợp cạnh.
0xC0000022L

Tôi xin lỗi vì đã không đề cập đến điều đó, thành thật mà nói khi nó không hiệu quả với tôi, tôi quyết định làm điều đó chỉ bằng "tay" và hoàn toàn quên mất autossh. Cảm ơn ssh-upstart, tôi sẽ xem nó!
Dmitry Frank

đến bữa tiệc muộn nhưng tôi muốn thêm tôi không thể tự động lấy autossh để duy trì đường hầm ngược. nếu đường hầm ngược không thành công vì một số lý do autossh sẽ không thông báo và sẽ không xây dựng lại kết nối. Tôi cần nhiều đường hầm từ nhiều máy chủ và điều này làm phức tạp vấn đề
DeveloperChris

@DeveloperChris: Chà, tôi đang chạy chính xác kịch bản này - và đáng tin cậy. Trừ khi máy chủ từ xa thực sự bị hỏng và bạn cần bật lại, đường hầm luôn được thiết lập lại. Có lẽ bạn nên viết câu hỏi của riêng bạn và cung cấp chi tiết. Chắc chắn điều này có thể được thực hiện. Tôi đã sử dụng điều này để giải quyết các vấn đề về VPN trong nhiều tháng.
0xC0000022L

9

Tôi sẽ đề nghị thứ hai @ 0xC0000022L và sử dụng autossh. Tôi sử dụng nó để duy trì kết nối SSH từ máy tính xách tay của mình khi tôi mang nó từ nơi này sang nơi khác và nó chỉ hoạt động. Tôi sử dụng kết nối này để quay lại cổng 25 và 2143 để truy cập vào máy chủ SMTP và IMAP cá nhân của tôi.

Đây là kịch bản mà tôi sử dụng:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

Sau đó tôi duy trì một Hostmục trong $HOME/.ssh/configtập tin của tôi cho máy chủ lưu trữ imap-o.

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

Các autossh_mail.shkịch bản được chạy như một phần của máy tính để bàn của tôi khi tôi đăng nhập vào. Bạn có thể truy cập nó qua gnome-session-properties.

       ss # 1

                                          ss # 2

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.