Тунелируем ftp с помощью openssh


Задача: открыть доступ по ftp на server2 через server1.

В наличии:

  1. server2 - в моем случае маршрутизатор, dropbear ssh сервером/клиентом, proftpd в качестве ftp сервера.
  2. server1 - сetos с openssh сервером.
Схема:

 Шаг 1:

Для начала нам нужны ssh ключи для PublicKey авторизации, с помощью которых мы будем подымать и поддерживать туннель (генерируем их на хосте который будет создавать и поддерживать туннель): 
root@server2# ssh-keygen -t rsa

Шаг 2:

Копируем публичный ключ в ~/.ssh/authorized_keys на сервер назначения:
root@server2# echo 'ваш публичный ключ' >> ~/.ssh/authorized_keys
  

Шаг 3:

Для поддержания ssh туннелей в активном состоянии, нужно изменить конфиг ssh сервера ( в моем случае openssh на server2 ). Иначе возникнут постоянные обрывы соединения при первой же потери пакета.
Проверяем следующие настройки:
root@server2#: vim /etc/ssh/sshd_config
## для того, чтобы порты открывались на WAN интерфейсе

GatewayPorts yes

## поддержка соединения в "живом" состоянии
TCPKeepAlive yes
ClientAliveInterval 300
ClientAliveCountMax 3

## для авторизации по ключам
PubkeyAuthentication yes

Перезапускаем openssh:
root@server2# servise sshd restart 

Шаг 4:

Проверяем настройки proftpd на server2. Необходимо указать пассивные порты и "замаскировать" его под внешний адрес.
root@server2# vim proftpd.conf
# добавляем пассивные порты
PassivePorts 60000 60010

# добавляем существующие dns имя
MasqueradeAddress ftp.server1
Перезапускаем proftpd:
root@server2# killall -HUP proftpd

 

 Шаг 5 (если у вас не dropbear ssh, нужно изменить параметры соединения):

В случае dropbear сервера нужно сконвектировать ключи (которые мы генерировали с помощью ssh-keygen) в нужный формат:
root@server1# dropbearconvert openssh dropbear ~/.ssh/id_rsa ~/.ssh/id_rsa.db 
 
Пишем скрипт поднятия тоннеля и ставим в крон(/etc/scripts/tunel-ssh.sh):
TUNCMD1="ssh -K 300 -y  -i /root/.ssh/id_rsa.db -f -N -R 88:127.0.0.1:77 root@server1"
PRES=`ps`
case "$PRES" in
  *"$TUNCMD1"*)
    echo 'conection found ';
    ;;
  *)
  # записываем последнюю дату обрыва - для отладки
  echo `date` > /var/log/connection.log
  echo 'conection lost' >> /var/log/connection.log

  # убиваем все ssh процессы! Измените если нужно прибивать только определенные.
  killall ssh

  # перезагружаем, т.к. могут остаться idle процессы
  killall -HUP proftpd

  $TUNCMD1

  # тунелируем пассивные порты
  i=60000
  while [ $i -lt 60010 ]
  do
    ssh -K 300 -y  -i /root/.ssh/id_rsa.db -f -N -R $i:127.0.0.1:$i root@server1
    i=$[$i+1]
  done
  ;;
esac
Добавляем в крон задание:
*/5 * * * *  /etc/scripts/tunel-ssh.sh 
Если у вас openssh сервер уберите опции "-K 300", "-y". Строка соединения должна выглядеть примерно:
ssh -f -N -R 88:127.0.0.1:77 root@server1

Итог

В итоге мы должны получить более/менее стабильные тоннели. Заметьте что в итоге получается 11 тоннелей ( 10-для пассивного соединения и 1-управляющий). Также скрипт tunel-ssh.sh проверяет наличие только управляющего соединения, в моем случае этого достаточно, но лучше дописать и проверять состояние 11 соединений.

Комментарии