Как сделать тоннель ssh (проброс порта) и автоматический перезапуск тоннеля ssh (persistent ssh tunn
Делаем тоннель ssh
Необходимо организовать проброс порта с одного сервера на другой (при этом возможности использовать iptables
и dst-nat
нет). Для проброса порта будем использовать ssh-туннель. Пробрасывать будем порт 80.
Имеем серверы 10.0.1.11 и 192.168.1.86 (связаны через IPSec). Необходимо, что бы при обращении на 10.0.1.11:80 все пакеты прозрачно перенаправлялись на 92.168.1.86:80
Для этого на 10.0.1.11 будем использовать команду:
ssh -g -f -N -L 80:localhost:80 root@192.168.1.86
Где:
-g заставляет открывать порт на внешнем интерфейсе (в противном случает будет слушаться только localhost)
-f – заставляет ssh запускаться в фоновом режиме.
-N – не запускать ничего на удаленном хосте – только проброс порта (без этой опции запустится bash)
Вариант команды на 192.168.1.86:
ssh -g -f -N -R 80:10.0.1.11:80 root@10.0.1.11
Проверить открыт ли порт:
netstat -alnp | grep :80 | grep LISTEN
Автоматический перезапуск тоннеля.
К сожалению, если произошел срыв тоннеля (например из за потери пакета), то ssh просто закрывается и тоннель не восстанавливается. Для решения проблемы есть программа autossh, которая запускает ssh, и в случае его смерти, перезапускает по новой.
Выглядит это следующим образом (на стороне 10.0.1.11 эту команду стоит положить в файл /etc/rc.local
для запуска тоннеля сразу после загрузки сервера):
autossh -f -M 0 root@192.168.1.86 -L 80:localhost:80 -N
Где -M 0 говорит о том, что мы не хотим мониторить состояние соединения между хостами, а будем мониторить только тот факт, что запущен ssh.
-f – фоновый режим
Использование autossh для поддержания терминального соединения по ssh
Вообще autossh предназначен не столько для поддержания тоннеля сколько для автоматического перезапуска ssh при работе на плохом канале. Дело в том, что если произошла потеря пакета, в то время как вы были подключены удаленно к серверу по ssh, то ваш терминал ssh тупо зависает и висит пока не отработает таймаут, выставленный в настройках ssh. Autossh умеет проверять жив ли канал, и быстренько перезапускать ssh. Для этого autossh при запуске ssh создает дополнительно ssh-тоннель и передает сама себе через этот тоннель пакеты, как только пакеты перестают проходить – тут же происходит перезапуск ssh. Если добавить к этому делу еще и screen, то получится, что плохой канал будет минимально влиять на нашу работу. Как это сделать на практике – напишу позже как появится время..