Скрипт автоматического переключения между основным и резервным каналом

  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:4d77ffbd32c21ef6c275aaf647bea1f6' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtejustify\">Есть офисный маршрутизатор на базе <strong>FreeBSD</strong> и два приходящих канала <strong>Internet</strong>.</p>\n<p class=\"rtejustify\">Поставлена задача:&nbsp;автоматизировать переключения с основного канала на резервный в случае его падения и обратно,&nbsp;после возобновления работы основного канала.</p>\n<p class=\"rtejustify\">В&nbsp;&quot;закромах Родины&quot; завалялся <strong>perl</strong>-скрипт,&nbsp;происхождение которого установить не получилось. Скорее всего был скачан &quot;на всякий случай&quot; из инета.</p>\n<p class=\"rtejustify\">Итак,&nbsp;проанализировав содержимое скрипта,&nbsp;выполняем установку необходимого расширения <strong>Perl</strong> - <strong>Net-Ping</strong>:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>cd /usr/ports/net/p5-Net-Ping-External &amp;&amp; make install clean &amp;&amp; rehash</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Далее правим переменные в скрипте. Листинг скрипта&nbsp;следующий:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td style=\"background-color:rgb(51, 51, 51)\">\n<pre>\n<span style=\"color:#00FF00\"><strong>#!/usr/local/bin/perl -w</strong></span><span style=\"color:#00FFFF\"><strong>\nuse strict;\nuse warnings;\n\nuse Net::Ping::External (qw(ping));\n\n</strong></span><span style=\"color:#00FF00\"><strong># 1 - автоматический режим переключение канала\n# 2 - принудительное переключение на второй канал.</strong></span><span style=\"color:#00FFFF\"><strong>\nmy $action = 1;\nmy $host_gw = &quot;</strong></span><span style=\"color:#FF0000\"><strong>192.168.213.129</strong></span><span style=\"color:#00FFFF\"><strong>&quot;; </strong></span><span style=\"color:#00FF00\"><strong># default gateway</strong></span><span style=\"color:#00FFFF\"><strong>\nmy $gw = &quot;</strong></span><span style=\"color:#FF0000\"><strong>192.168.178.209</strong></span><span style=\"color:#00FFFF\"><strong>&quot;; </strong></span><span style=\"color:#00FF00\"><strong># backup gateway</strong></span><span style=\"color:#00FFFF\"><strong>\nmy $now = localtime time;\nmy $log = &quot;/var/log/route-change.log&quot;;\n\n\nif($action == 1){\n\n\nmy $command = `netstat -rn | grep default`;\nmy @b = split(&#39;\\s+&#39;,$command,3);\n\n\nif (ping(hostname=&gt;$host_gw, count=&gt;5)){\n print &quot;host $host_gw is ok\\n&quot;;\n if($b[1] ne $host_gw){\n if($b[1] eq &quot;&quot;){\n `route add default $host_gw`;\n }else{\n `route change default $host_gw`;\n open(LOG,&quot;&gt;&gt;$log&quot;);\n print LOG &quot;[!] $now Route change to $host_gw\\n&quot;;\n close(LOG);\n }\n }\n}else{\n print &quot;host $host_gw is bad.\\n&quot;;\n if($b[1] ne $gw){\n `route change default $gw`;\n open(LOG,&quot;&gt;&gt;$log&quot;);\n print LOG &quot;[!] $now Route change to $gw\\n&quot;;\n close(LOG);\n }\n}\n}\n\n\nif($action == 2){\n\n\nmy $command = `netstat -rn | grep default`;\nmy @b = split(&#39;\\s+&#39;,$command,3);\n\n\nif($b[1] ne $gw){\n if($b[1] eq &quot;&quot;){\n `route add default $gw`;\n }else{\n `route change default $gw`;\n open(LOG,&quot;&gt;&gt;/change_route.log&quot;);\n print LOG &quot;[!] $now Route change to $gw\\n&quot;;\n close(LOG);\n }\n }\n}</strong></span></pre></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Разместим данный скрипт под названием&nbsp;<strong>route-change.pl</strong>&nbsp; в каталоге <strong>/usr/local/etc</strong>. Проверим дефолт до запуска скрипта:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>netstat -rn | grep default</strong><br />\n default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color:#ff0000\">192.168.213.129</span>&nbsp;&nbsp;&nbsp;&nbsp; UGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 335 51206943 vlan32</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Запустим скрипт:</p>\n<p class=\"rtejustify\">&nbsp;</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>perl /usr/local/etc/route-change.pl</strong><br />\n host 192.168.213.129 is ok</td>\n</tr>\n</tbody>\n</table>\n<p>Проверяем значение маршрута по умолчанию:</p>\n<p>&nbsp;</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>netstat -rn | grep default</strong><br />\n default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color:#ff0000\">192.168.213.129</span>&nbsp;&nbsp;&nbsp;&nbsp; UGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 346 51212415 vlan32</td>\n</tr>\n</tbody>\n</table>\n<p>Проверим,&nbsp;выполняется ли переключение,&nbsp;выполнив имитацию падения канала.</p>\n<p>&nbsp;</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>ipfw add 1 deny icmp from any to 192.168.213.129</strong><br />\n 00001 deny icmp from any to 192.168.213.129</p>\n<p># <strong>perl /usr/local/etc/route-change.pl</strong><br />\n host 91.204.213.129 is bad.</p>\n<p># <strong>netstat -rn | grep default</strong><br />\n default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color:#ff0000\">192.168.178.209</span>&nbsp;&nbsp;&nbsp;&nbsp; UGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 521 51732384 vlan33</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p>Все работает! Осталось только проверить, происходит ли обратное переключение на основной канал:</p>\n<p>&nbsp;</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>ipfw 1 delete</strong></p>\n<p># <strong>perl /usr/local/etc/route-change.pl</strong><br />\n host 91.204.213.129 is ok</p>\n<p># <strong>netstat -rn | grep default</strong><br />\n default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color:#ff0000\">192.168.213.129</span>&nbsp;&nbsp;&nbsp;&nbsp; UGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 374 51751262 vlan32</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p>&nbsp;</p>\n<p>Проверим, ведется ли логгирование переключений:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>cat /var/log/route-change.log</strong><br />\n [!] Thu Oct 28 16:13:45 2010 Route change to 85.223.178.209<br />\n [!] Thu Oct 28 16:16:41 2010 Route change to 91.204.213.129</td>\n</tr>\n</tbody>\n</table>\n<p>Все гуд... Последний штрих - добавим запуск скрипта в cron с ежеминутным запуском:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>echo &#39;# Route check and change&#39; &gt;&gt; /etc/crontab</strong></p>\n<p># <strong>echo &#39;* * * * *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp; /usr/bin/perl /usr/local/etc/route-change.pl &gt; /dev/null 2&gt;&amp;1&#39; &gt;&gt; /etc/crontab</strong></p>\n<p># <strong>killall -HUP cron</strong></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p>&nbsp;</p>\n<p>Преимущество даного скрипта - простота и надежность.</p>\n<p class=\"rtejustify\">Недостатком можно считать то,&nbsp;что он проверяет только доступность шлюза. В случае,&nbsp;если инет &quot;упал&quot; за шлюзом,&nbsp;переключение выполняться не будет. Как вариант - можно прописать статический маршрут к какому-то надежному серверу (например,&nbsp;к одному из серверов <a href=\"http://www.google.com\">google.com</a>)&nbsp; через основной канал и выполнять проверку доступности именно этого сервера. Выполнить модификацию скрипта в таком случае не так уж и сложно...</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:4d77ffbd32c21ef6c275aaf647bea1f6' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:77f649e04f8205cd6ce1c176daaad3ad' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Добрый день низкий Вам поклон за Ваш труд.</p>\n<p>С Вашего разрешения пару вопросов ?</p>\n<p>1 - ee /etc/rc.conf</p>\n<div class=\"wp_syntax\">\n<div class=\"code\">\n<pre style=\"font-family: monospace;\" class=\"bash\"><span style=\"color: rgb(0, 120, 0);\">ifconfig_fxp0</span>=<span style=\"color: rgb(255, 0, 0);\">&quot;inet 192.168.1.1/24&quot;</span>\n<span style=\"color: rgb(0, 120, 0);\">ifconfig_fxp1</span>=<span style=\"color: rgb(255, 0, 0);\">&quot;inet 192.168.5.2/30&quot;</span>\n<span style=\"color: rgb(0, 120, 0);\">ifconfig_fxp2</span>=<span style=\"color: rgb(255, 0, 0);\">&quot;inet 192.168.6.2/30&quot;</span>\n<span style=\"color: rgb(0, 120, 0);\">defaultrouter</span>=<span style=\"color: rgb(255, 0, 0);\">&quot;</span>192.168.213.129<span style=\"color: rgb(255, 0, 0);\">&quot;</span>\n<span style=\"color: rgb(0, 120, 0);\">defaultrouter</span>=<span style=\"color: rgb(255, 0, 0);\">&quot;</span>192.168.178.209<span style=\"color: rgb(255, 0, 0);\">&quot;<br /><br /></span></pre></div>\n</div>\n<p>Какой шлюз комментить в кц конфе.Я так понимаю второй или его писать не надо и скрипт сам поменяет первый на второй ?</p>\n<p>&nbsp;</p>\n<p>2 - Как быть с натом ? Он же висит на одном интерфейсе скрипт сам переключит на другой ?</p>\n<p>&nbsp;</p>\n<p>3 - Как быть с фаерволом ?</p>\n<p>&nbsp;</p>\n<p>#!/bin/sh<br />\nFwCMD=&quot;/sbin/ipfw -q&nbsp; &quot;</p>\n<p>LanOut=&quot;fxp0&quot;<br />\nIpOut=&quot;192.168.1.1&quot;</p>\n<p>\nIpIn=&quot;192.168.5.2&quot;<br />\nLanIn=&quot;fxp1&quot;</p>\n<p>IpIn2=&quot;192.168.6.2&quot;</p>\n<p>IpIn2=&quot;fxp2&quot;</p>\n<p>Как скрипт переключит нужные сетевухи или как правильно прописать в фаерволе все сразу.</p>\n<p>&nbsp;</p>\n<p>Ещё раз прошу помощи и поподробнее если будет желание ответить.</p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; С огромным уважением.<br />\n&nbsp;</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:77f649e04f8205cd6ce1c176daaad3ad' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:e908e9c3eb31a76f1d24b6bc46a30e81' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>1. defaultrouter - оставляете только &quot;главный&quot; канал.</p>\n<p class=\"rtejustify\">Для управления маршрутами используется стандартный демон маршрутизации <strong>route</strong>. Опция defaultrouter=&quot;192.168.213.129&quot; указывает на необходимость выполнения следующей команды:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># route add default 192.168.213.129</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Скрипт же будет проверять доступность шлюза и в случае необходимости переходить на резервный канал. Тоесть,&nbsp;фактически выполнится команда:</p>\n<p class=\"rtejustify\">\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># route change default 192.168.178.209</td>\n</tr>\n</tbody>\n</table>\n</p>\n<p>&nbsp;</p>\n<p>2. Я сразу подымаю НАТ на двух интерфейсах (использую pf, либо же ipnat - без проблем НАТят на двух интерфейсах одновременно).</p>\n<p>3. Это уже зависит от конфигурации файрвола. Нужно, чтобы можно&nbsp;было &quot;ходить&quot; и в один и в другой канал без&nbsp;изменения конфигурации. Либо же &quot;пилить&quot; скрипт под свои нужды, чтобы он выполнял необходимые изменения.</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:e908e9c3eb31a76f1d24b6bc46a30e81' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:d0a3b8ef89001115d221270ebd8a80fd' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Странно, зачем писать на перле, если можно просто на баше?</p>\n<p>Ведь там никаких особо функций не нужно особенных.</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:d0a3b8ef89001115d221270ebd8a80fd' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:0b337f4aefe5102af73b7b5791ae1401' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Писать можна на чем угодно. Главное, чтобы работало правильно. :)</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:0b337f4aefe5102af73b7b5791ae1401' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:98b89f6f074378422a0b16aea70f98c8' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>а почему бы не использовать утилиту ping, вместо модуля Net::Ping?вы же используете утилиты netstat и route?&nbsp;</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:98b89f6f074378422a0b16aea70f98c8' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:10def2fbd911de303b3ba04d20e8628d' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Писал скрипт не я,&nbsp;только немножно допилил.</p>\n<p>Кстати,&nbsp;если использовать Net::Ping::External, то нету никаких проблем с ложным срабатыванием (заменил в статье).</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:10def2fbd911de303b3ba04d20e8628d' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:feb1dae9400b096cbd44fbee969391c3' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Доброго времени суток, у меня 3 интерфейса: 1 L2TP(Медовый) 2 PPPoE(Яичный) 3 (Локалка).</p>\n<p>Роняю первый, в crone скрипт отробатывает и переключает шлюз на 2.</p>\n<p>Проходит минута и Use of uninitialized value in string ne at /usr/local/etc/route-change.pl line 40. <u><em><strong>if($b[1] ne $gw){</strong></em></u></p>\n<p>После этого дефаулт шлюзом становиться шлюз локалки яичного првайдера а не шлюз PPPoE (как хотелось-бы).</p>\n<p>Куда копать? В Perle не разбираюсь.</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:feb1dae9400b096cbd44fbee969391c3' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:88002a8cc68f7e5a673e7b6be7be3af2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Топайте на <a href=\"http://forum.muff.kiev.ua/\"><font color=\"#027ac6\">форум</font></a>. Создавайте тему,&nbsp;и предоставьте листинг скрипта и вывод <strong>ifconfig</strong> с комментариями.</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:88002a8cc68f7e5a673e7b6be7be3af2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a class=\"thickbox\" href=\"/files/imagepicker/1/wake_up_ua.png\"><img alt=\"Вставай, Україно!\" class=\"imgp_img\" src=\"/files/imagepicker/1/thumbs/wake_up_ua.png\" style=\"height:200px; width:150px\" /></a></p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:cc913d232116f0426090404133377d88' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a href=\"http://muff.kiev.ua/rss.xml\"><img alt=\"RSS\" width=\"160\" height=\"60\" src=\"http://muff.kiev.ua/files/muf-rss.png\" /></a></p>\n', created = 1767333291, expire = 1767419691, headers = '', serialized = 0 WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:39649256b636e3d5ded656bc52bd8c01' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
