вторник, 25 октября 2011 г.

SSH туннель

Иногда возникают ситуации, когда между двумя *nix компьютерами/серверами нужно построить туннель чтобы получить доступ к ресурсам компьютера.

Например, ситуация, когда один компьютер находится за nat, а второй имеет белый ip.

SSH туннель можно сделать очень просто двумя командами.
Но на втором сервере нужно добавить строку PermitTunnel point-to-point в конфигурационный файл /etc/ssh/sshd_config и перезапустить ssh сервер.

ssh -f root@example.com -w 0:0 ifconfig tun0 10.0.0.1/30 pointopoint 10.0.0.2
ifconfig tun0 10.0.0.2/30 pointopoint 10.0.0.1

example.com - сервер в интернете.
При этом нам нам нужно иметь root доступы на обоих серверах, т.к. необходимы права суперпользователя для создания новых сетевых интерфейсов (tun0).

Для того чтобы ssh туннель восстанавливался  после обрыва соединения, можно создать простенький скрипт, который будет проверять доступность удаленного компьютера ping-ом . Чтобы скрипт работал в автоматическом режиме (не спрашивая пароль) нужно организовать авторизацию ssh между компьютерами по ключам.

После этого добавляем это скрипт в crontab пользователя root, того компьютера, который находится за nat.

Вот этот скрипт:

#! /bin/sh
echo "==========="`date`"================="
EXTSERVER="example.com"
EXTTUN="10.0.0.1"
LOCALTUN="10.0.0.2"

CREATETUN0="ssh -o TCPKeepAlive=yes -o ServerAliveInterval=300 -o ServerAliveCountMax=3 -f root@"$EXTSERVER" -w 0:0 ifconfig tun0 "$EXTTUN"/30 pointopoint "$LOCALTUN
CREATETUN1="/sbin/ifconfig tun0 "$LOCALTUN"/30 pointopoint "$EXTTUN

if ping -c4 $EXTTUN > /dev/null 2>&1; then
 echo "tun work"
 else
  echo "tun do not work"
   #прибьем все старые наши ssh тунели
    for PID in `pgrep -f "$CREATETUN0"`; do
     echo "kill process whith pid="$PID
     kill "$PID"    
    done;
    sleep 20
    echo "create new ssh tunnel"
    $CREATETUN0
    echo "ok"
    echo "create tun0"
    $CREATETUN1
    echo "ok"
fi
echo "===========stop cron================="

Комментариев нет:

Отправить комментарий