В первой части мы настроили тунель, проверили что он работает - так сказать, заложили фундамент. Но, если циска (а в нашем случаем именно она не имеет статического 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