Версия для печатиОтправить другуPDF version

Есть офисный маршрутизатор на базе FreeBSD и два приходящих канала Internet.

Поставлена задача: автоматизировать переключения с основного канала на резервный в случае его падения и обратно, после возобновления работы основного канала.

В "закромах Родины" завалялся perl-скрипт, происхождение которого установить не получилось. Скорее всего был скачан "на всякий случай" из инета.

Итак, проанализировав содержимое скрипта, выполняем установку необходимого расширения Perl - Net-Ping:

# cd /usr/ports/net/p5-Net-Ping-External && make install clean && rehash

Далее правим переменные в скрипте. Листинг скрипта следующий:

#!/usr/local/bin/perl -w
use strict;
use warnings;

use Net::Ping::External (qw(ping));

# 1 - автоматический режим переключение канала
# 2 - принудительное переключение на второй канал.
my $action = 1;
my $host_gw = "192.168.213.129"; # default gateway
my $gw = "192.168.178.209"; # backup gateway
my $now = localtime time;
my $log = "/var/log/route-change.log";


if($action == 1){


my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);


if (ping(hostname=>$host_gw, count=>5)){
   print "host $host_gw is ok\n";
       if($b[1] ne $host_gw){
           if($b[1] eq ""){
               `route add default $host_gw`;
           }else{
               `route change default $host_gw`;
               open(LOG,">>$log");
                   print LOG "[!] $now Route change to $host_gw\n";
               close(LOG);
           }
       }
}else{
   print "host $host_gw is bad.\n";
   if($b[1] ne $gw){
     `route change default $gw`;
   open(LOG,">>$log");
       print LOG "[!] $now Route change to $gw\n";
   close(LOG);
   }
}
}


if($action == 2){


my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);


if($b[1] ne $gw){
   if($b[1] eq ""){
       `route add default $gw`;
   }else{
       `route change default $gw`;
       open(LOG,">>/change_route.log");
           print LOG "[!] $now Route change to $gw\n";
       close(LOG);
   }
   }
}

Разместим данный скрипт под названием route-change.pl  в каталоге /usr/local/etc. Проверим дефолт до запуска скрипта:

# netstat -rn | grep default
default            192.168.213.129     UGS       335 51206943 vlan32

Запустим скрипт:

 

# perl /usr/local/etc/route-change.pl
host 192.168.213.129 is ok

Проверяем значение маршрута по умолчанию:

 

# netstat -rn | grep default
default            192.168.213.129     UGS       346 51212415 vlan32

Проверим, выполняется ли переключение, выполнив имитацию падения канала.

 

# ipfw add 1 deny icmp from any to 192.168.213.129
00001 deny icmp from any to 192.168.213.129

# perl /usr/local/etc/route-change.pl
host 91.204.213.129 is bad.

# netstat -rn | grep default
default            192.168.178.209     UGS       521 51732384 vlan33

Все работает! Осталось только проверить, происходит ли обратное переключение на основной канал:

 

# ipfw 1 delete

# perl /usr/local/etc/route-change.pl
host 91.204.213.129 is ok

