2

Я настроил обратный туннель так:

function startconn () {
    ssh -N -b ${SRCIP} -X -R ${REMOTEIP}:${REMOTEPORT}:${LOCALIP}:${LOCALPORT} root@${REMOTEIP} &
    SSHPID=$!
    echo "$SSHPID" > $PIDFILE
    echo "Forwarding port ${REMOTEPORT} at ${REMOTEIP} to ${LOCALIP}:${LOCALPORT}"
}

Это пересылает REMOTEPORT @ REMOTEIP по резервной ссылке, доступной через сеть SRCIP (у меня есть вспомогательный сетевой адаптер с SRCIP == 192.168.5.2, который подключается к шлюзу резервной линии на 192.168.5.1).

Это работает хорошо, но есть проблема: если соединение ssh разрывается, например, при перезапуске шлюза и т.д., В общем, все, что нарушает соединение TCP/IP в сеансе ssh обратного туннеля, процесс sshd в REMOTEIP зависает, предотвращая повторное установление обратного туннель к этому порту (ниже 30200 - REMOTEPORT):

netstat -anp | grep 30200
tcp        0      0 0.0.0.0:30200           0.0.0.0:*               LISTEN      8772/sshd: root

Единственное жизнеспособное решение, которое я вижу на данный момент, - это запись сценария переподключения на потерянное соединение с REMOTEIP и уничтожение процесса sshd "вручную" перед попыткой восстановить обратный туннель.

Есть ли какой-нибудь умный / менее громоздкий способ предотвратить удаленный процесс sshd, блокирующий порт REMOTEIP?

1 ответ1

2

Да, это autossh, оболочка для ssh, разработанная специально для этого. Справочная страница autossh гласит:

autossh - это программа, которая запускает копию ssh и отслеживает ее, при необходимости перезапуская, если она умирает или прекращает пропуск трафика.

Я использую его на дюжине машин или около того, и время его работы составляет 100%.

Я использую это следующим образом: я помещаю эту строку

   su my_name -c /home/my_name/bin/auto

в файле /etc/rc.local компьютера, инициирующего обратный туннель (назовите его A). Исполняемый (* chmod 755 auto) файл auto имеет вид:

  #!/bin/sh

 /usr/lib/autossh/autossh -M 6527 -f -p 5298 -2 -N -R 8400:localhost:2222 userB@remote_hostB -i /home/my_name/.ssh/crypto-keyB

Здесь 5298 - это ssh-порт удаленного хоста (я назвал его B), 2222 - ssh-порт вызывающей машины A. Порт 6527 используется для проверки состояния соединения; он должен быть открыт на брандмауэре удаленного сервера (A), чтобы это работало.

Это устанавливает обратный туннель. С терминала на удаленном сервере (B) теперь я могу подключиться к машине, инициирующей обратный туннель (A), с помощью команды

 sh -Y userA@localhost -p 8400 -i /home/userB/.ssh/crypto-keyA

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

Как только это будет сделано, вы можете идти. Это в основном огонь и забудь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .