Итак, у меня имеется ADSL модем и 3G USB модем, подключенный через PPP. Задача такая: необходим постоянный доступ к сети Интернет. Когда есть на ADSL, пользуемся им. Когда ADSL отваливается – автоматически переключаемся на 3G. При появлении Интернета на ADSL, снова возвращаемся к нему.
ADLS модем имеет IP: 192.168.1.1
3G модем со статическим IP: 88.88.88.88
IP нашего хоста с FreeBSD: 192.168.1.2
Сначала пропишем статический маршрут на адрес-эталон, который у нас будет показателем того, что через ADSL модем можно лазить в интернет. У меня это 8.8.4.4
Пишем в /etc/rc.conf:
static_routes="pinghost" route_pinghost="-host 8.8.4.4 192.168.1.1"
Создадим наш скрипт, который будет делать основную работу – проверять доступность канала и переключать маршруты
# vim ./reserv_chan.sh
#!/bin/sh #Сюда будет сыпаться лог LOGFILE="/var/log/internet.log" #Наши шлюзы и другие переменные GW1='192.168.1.1' GW2='88.88.88.88' re0='192.168.1.2' dst1='8.8.4.4' inet='0' # Проверяем, пингуется ли наш 8.8.4.4 inet=$(ping -c 1 -S $re0 $dst1 | grep "64 bytes from" | awk '{print $2}' ) if [ "$inet" != "bytes" ]; then #Если нет, тогда проверим, создана ли временная директория reserve.gw if [ -d /tmp/reserve.gw ]; then #Если создана, ничего не делаем else #Если не создана, тогда меняем маршрут и создаем ее sh /root/route_3g.sh mkdir /tmp/reserve.gw echo `date +'%Y/%m/%d %H:%M:%S'` Internet connection changed to 3G >> $LOGFILE #192.168.1.10 - это наш почтовик, который будет слать уведомления о событиях на наш е-мейл sendEmail -f admin@mymail.ru -t admin@mymail.ru -u "primary failed" -m "primary failed" -s 192.168.1.10:25 fi else #Если пинг на 8.8.4.4 через 192.168.1.1 идет, тогда проверим, создана ли временная директория if [ -d /tmp/reserve.gw ]; then #Если создана (т.е. мы сейчас на резервном 3G), удаляем и меняем маршрут на ADSL rmdir /tmp/reserve.gw sh /root/route_adsl.sh echo `date +'%Y/%m/%d %H:%M:%S'` Internet connection changed to ADSL >> $LOGFILE sendEmail -f admin@mymail.ru -t admin@mymail.ru -u "primary restored" -m "primary restored" -s 192.168.1.10:25 fi fi
Создадим файл для логов
# touch /var/log/internet.log
Теперь нам необходимо создать скрипты, которые будут менять маршруты (route_adsl.sh и route_3g.sh). Можно, конечно менять маршрут прямо в этом скрипте, но мне так удобнее под рукой иметь эти отдельные, чтобы вручную можно было переключить, если что.
# vim ./route_adsl.sh /sbin/route del default /sbin/route add default 192.168.1.1
#vim ./route_3g.sh /sbin/route del default /sbin/route add default 88.88.88.88
Далее мы сделаем скрипт, который будет через заданный интервал запускать reserv_chan.sh
# vim ./inet_check.sh #!/bin/bash while (true) do sh /root/reserv_chan.sh; sleep 3; done;
Делаем все скрипты исполняемыми
# chmod +x ./*.sh
И осталось нам только добавить последний скрипт в cron, чтобы он стартовал при загрузке
# vim /etc/crontab @reboot root sh /root/inet_check.sh
Отличная статья