Обратная проблема с SSH-туннелем

Я работаю над настройкой автоматического компьютера Ubuntu с Ubuntu Server 12.04 Minimal, и, поскольку этот компьютер будет размещен в удаленном месте без клавиатуры или экрана (без присмотра), мне необходимо иметь постоянное соединение SSH из этого машина на промежуточный сервер (между собой и мной) - причина в том, что этот ПК будет находиться за межсетевым экраном NAT.

Я следовал инструкциям точка-точка в http://wiki.fabelier.org/index.php?title=Permanent_Reverse_SSH_Tunneling , но когда я подключаюсь, я просто получаю сообщение об ошибке Цитата: ssh: connect на хост 5.175.145.251 порт 19999: соединение отказано, поэтому я вернулся к поиску решения для поиска и нашел http://www.alexonlinux.com/reverse-ssh-tunnel-or-connecting-to-computer-behind-nat -рутер

Удивительно, но решение Alexonlinux работало "из коробки".

Видя это, я попробовал предыдущий метод, на этот раз с использованием порта 6333, но не повезло. Затем я попробовал метод Alexonlinux, используя порт 19999, и снова он отлично работает.

Причина, по которой я не могу придерживаться решения Alexonlinux, заключается в том, что для этого требуется ввод команд на ПК за NAT, а в моем случае это невозможно.

Мне действительно интересно, что могло бы прервать соединение при использовании метода Фабелье. Может скрипт не загружается? Я попробовал запустить скрипт вручную, но все равно не повезло.

Я также установил

GatewayPorts yes

на ПК за NAT.

Для справки, вот сценарий, который я использовал из метода Фабальера:

a=`ps -ef | grep 19999 | grep -v grep`
if [ ! "$a" ]; then
    ssh -fN -R 19999:localhost:22 <middle-usename>@<middle-hostname>
fi

(очевидно, я изменил @ на необходимое) Мне пришлось изменить первую строку, так как скобки не были приемлемым.

Буду очень признателен за помощь, пожалуйста.

1
задан 11 January 2013 в 18:41

1 ответ

Я нашел, что это ожидает сценарий, который кто-то еще записал. Это работает на меня - у меня есть удаленные/необслуживаемые устройства позади брандмауэра и маршрутизации, находящейся в собственности других компаний. Вместо того, чтобы иметь необходимость работать с ними для представления моего ssh порта миру через перенаправление портов, таким образом, я могу получить доступ к устройствам я хотел смочь использовать Обратный SSH. Так создал мою собственную небольшую систему для обхождения этого.

Сторона сервера выполняет основанный на PHP & MySQL веб-сайт. Я могу нажать на устройство и перейти к, ему - страница. Я нажимаю кнопку "Reverse SSH", которая помещает команду "Reverse SSH" в базу данных с идентификатором устройства.

На стороне клиента у меня есть сценарий Python, который работает каждую минуту через crontab. Каждый раз это работает, это сообщает о системной информации о здоровье, загрузке ЦП, памяти, дисковом пространстве, и т.д. через HTTP к серверу. Во время что транзакция HTTP, если команда ожидает устройства, которое зарегистрировалось, я передаю команду обратно. Сторона клиента затем соответствует той команде и выполняется, вызов для избиения "ожидают/path/to/client/reversessh.expect".

Ожидать сценарий предварительно заполняется моим сервером ssh информация (да, я знаю, что это "небезопасно", но это работает на данный момент.), и устанавливает Обратное соединение SSH в течение максимум 1 часа (можно установить его на дольше, если Вам нужно). Я могу затем войти в удаленное устройство от своей местности.

Сервером, который я выполняю, является Сервер Ubuntu 14.04, и диапазон удаленных устройств с beaglebone черных и виртуальных серверов на настольный компьютер, RPi и RPi2.

В базирующихся системах debian я устанавливаю, ожидают через Кв. - доберитесь:

склонный - добираются, установка ожидают

