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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: IP-Балансировка. как сделать интернет на самом сервере?  (Прочитано 1280 раз)

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

Оффлайн Venom13

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
Добрый день.
Появилась необходимости в балансировке нагрузки.
Оба щлюза интернет в одной подсети..
Решил, что ставить выделенную "железку" не к чему..
Поднял виртуалку VirtualBox с Ubuntu server 12.10, подключил к нему 3 сетевых моста в физическую карту хоста.. Далее настроил все как написанно тут:
https://help.ubuntu.ru/wiki/ip_balancing
(по 2-му способу)
В дабавок пришлось поставить bind9 (без него DNS ни в какую не работали), настроил приметивно, только сервера высшего уровня (перечислил все, обоих провайдеров + гугловые) и адреса локалки..
Теперь все работает как я и хотел, в сети 3 шлюза..
2 - самостоятельные роутеры, и 1 - сервер, балансирующий нагрузку между первыми 2-мя..
Осталось 2 вопроса..
1.После старта скрипта балансировки пропадает интернет на самом сервере (скрипт динамически переписывает маршруты).. И вот такая забавная ситуация, на всех устройствах на которых этот сервер прописан как шлюз, интернет есть, а на самом шлюзе - нет....
В интернете ничего по этому вопросу не нашел......  :idiot2:
2. Как теперь пробрасывать порты с роутеров для SSH..
Пробросил с обоих роутеров на карты, в которых ЭТОТ роутер прописан шлюзом, но вот подключение не проходит.. Есть большое подозрение, что такое поведение вытекает из первого вопроса....

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28358
    • Просмотр профиля
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Venom13

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
Спасибо!
Как раз то, что я искал..  8)
Теперь буду пытаться приколупать это к тем правилам, которые раскидывают исходящие соединения....
(с маршрутизацией в линухах у меня все печально, буду разбираться)

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28358
    • Просмотр профиля
Будут вопросы - пишите.
Только сразу выкладывайте
ip alias show ; ip rule show ; ip route show table all ; iptables-saveчтобы за вами по два раза не бегать.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Venom13

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
Фуф..
Сделал..
Проброс портов с обоих интерфейсов работает.
Но вот с одним явлением никак не могу разобраться..
Стартует скрипт. Интернет есть на обоих картах, работает баланс нагрузки....
В случае падения одного из них отрабатывает вот этот участок скрипта:
if (( ($NEWIF1!=$OLDIF1) || ($NEWIF2!=$OLDIF2) )); then
echo "Changing routes"

if (( ($NEWIF1==1) && ($NEWIF2==1) )); then

echo "Both channels"
ip route delete default
ip route add default scope global nexthop via $P1 dev $IF1 weight $W1 \
nexthop via $P2 dev $IF2 weight $W2

elif (( ($NEWIF1==1) && ($NEWIF2==0) )); then

echo "First channel"
ip route delete default
ip route add default via $P1 dev $IF1

elif (( ($NEWIF1==0) && ($NEWIF2==1) )); then
echo "Second channel"
ip route delete default
ip route add default via $P2 dev $IF2

fi

# Маршрутизация для входящих
. /etc/balance/inrouting.sh

else
echo "Not changed"
fi

От себя добавил только inrouting.sh, чтобы обновлять правила входящей маршрутизации..
Его содержимое:
#!/bin/bash

#echo -e "1\tp1" >> /etc/iproute2/rt_tables
#echo -e "2\tp2" >> /etc/iproute2/rt_tables

echo "In Routing.."

ip route del table p1
ip route del table p2

ip route add default via 10.23.1.101 dev eth1 src 10.23.1.121 table p1
ip route add default via 10.23.1.102 dev eth2 src 10.23.1.122 table p2


ip rule del fwmark 1
ip rule del fwmark 2

ip rule add fwmark 1 table p1
ip rule add fwmark 2 table p2

sudo iptables-restore < iptablesroute.rules

Так вот..
Если падает второй канал, то все хорошо, нагрузка перекатывает на первый и проброшенные на него порты работают..
А вот если ложится первый канал.. Нагрузка переходит на второй, но вот проброшенные на него порты уже не доступны. Весьма странно, ведь переписка маршрутов полностью аналогична в обоих случаях..
Да и он остается единственным интерфейсом с шлюзом по умолчанию..
В чем может быть дело?
P.S. После восстановления обоих каналов работа проброшенных портов восстанавливается...  :idiot2:

Пользователь решил продолжить мысль 05 Марта 2013, 18:00:43:
Ааааа..
Извиняюсь...
Дурья моя бошка, у меня на обеих шлюзах были проброшенны порты на один интерфейс,
который я отключал для эмуляции падения первого канал....  :-[
IP1="10.23.1.121"
IP2="10.23.1.122"

# gateway 1
P1="10.23.1.101"
# gateway 2
P2="10.23.1.102"
Поменял адрес, теперь все как надо.. Спасибо!  8)
« Последнее редактирование: 05 Марта 2013, 18:00:43 от Venom13 »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28358
    • Просмотр профиля
