В первой части мы настроили тунель, проверили что он работает - так сказать, заложили фундамент. Но, если циска (а в нашем случаем именно она не имеет статического IP) изменит адрес, то тунель пропадёт. Надо это предусмотреть и автоматизировать.
Что же нам надо:
1) Знать новый IP адрес
2) Убрать старый тунель
3) построить тунель с новым IP адресом
Из этого вытекает схема работы:
1) Cisco рассказывает свой адрес серверу
2) Сервер переодически проверяет не сообщили ли ему новый адрес
2.1) Если новый адрес сообщён - удаляем старый и делаем новый тунель
Ну раз есть план - его надо реализовать. Начнём с Cisco. Заставим её раз в 10ь минут ломиться к нам на сервер с целью спалить её IP адрес
Код: Выделить всё
cisco#conf t
cisco(config)#ip sla monitor 1
cisco(config-sla-monitor)#type http operation get url http://YYY.YYY.YYY.YYY/myip.php?key=password
cisco(config-sla-monitor-http)#frequency 600
cisco(config)#ip sla monitor schedule 1 life forever start-time now
Для того, что бы написать строчку адреса вы должны:
1) написать часть до знака вопроса
2) нажать Ctrl+v
3) написать знак вопроса
4) написать оставшуюся часть
В противном случае знак вопроса будет показывать вам справку )
Проверить что циска вас правильно поняла можно командой
Посмотрите - верно ли она преобразовала, и преобразовала ли вообще ваше имя ресурса в IP адрес, ну если вы указывали имя в ссылке, а не IP.
Увидеть статус текущей работы можно командой
Так же не помешает посмотреть и с логи веб-сервера на другой стороне, что бы убедиться что запрос идёт туда, куда надо, особенно если у вас на этом сервер много разных имён. Так я заметил что в конфете циски я указал одно имя, но запрос пришёл на другой виртуахост, где скрипта не было, и который был совсем не связан с тем, что я прописал в конфиге. Хотя статистика показывала что циска правильно резольвит то имя, что было прописано
Ну вот с циской и всё. Пошли на сервер. Первым делом сделаем достоверную ссылку. Для этого на нашем вебсервере сделаем файлик, который указали в ссылке.
следующего содержания (ну там со своими путями и модификациями, конечно)
Код: Выделить всё
<?php
$fileIp = '/var/www/php/ip.txt';
$fileMyIp = '/tmp/ip.txt';
$myIp = $_SERVER['REMOTE_ADDR'];
if($_GET['key']=='password'){
if($myIp==file_get_contents($fileIp)) {
echo $myIp;
} else {
$fp = fopen($fileIp, 'w');
fwrite($fp, $myIp);
fclose($fp);
$fp = fopen($fileMyIp, 'w');
fwrite($fp, $myIp);
fclose($fp);
}
} else {
echo $myIp;
}
?>
Что делает файл:
1) Если новый IP совпадает со старым - ничего
2) Если новый IP и правда новый - создаст файлик в который запишет новый IP (вот с этим файликом мы и будем потом работать)
3) Для защиты используется ключ - некий аналог пароля
В качестве ещё одной ограничительной меры применяется ограничение по IP адресам. Сделано это так - на страничке
http://bgp.he.net было введено имя моего провайдера и получен список подсетей, которые ему принадлежат и которые отправились в коняги моего вебсервера, в качестве которого у меня применяется nginx - в коняги соответствующего виртауалхоста было добавлено следующее ограничение (вам необходимо подставить диапазон, выделенный вашему провайдеру)
Код: Выделить всё
location /ip/ {
allow 1.1.1.0/20;
allow 2.2.2.0/21;
allow 3.3.3.0/20;
deny all;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Хочу обратить ваше внимание, что тут я делаю права на определённую директорию - я приведу этот пример, потому что столкнулся с несколько неочевидно вещью. Так вы можете ограничить доступ к директории, но если ваш скрипт написан на, скажем, php, как в нашем случае, то доступ к нему ограничиваться не будет. что бы ограничить доступ к нему надо в описании этой же директории, где вы ставите ограничение добавить строки для php, как это показано в данном примере. Описание получилось путанное, но вы поймёте, когда столкнётесь)))
В общем размещаем, проверяем, смотрим, убеждаемся что эта часть работает и идём дальше.
Ну а дальше размещаем ещё один файлик, назовём его
gre.sh
Следующего содержания
Код: Выделить всё
#!/bin/sh
start(){
remoteip=`/bin/cat /tmp/ip.txt`
echo "remote IP:" $remoteip
echo "Starting GRE... "
ip tunnel del gre1
ip tunnel add gre1 mode gre local YYY.YYY.YYY.YYY remote $remoteip ttl 255
ip link set gre1 up
ip address add 192.168.0.1/30 dev gre1
echo "Tunnel OK"
/sbin/route add -net 192.168.10.0 netmask 255.255.255.0 gre1
rm /tmp/ip.txt
}
onestart(){
remoteip=`/bin/cat /var/www/php/ip.txt`
echo "remote IP:" $remoteip
echo "Starting GRE... "
ip tunnel del gre1
ip tunnel add gre1 mode gre local 188.226.138.187 remote $remoteip ttl 255
ip link set gre1 up
ip address add 192.168.0.1/30 dev gre1
echo "Tunnel OK"
/sbin/route add -net 192.168.10.0 netmask 255.255.255.0 gre1
}
stop(){
ip tunnel del gre1
}
check(){
if [ -f /tmp/ip.txt ]; then
start
#else
# echo 'No file, no new tunnel'
fi
}
case "$1" in
start)
start
;;
onestart)
onestart
;;
stop)
stop
;;
check)
check
;;
*)
echo "Usage: $0 start|stop|onestart|check "
;;
esac
Ну тут всё стандартно - запускаем в ключиками
stop - убрать тунель
start - поднять тунель
check - проверка не изменился ли IP, и если да, то перестроить тунель
onestart - поднятие тунель при перезагрузки сервера
Забиваем его в крон - у меня это раз в 10ь минут
Не забудьте, что вы должны поставить свои пути к файлам.
Для того, что бы тунель заработал при перезагрузки добавим в файл
/etc/rc.local следующую строку
подведём итог - к итогу первой части у нас добавилось некое управление туннелем, а так же автоматическая его перестройка при изменении IP адреса cisco