
OpenWRT Dropbear reverse tunnel
У меня недавно появилась задача. Мне понадобился ssh доступ на рабочий компьютер. Чтобы можно было использовать его вычислительных мощности для сборки OpenWRT. Мой домашний ноутбук делал полную сборку за 5 часов. А рабочий за 30-40 минут. Но тут была проблема, компьютер на работе был за NAT'ом. И на прямую к нему подключиться нельзя. Спасло то что дома у меня был чистый ip и технология reverse tunnel. В качестве сервера я решил использовать wi-fi точку доступа TP-Link TL-WR1043ND с OpenWRT и Dropbear.
Что у нас дано?
Упрощённая сетевая схема:
Настройка рабочего компьютера(Work)
Рабочий компьютер должен всегда держать соединение с сервером. Даже после перезагрузки сервера соединение должно переустанавливаться.
Первое что нужно сделать, это ключи авторизации. т.к. когда я буду дома вводить на работе пароль буден некому.
И так создаем пару ключей:
ssh-keygen -b 1024 -t dsa
Затем копируем его на сервер
scp .ssh/id_dsa.pub root@openwrt.router:/etc/dropbear/authorized_key -p 1022
у меня Dropbear висит на 1022 порту, поэтому я его указываю. Если у вас 22, то можно не указывать
Теперь нужно добавить установку тунеля по Cron. Я взял скрипт отсюда немного его переделав. Скрипт я положил сюда: /etc/cron.d/ssh_reverse_tunnel.sh, вот его содержимое:
#!/bin/bash LISTENING_HOST=0.0.0.0 LISTENING_PORT=12345 SSHD_HOST=openwrt.router SSHD_USER=root SSHD_PORT=1022 # $COMMAND is the command used to create the reverse ssh tunnel COMMAND="ssh -f -N -R $LISTENING_HOST:$LISTENING_PORT:localhost:22 $SSHD_USER@$SSHD_HOST -p $SSHD_PORT" # Is the tunnel up? Perform two tests: # 1. Check for relevant process ($COMMAND) pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND # 2. Test tunnel by looking at "netstat" output on $REMOTE_HOST ssh $SSHD_USER@$SSHD_HOST -p $SSHD_PORT netstat -an 2>/dev/null | egrep "tcp.*:$LISTENING_PORT.*LISTEN" \ > /dev/null 2>&1 if [ $? -ne 0 ] ; then pkill -f -x "$COMMAND" $COMMAND fi
Сам тунель устанавливается этой коммандой:
ssh -f -N -R $LISTENING_HOST:$LISTENING_PORT:localhost:22 $SSHD_USER@$SSHD_HOST -p $SSHD_PORT
где:
$LISTENING_HOSH - ip адрес на котором будут слушаться подключения, которые будут пробразываться на рабочий компьютер
$LISTENING_PORT - соответственно порт
localhost:22 - это куда пообрасывается соединение
$SSHD_USER@$SSHD_HOST -p $SSHD_PORT - login, внешний ip адрес и порт роутера
Задание для Cron я сделал выполняющиеся каждые 5 минут. Сначала вводим в консоли:
crontab -e
и вставляем:
*/5 * * * * /etc/cron.d/ssh_reverse_tunnel.sh 2>&1 1>/dev/null &
Настройка сервера(OpenWRT router)
В качестве сервера у меня, как сказано выше, будет точка доступа TL-WR1043ND. В качестве ssh сервера я решил использовать Dropbear т.к. он занимает меньше места чем OpenSSH server и имеет весь нужный мне функционал.
Вся настройка заключается в добавлении строчки:
option 'GatewayPorts' 'on'
в файл /etc/config/dropbear
и смене прав на файл с ключом:
chmod 0600 /etc/dropbear/authorized_key
Ноутбук(Home)
Ну вот и все почти все готово. Подключаемся к работе так:
ssh user@openwrt.local -p 12345
где:
user - пользователь на работе
openwrt.local - локальный адрес роутера
12345 - порт для которого открыт туннель