Есть у меня два интернета, каждый со своими плюшками, использовать которые хочется одновременно. А для этого необходима волшебная маршрутизация…
Стала передо мной такая задача. На одном внешнем интерфейсе (назовём его rl1) статический IP (192.168.10.2), вбиваемый вручную, на другом (xl0) — вроде тоже IP статический (10.0.0.2), но получаемый посредством DHCP. Этот самый DHCP на втором интерфейсе иногда тупит, поэтому интерфейс не получает никаких параметров в течении длительного времени. Кроме того, оба интерфейса являются выходами в соответствующие локальные сети со своими выходами в интернет. rl1 смотрит в локалку (скажем, 192.168.10.0/24), которая не имеет ничего, кроме выхода в интернет с другого конца с персональным, хоть и динамическим IP. xl0 смотрит в локалку (10.0.0.0/8), которая имеет внутренние ресурсы и также выход в интернет, но уже с общим динамическим IP на туеву хучу пользователей локалки. Но так–как по xl0 интернет куда более быстрый, поэтому в основном должен использоваться он, а rl1 для отдельно взятых сервисов и для сайтов, которые не любят многократных заходов с одного IP.
Первое, что пришло в голову, это поместить такой скрипт в crontab через каждые 10 минут:
- #!/bin/sh
- gate=`netstat -rn | awk '/default/{print $2}'`
- ifconfig xl0 | grep inet > /dev/null 2>&1
- if [ $? -eq 0 ] ; then
- if [ $gate != 10.0.0.254 ] ; then
- route delete default
- route add default 10.0.0.254
- fi
- else
- if [ $gate != 192.168.10.1 ] ; then
- route delete default
- route add default 192.168.10.1
- fi
- fi
В третьей строке переменной gate присваивается адрес текущего шлюза по–умолчанию. Вначале команда netstat –rn выдаёт адреса маршрутов в цифровом виде, затем из строки с нужным маршрутом (default) берётся значение второго «столбца», где и находится нужный адрес. Со стартом системы устанавливается шлюз по–умолчанию 192.168.10.1, на тот случай, если DHCP на xl0 ещё не расчехлится.
В четвёртой строке проверяется интерфейс xl0 на предмет получения им параметров по DHCP. Команда ifconfig xl0 считывает параметры интерфейса xl0, затем grep ищет в них строку «inet», наличие которой свидетельствует о том, что настройки получены, и весь вывод отправляем в /dev/null, чтоб он нам глаза не мозолил, а сообщение об ошибках запоминаем.
В пятой строке проверяем результат последней выполненной операции — это как раз сообщение об ошибке. Если оно равно 0 (что указывает на отсутствие ошибок и, как следствие, наличие настроек у интерфейса xl0), то проверяем IP текущего шлюза по–умолчанию, который мы выяснили в третьей строке.
Шестая строка. Если текущий шлюз по–умолчанию не равен 10.0.0.254, то удаляем текущий шлюз по–умолчанию в седьмой строке и устанавливаем его в это значение в восьмой строке. Мы можем это сделать, так как в пятой строке выяснили, что интерфейс xl0 получил настройки. А если текущий шлюз по–умолчанию равен 10.0.0.254, то ничего не меняется.
Но, если вдруг, интерфейс xl0 не получил настроек, то в четвёртой строке мы получим результат отличный от нуля и по правилу из пятой строки попадаем на выполнение условия из одиннадцатой строки. Если шлюз по–умолчанию не равен 192.168.10.1, то в строке двенадцать удаляем его и устанавливаем новый шлюз по–умолчанию равным 192.168.10.1 в строке тринадцать. А если шлюз по–умолчанию уже установлен в 192.168.10.1, то ничего не делаем.
Скрипт выполняется каждые 10 минут через cron. Проверяет активность одной из внешних сетей и устанавливает шлюз по–умолчанию в этой сети. А если эта сеть не доступна, то в другой сети, которая доступна в любом случае.
Сервисы и сайты, для работы которых необходим персональный IP, прописаны соответствующими маршрутами с жёсткой привязкой к шлюзу 192.168.10.1.