Вот ожидать сценарий, измените его по мере необходимости. Это могло бы занять некоторое время для получения его работа, но это действительно работает. Я надеюсь, что форматирование не становится испорченным, трудно скопировать и вставить большой блок кода как это и заставить это оказываться правильным:

Пример reversssh.expect

#!/usr/bin/expect -f
#Author: g0 2010 , kod.ipduh.com 
#License:Same as Expect - Public Domain
#revtun sets up a reverse ssh tunnel  
#ssh example: ssh -R 1025:localhost:22 -p 443 user@192.0.2.123 -fN
#Hardcode the arguments or pass them at this order on the command line
#eg:$revtun 1025 22 443 user 192.0.2.123 password http://kod.ipduh.com

set remoteport "1234" # this is the port on your server that will serve the tunnel
set localport "22" # ssh port of remote/target device
set port "2222" # This is the port in which the remote device will ssh into your server. If you use standard port for ssh on server then it is, it's 22.
set user "" #ssh user on your server 
set host "" # server host ie blah.com or 123.123.123.123
set password "" # user password for servers ssh user
set report_to "" # I never used this...see below line that starts with curl. In your web server php script do <?php print_r($_GET); ?>

if {$argc > 0} { set remoteport [lindex $argv 0] } 
if {$argc > 1} { set localport [lindex $argv 1] } 
if {$argc > 2} { set port [lindex $argv 2] } 
if {$argc > 3} { set user [lindex $argv 3] } 
if {$argc > 4} { set host [lindex $argv 4] } 
if {$argc > 5} { set password [lindex $argv 5] } 
if {$argc > 6} { set report_to [lindex $argv 6] } 

set message "m"

set timeout 3600 # number of seconds to keep the tunnel open, this is set to 1 hour.

set pid [spawn ssh -N -R $remoteport:localhost:$localport $user@$host -p $port]
while {1} {

        expect -nocase -re ".*yes/no?.*" {
                send "yes\r"
        } -nocase -re "password*" {
                send -- "$password\r\n"
                #send -- "\n"
        } -re "(%|\\\$|#) " {
                set message "$message-prompt"
                break
        } eof {
                set message "$message-eof"
                break
        } -re "incorrect|invalid" {
                set message "$message-incorrect"
                break
        } -nocase -re ".*Warning.*" {
                set message "$message-warning"
                break
        } timeout {
                set message "$message-timeout"
                break
        }

}


set user "$env(USER)"
exec curl $report_to?$user-$message --silent >/dev/null

#1 hour max connection time used to keep the script running

И если Вы хотите поддерживать его в рабочем состоянии, если/когда бы это понижается, я использовал бы крон для запущения скрипта удара, чтобы проверить, работает ли sshd программа, если не рабочий запуск это, иначе ничего не сделайте. Если у Вас есть другое продолжение соединений SSH, проверение sshd не может работать на Вас. Так как этот Обратный сценарий SSH является единственным действием SSH по удаленным устройствам, это работает на меня. В моей системе я могу уничтожить Обратное соединение SSH на устройстве путем стрельбы от другой команды к удаленному устройству, когда это регистрируется, "Реверс Разъединения SSH", и это заставляет сторону клиента выполнять эту команду с ударом:

kill `pidof sshd`

Отредактируйте свой crontab с: crontab-e

Первые 6 строк crontab файла ниже хороши указать, можно хотеть отредактировать их к симпатии.

Пример crontab

MAILTO="" # local mail address to get cron messages, leave blank to disable
SHELL=/bin/bash 
USER=root # run these cron jobs as root user
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/root # root users home dir
LOGNAME=root

# Example check reverse SSH connection - runs every minute
* * * * * bash /path/to/check_reverse_ssh.bash

Пример check_reverse_ssh.bash

#!/bin/bash
process_id=`ps aux | grep "sshd" | grep -v "grep"`
if [ -z "$process_id" ]; then
    echo "process not running for certain."
    expect /path/to/reversessh.expect &
else 
    echo "sshd is running, If so, your tunnel should be good to go";
fi

Удачи!

0
ответ дан 11 January 2013 в 18:41

Другие вопросы по тегам:

Похожие вопросы: