Тунелируем ftp с помощью openssh
08.05.2013Задача: открыть доступ по ftp на server2 через server1.
В наличии:
- server2 - в моем случае маршрутизатор, dropbear ssh сервером/клиентом, proftpd в качестве ftp сервера.
- 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 соединений.
Комментарии