# netstat -rn | grep default
default            192.168.213.129     UGS       374 51751262 vlan32

 

Проверим, ведется ли логгирование переключений:

# cat /var/log/route-change.log
[!] Thu Oct 28 16:13:45 2010 Route change to 85.223.178.209
[!] Thu Oct 28 16:16:41 2010 Route change to 91.204.213.129

Все гуд... Последний штрих - добавим запуск скрипта в cron с ежеминутным запуском:

# echo '# Route check and change' >> /etc/crontab

# echo '* * * * *       root    /usr/bin/perl /usr/local/etc/route-change.pl > /dev/null 2>&1' >> /etc/crontab

# killall -HUP cron

 

Преимущество даного скрипта - простота и надежность.

Недостатком можно считать то, что он проверяет только доступность шлюза. В случае, если инет "упал" за шлюзом, переключение выполняться не будет. Как вариант - можно прописать статический маршрут к какому-то надежному серверу (например, к одному из серверов google.com)  через основной канал и выполнять проверку доступности именно этого сервера. Выполнить модификацию скрипта в таком случае не так уж и сложно...

Ваша оценка: Нет Средняя: 4.8 (6 голосов)

Добрый день низкий Вам поклон

Добрый день низкий Вам поклон за Ваш труд.

С Вашего разрешения пару вопросов ?

