Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Домашний роутер, несколько подключений и выбор рабочего  (Прочитано 1481 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн StealthX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Есть старенький системник. На нём 2 сетевые карты. Есть три подключения к интернету: 1) eth0 - локальная сеть с доступом к интренету 2) дорогое подключение по adsl 3) анлим но не мой, поэтому включается по возможности. Всё это доступно из домашней сети на eth1.
 
На данный момент настроены iptables и автоматическое переподключение к первому adsl (ppp0). Хочу что бы при обрыве одного из двух провайдеров, а так же ночью когда свободен анлим использовался рабочий канал. Т.е. приоритет такой: анлим если есть (ppp1), если нету то eth0, и если уже совсем всё плохо то ppp0.

Пробовал делать скрипт по примеру http://xgu.ru/wiki/Маршрут_по_умолчанию, работает только частично :( меняет только на ppp1 и на ppp0. а вот на eth0 нет.

скрипт iptables
#!/bin/sh
echo "Start iptables rules"

#Разрешаем форвардинг в ядре
echo "...stage 1"
echo 1 > /proc/sys/net/ipv4/ip_forward

#Чистим все таблицы
echo "...stage 2"
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -X
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -X

echo "...stage 3"
# Указываем интерфейс смотрящий в первый канал
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Указываем интерфейс смотрящий во второй канал
/sbin/iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE

# Указываем интерфейс смотрящий в третий канал
/sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

echo "...stage 4"
# Указываем интерфейс смотрящий в LAN
/sbin/iptables -A FORWARD -o eth1 -j ACCEPT

echo "...DONE"

скрипт для проверки доступа

#!/bin/sh
ETH1=ppp1
IPtest1=1.1.1.2
ETH2=eth0
IPtest2=2.2.2.3
ETH3=ppp0
IPtest3=3.3.3.4
GW1=1.1.1.1
GW2=2.2.2.2
GW3=3.3.3.3

while true
do

if
ping -I $ETH1 -c 1 $IPtest1 >& /dev/null #если есть анлим
then
ip route change default via $GW1 dev $ETH1 #выставляем на него gw
elif
ping -I $ETH2 -c 1 $IPtest2 >& /dev/null #иначе если есть сеть
then
ip route change default via $GW2 dev $ETH2 #ставим gw на неё
elif
ping -I $ETH3 -c 1 $IPtest3 >& /dev/null
then
ip route change default via $GW3 dev $ETH3 #иначе выставляем gw на дорогой нет
fi

sleep 30 #спим и повторяем опять
done

Если меняется скриптом то переход не работает как надо.

Есть второй вариант скрипта (пробный):

#!/bin/sh
echo "starting"
while true
do
echo "1 ping"
ping -I ppp1 -c 1 1.1.2 >& /dev/null
if [ $? -ne 0 ] # если не пингуется через первый канал то пингуем через второй
then
echo "2 ping"
ping -I eth0 -c 1 2.2.2.3 >& /dev/null
if [ $? -ne 0 ] # если не пингуется через второй канал то выставляем маршрут через третий, так как он отдельно проверяется и должен быть доступен. в любом другом случае при следующей проверке найдётся рабочий канал.
then
ip route change default via 3.3.3.3 dev ppp0
echo "3 default"
else
ip route change default via 2.2.2.2 dev eth0 # иначе если второй был доступен выставляем gw на него
echo "2 default"
fi
else
ip route change default via 1.1.1.1 dev ppp1 # иначе если первый был доступен выставляем gw на него
echo "1 default"
fi
echo "i want sleep"
sleep 30 #спим и повторяем опять
echo "i wake up"
done

иногда высыпает ошибки что не может сменить маршрут (счас нету под руками выхлопа, при возможности допишу). но руками он выставляется всегда.

Скорее всего я что-то упускаю. но не могу понять что именно.

Гарри Кашпировский

  • Гость
Приведённые скрипты, подразумевают, что  уже должен существовать маршрут по умолчанию. А если его нет?

Пользователь решил продолжить мысль 16 Июля 2011, 22:19:33:
Цитировать
Т.е. приоритет такой: анлим если есть (ppp1), если нету то eth0, и если уже совсем всё плохо то ppp0.
Странно, что мне раньше в голову это не пришло. Реально все очень просто:
Три маршрута по умолчанию с разными метриками, которые и помогают нам выставить приоритет, наименьшая метрика - наивысший приоритет.
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U     30     0        0 ppp0
0.0.0.0         2.2.2.3         0.0.0.0         U     20     0        0 eth0
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp1
Если недоступен ppp1 гуляем через eth0, в свою очередь если недоступен eth0, гуляем через ppp0.
Метрику маршрутов ppp0 и ppp1 можно выставить написав простейший скрипт в /etc/ppp/ip-up.d/, например
Код: (/etc/ppp/ip-up.d/route) [Выделить]
#!/bin/sh
# См /etc/ppp/ip-up для переменных
if [ $6 = "peer_name1" ]; then
   ip r a default dev $1 metric one_metric
elif [ $6 = "peer_name2" ]; then
   ip r a default dev $1 metric another_metric
fi