Я же говорил, куда смотреть, если не работает :)
И вы делаете много телодвижений в скриптах, как мне кажется.
$ cat /etc/network/if-up.d/iproute2
#! /bin/sh

# GW [ TABLE(="default") [ FWMARK_in_hex ] ]
set_gateway()
{
  local GW=$1
  local TABLE=$2
  local FWMARK=$3

  [ "$GW" ] || return 2
  TABLE=${TABLE:=default}

  ip route flush table $TABLE > /dev/null 2>&1
  ip route add default via $GW dev $IFACE src $IF_ADDRESS table $TABLE

  if [ "$FWMARK" -a "$TABLE" != "default" ]; then
    (ip rule list | grep -q "fwmark $FWMARK lookup $TABLE") || (
      ip rule delete table $TABLE > /dev/null 2>&1
      ip rule add fwmark $FWMARK table $TABLE
    )
  fi
}

if [ "br0" = "$IFACE" ] ; then

  IF_NET=192.168.1.0/28

  set_gateway 192.168.1.1 vpn_nln 0x1
  set_gateway 192.168.1.2 adsl_mtu 0x2

fi
br0 - бридж локалки. Остальное, думаю, понятно из скрипта.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Venom13

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
Я, честно говоря, слабо представляю что происходит в вашем варианте кода...  ???
тот что я брал за основу, как-то понятнее (наверное для этого и писался)..
Я только учусь..  :)

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28358
    • Просмотр профиля
Ладно, объясню подробно тогда.
$ cat /etc/network/if-up.d/iproute2
#! /bin/sh

# создаётся функция "установка шлюза" с параметрами "шлюз", "таблица", "марка"
# GW [ TABLE(="default") [ FWMARK_in_hex ] ]
set_gateway()
{
# Параметры функции именуются, имена делаются локальными, чтобы не повредить
# выполнению основного скрипта
  local GW=$1
  local TABLE=$2
  local FWMARK=$3

# Если шлюз не задан ($GW имеет нулевую длину) - выпасть из функции с ошибкой
  test -z "$GW" && return 2
# Если таблица не указана - принять, что таблица будет "default"
  TABLE=${TABLE:-default}

# Очистить указанную таблицу маршрутизации и записать новые правила
  ip route flush table $TABLE > /dev/null 2>&1
  ip route add default via $GW dev $IFACE src $IF_ADDRESS table $TABLE

# Если указана марка и таблица не "default"
  if [ "$FWMARK" -a "$TABLE" != "default" ]; then
# Если отсутствует правило, ссылающееся на нужную таблицу по указанной марке
    (ip rule show | grep -q "fwmark $FWMARK lookup $TABLE") || (
# Убить правило, ссылающееся на указанную таблицу (поскольку оно ссылается на неправильную марку)
      ip rule delete table $TABLE > /dev/null 2>&1
# Добавить правило по марке, указывающее на нужную таблицу
      ip rule add fwmark $FWMARK table $TABLE
    )
  fi
}

# Собственно, работа. Если поднимаемый интерфейс br0 - поднять правила маршрутизации
if [ "br0" = "$IFACE" ] ; then

  set_gateway 192.168.1.1 vpn_nln 0x1
  set_gateway 192.168.1.2 adsl_mtu 0x2

fi
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Venom13

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
Спасибо за пояснеиня!
Это уже к области "улучшений".. Как все заработает буду украшать.... :)
Никак не могу понять, как теперь порт в локалку пробросить..
Это нужно ещё что-то в iptables добавлять?
Во время выполнения скрипта он выглядит вот так:
(Нажмите, чтобы показать/скрыть)
На сколько я понимаю, проброс портов надо делать так:
iptables -t nat -A PREROUTING -p tcp -d 10.23.1.122 --dport 3389 -j DNAT --to-destination 10.23.1.115:3389
 iptables -t nat -A POSTROUTING -p tcp --dst 10.23.1.115 --dport 3389 -j SNAT --to-source 10.23.1.122
10.23.1.122 - IP на который проброшен порт 3389 в роутере, 10.23.1.115 - IP на который надо перебросить...
Но проброс все равно не происходит.... Что не так?

Пользователь решил продолжить мысль 07 Марта 2013, 10:34:21:
После выполнения строк, iptables выглядит вот так:
(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 07 Марта 2013, 15:37:18:
Все, разобрался...  8)
--
Если кому интересно, помогла утилита iptraf ..
Посмотрел куда какие пакеты идут.
Оказалось, что в тех правилах все правильно.
Просто в моем случае шлюзом на клиенте прописана не та сетевая карта с которой идет мапинг.. Соответственно ответ приходит с другова интерфейса, и уходит непонятно куда..
Поправил:
#!/bin/bash

echo "Port maping.."

# RDP на на 10.23.1.115
iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 10.23.1.115:3389
iptables -t nat -A POSTROUTING -p tcp --dst 10.23.1.115 --dport 3389 -j SNAT --to-source 10.23.1.100
(Не уверен, что все правильно понял, но работает..  :) )
« Последнее редактирование: 07 Марта 2013, 15:37:18 от Venom13 »

 

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