1 - ee /etc/rc.conf

ifconfig_fxp0="inet 192.168.1.1/24"
ifconfig_fxp1="inet 192.168.5.2/30"
ifconfig_fxp2="inet 192.168.6.2/30"
defaultrouter="192.168.213.129"
defaultrouter="192.168.178.209"

Какой шлюз комментить в кц конфе.Я так понимаю второй или его писать не надо и скрипт сам поменяет первый на второй ?

 

2 - Как быть с натом ? Он же висит на одном интерфейсе скрипт сам переключит на другой ?

 

3 - Как быть с фаерволом ?

 

#!/bin/sh
FwCMD="/sbin/ipfw -q  "

LanOut="fxp0"
IpOut="192.168.1.1"

IpIn="192.168.5.2"
LanIn="fxp1"

IpIn2="192.168.6.2"

IpIn2="fxp2"

Как скрипт переключит нужные сетевухи или как правильно прописать в фаерволе все сразу.

 

Ещё раз прошу помощи и поподробнее если будет желание ответить.

                С огромным уважением.
 

1. defaultrouter - оставляете

1. defaultrouter - оставляете только "главный" канал.

Для управления маршрутами используется стандартный демон маршрутизации route. Опция defaultrouter="192.168.213.129" указывает на необходимость выполнения следующей команды:

# route add default 192.168.213.129

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

# route change default 192.168.178.209

 

2. Я сразу подымаю НАТ на двух интерфейсах (использую pf, либо же ipnat - без проблем НАТят на двух интерфейсах одновременно).

3. Это уже зависит от конфигурации файрвола. Нужно, чтобы можно было "ходить" и в один и в другой канал без изменения конфигурации. Либо же "пилить" скрипт под свои нужды, чтобы он выполнял необходимые изменения.

Re: Добрый день низкий Вам поклон

Странно, зачем писать на перле, если можно просто на баше?

Ведь там никаких особо функций не нужно особенных.

Re: Добрый день низкий Вам поклон

Писать можна на чем угодно. Главное, чтобы работало правильно. :)

а почему бы не использовать

а почему бы не использовать утилиту ping, вместо модуля Net::Ping?вы же используете утилиты netstat и route? 

Писал скрипт не я, только

Писал скрипт не я, только немножно допилил.

Кстати, если использовать Net::Ping::External, то нету никаких проблем с ложным срабатыванием (заменил в статье).

Re: Писал скрипт не я, только

Доброго времени суток, у меня 3 интерфейса: 1 L2TP(Медовый) 2 PPPoE(Яичный) 3 (Локалка).

Роняю первый, в crone скрипт отробатывает и переключает шлюз на 2.

Проходит минута и Use of uninitialized value in string ne at /usr/local/etc/route-change.pl line 40. if($b[1] ne $gw){

После этого дефаулт шлюзом становиться шлюз локалки яичного првайдера а не шлюз PPPoE (как хотелось-бы).

Куда копать? В Perle не разбираюсь.

Re: Писал скрипт не я, только

Топайте на форум. Создавайте тему, и предоставьте листинг скрипта и вывод ifconfig с комментариями.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вставай, Україно!

Литература

Вопрoс: Ктo не прoшает oшибoк? Ответ: Женщины и тетрис на девятoй скoрoсти.