exit 0
И убрав в /etc/ppp/peers/<conn_name> упоминания о маршрутах по умолчанию.
А метрику для eth0 можно выставить в /etc/network/interfaces опция metric.
В принципе использование скриптов, выполняемых при поднятии и опускании интерфейсов, позволяет избегать пингования шлюзов, иногда  бесполезных, бывает, там просто запрещены эхо-ответы.
« Последнее редактирование: 16 Июля 2011, 22:27:36 от KT315 »

Оффлайн StealthX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
К стати на счет использовании метрики я тоже начинал подумывать. Но менять ее на лету вместо изменения маршрута в целом. Дело в том что у прова на eth0 не будет обрыва связи как ppp0 и  ppp1. Там будет доступен и gw, а интернета не будет. Поэтому для проверки живучести канала нужно проверять доступность хостов за сетью. Поэтому скрипты при поднятии я сразу отбросил и начал копать в другую сторону. К стати там в скриптах проверка идет только внешних ip. Я несколько ненаглядно их обозначил. Сейчас доеду домой, попробую покапаться с метрикой   ;)

Пользователь решил продолжить мысль 17 Июля 2011, 13:52:02:
Попробовал

#!/bin/sh
if [ $1 = "ppp1" ]; then
   route add -net 0.0.0.0 netmask 0.0.0.0 gw $5 dev ppp1 metric 300 #  ip r a default dev $1 metric one_metric ставит gw 0.0.0.0 на интерфейсе
elif [ $1 = "ppp0" ]; then
   route add -net 0.0.0.0 netmask 0.0.0.0 gw $5 dev ppp0 metric 100 # а в этом случае чётко прописывается gw
fi
exit 0
Теперь выставляется 3 маршрута с метриками 300 (ppp1), 200 (для eth0 в interfaces), 100 (ppp0).
Метрика не совсем подошла. Т.к. оно не разрывает сессию и трафик как ходил например через eth0 так и ходит. А анлим то доступен =( но не работает.

Цитировать
Приведённые скрипты, подразумевают, что  уже должен существовать маршрут по умолчанию. А если его нет?
Он будет. Т.к:
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address 192.168.1.33
  netmask 255.255.128.0
  gateway 192.168.0.250 #он будет назначаться при старте системы на eth0
  metric 200

auto eth1
iface eth1 inet static
  address 10.0.0.2
  netmask 255.255.255.0
Надо было мне сразу выложить листинг :)

В общем продолжаю копаться дальше.
« Последнее редактирование: 17 Июля 2011, 15:53:28 от StealthX »

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Метрика не совсем подошла. Т.к. оно не разрывает сессию и трафик как ходил например через eth0 так и ходит. А анлим то доступен =( но не работает.
Так метрика и не должна влиять на сессии. Она влияет только на то куда пойдёт траффик.
Но соглашусь с тем, что входящий траффик (а именно он обычно считается провайдером на помегабайтных тарифах) может продолжать идти для некоторых типов соединений.

Оффлайн StealthX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Цитировать
Она влияет только на то куда пойдёт траффик.
Есть такое дело. Но у меня на практике получается что зайдя на тот же speetest.net виден ip провайдера на eth0 (метрика 200), значит даже с поднятым ppp1 и метрикой 300 трафик идёт через eth0. А это не есть гуд.

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Ну и правильно. Потому как траффик идёт через интерфейс с минимальной метрикой для данного IP-адреса.
А у Вас получается что для eth0 - метрика 200, а для ppp1 - метрика 300. Естественно, через eth0 пойдёт.

Пользователь решил продолжить мысль 17 Июля 2011, 22:43:10:
Вы видимо не разобрались с самой метрикой.
« Последнее редактирование: 17 Июля 2011, 22:43:10 от fisher74 »

Оффлайн StealthX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Цитировать
Вы видимо не разобрались с самой метрикой.
Видимо мне вредно работать после 3 часов ночи ;D... Сейчас  поправлю всё.

Пользователь решил продолжить мысль 18 Июля 2011, 01:00:06:
Да. Теперь кажется всё работает как по задумке. Единственное это скорость переключения. Я думаю пока остановлюсь на этом варианте. Спасибо за Ваши ответы! :)
« Последнее редактирование: 18 Июля 2011, 01:00:06 от StealthX »

Гарри Кашпировский

  • Гость
Цитировать
ip r a default dev $1 metric one_metric ставит gw 0.0.0.0 на интерфейсе
Для туннелей pppd это не существенно ;)

Оффлайн SkyFox

  • Участник
  • *
  • Сообщений: 104
  • default TRUE=FALSE
    • Просмотр профиля
А можно увидеть результат в готовом виде? В одном месте оно как бы наглядней и понятней.
Имя - Йцукен
Фамилия - Фывапролджэ
Профессия - настройщик клавиатуры.

Гарри Кашпировский

  • Гость
Что Вы в конечном итоге хотите и результат чего Вам нужен?

Оффлайн StealthX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Кажется есть проблемка. теперь не могу заходить по ssh. для проверки выставил метрику 0 для ppp0 и тогда смог это сделать.

Гарри Кашпировский

  • Гость
ip route flush cache попробуйте.

Оффлайн StealthX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
ребутал, дабы опять все метрики прописал. потом попробовал ip route flush cache. доступа нет. я думаю что нужно настроить несколько таблиц маршрутизации.

Оффлайн StealthX

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля

 

Страница сгенерирована за 5.182 секунд. Запросов: 26.