Сегодня напишем простой скрипт на языке shell, который будет определять включен ли компьютер, находящийся в сети. Например, нужно, чтобы туннель на роутере поднимался только, когда клиентская машина включена и разрушался, при ее выключении.

Вот такая у нас будет схемка, в качестве VPN сервера может выступать маршрутизатор филиала фирмы. Или, может быть, вы захотите, чтобы туннель пробрасывался к вашему VPS серверу для доступа к закрытым извне инструментам администрирования, некоторым портам (PMA, MySQL)
Как пробрасывать сам туннель, посредством OpenSSH, я уже рассказывал в ранее опубликованной статье. Поэтому, остановимся на вопросе определения, включен ли компьютер.
У стандартной консольной команды ping, есть параметры количества посылаемых запросов и таймаут ответа. Создадим shell скрипт detectPC.sh, следующего содержания:
#!/bin/bash host='192.168.12.1' ping $host -c 1 -W 1 > /dev/null if [ $? -eq 0 ] then echo ‘Host is up’ else echo ‘Host is down’ fi
Как несложно догадаться, в переменной host указывается ip адрес машины, которую нужно проверить на предмет включения. Будем исходить из того, что на ней не закрыт ping (icmp 0, 8), что, кстати, в противном случае является дурным тоном. Никогда не закрывайте данные типы icmp сообщений, по крайней мере полностью.
У команды ping есть интересующие нас ключи:
-c – количество отправляемых запросов,
-W – таймаут ожидания ответа.
Устанавливаем один пакет и время ожидания одну секунду. Дальше самое интересное, после выполнения можно определить статус только что выполненной команды, через специальную переменную – “$?”. Обычно в Linux, если все прошло без ошибок, возвращается цифра 0. Иначе — ненулевое значение.
Едем дальше, теперь мы определили, включен ли PC, как пробросить туннель? Создадим другой скрипт, для обработки команд, toggleVPN.sh:
#!/bin/bash controlFile='/var/run/ssh-myvpn-tunnel-control' remoteHost='111.222.33.44' function up() { if [ ! -S $controlFile ] then /usr/bin/ssh -S $controlFile -M -f -w 0:0 $remoteHost ifconfig tun0 10.10.10.1/30 pointopoint 10.10.10.2 exit 0 else echo 'Tunnel already up!' exit 1 fi } function down() { if [ -S $controlFile ] then /usr/bin/ssh -S $controlFile -O exit $remoteHost exit 0 else echo 'Tunnel already down!' exit 1 fi } case $1 in 'up') up ;; 'down' ) down ;; *) echo 'Usage: up|down' ;; esac exit 1
Теперь наш detectPC.sh примет следующий вид:
#!/bin/bash cd /22 #папка, где лежит скрипт toggletunnel.sh host='192.168.12.1' ping $host -c 1 -W 1 > /dev/null if [ $? -eq 0 ] then ./toggletunnel.sh up else ./toggletunnel.sh down fi
Обнаруживается недостаток: хардкод абсолютного пути. Запускать через cron будет неудобно. Чтобы повысить удобство использования, можно объединить эти два скрипта в один, следующим образом:
#!/bin/bash controlFile='/var/run/ssh-myvpn-tunnel-control' remoteHost='111.222.33.44' #OpenSSH сервер checkHost='192.168.12.1' #Мониторим включена ли. function up() { if [ ! -S $controlFile ] then /usr/bin/ssh -S $controlFile -M -f -w 0:0 $remoteHost ifconfig tun0 10.10.10.1/30 pointopoint 10.10.10.2 exit 0 else echo 'Tunnel already up!' exit 1 fi } function down() { if [ -S $controlFile ] then /usr/bin/ssh -S $controlFile -O exit $remoteHost exit 0 else echo 'Tunnel already down!' exit 1 fi } function auto() { ping $checkHost -c 1 -W 1 > /dev/null if [ $? -eq 0 ] then up else down fi } case $1 in 'up') up ;; 'down' ) down ;; 'auto' ) auto ;; *) echo 'Usage: up|down|auto' ;; esac exit 1
root4root aka admin
Добавить комментарий
X