Автор Гілка: Допоможіть налаштувати маршрутизацію (два провайдери  (Прочитано 4604 раз)

Відсутній hah

  • Дописувач
  • **
  • дописів: 50
  • Карма: +0/-0
Маю ось таку схему підключення до Інтернету
                                .--.              
                             _ -(    )- _          
                        .--,(            ),--.      
                    _.-(                       )-._
                   (           INTERNET            )
                    '-._(                     )_.-'
                     ^   '__,(            ),__'  ^  
                    /         - ._(__)_. -        \
                   /                               \
                  v                                 v
           .-------.                                .-------.
           | ISP 1 |                                | ISP 2 |
           '-------'                                '-------'
             DHCP                                     PPPoE
               |                                        |
               |                                        |
               |                                       eth0
               |                                       _|__   __
             |_|_|          DHCP                      |    | |==|
            [____°]---------192.168.2.0---------eth1--|____| |  |
                                                      /::::/ |__|
          WiFi                                        Linux Box  

        __  
       [__]
       /::/


Для авторизації та автентифікації клієнтів ISP 1 використовує білінгову систему Stargazer, ISP 2 — PPPoE.
Як видно зі схеми ISP 1 роздає IP-адреси за допомогою DHCP,  робочий комп’ютер («Linux Box») підключений до нього через eth1 кабелем через WiFi-роутер. Тобто WiFi-отримує мережеві налаштування від ISP 1 та передає їх до eth1 «Linux Box».

ISP 2 підключений до «Linux Box» безпосередньо через eth0.  

Для отримання з’єднання з Інтерентом через ISP 1 використовується авторизатор (пакунки для Debian/Ubuntu доступні через ppa:lion-simba/stargazer). Авторизатор надсилає запит до шлюзу ISP 1 із іменем та паролем, якщо запит надходить із мережевої адреси, що належить мережі ISP 1, відбувається відкриття портів на шлюзі і я маю вихід до Інтернету. У разі підключення тільки до ISP 1 (PPPoE з’єднання з ISP 2 відключене та неактивне) все працює так як треба.
user@andygol:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth1
192.168.2.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
пакунки від авторизатора ходять, як треба через потрібний Gateway
user@andygol:~$ sudo traceroute almaz.gts.dp.ua
traceroute to almaz.gts.dp.ua (91.193.69.5), 30 hops max, 60 byte packets
 1  188.247.114.158 (188.247.114.158)  1.968 ms  2.070 ms  2.333 ms
 2  ametist.gts.dp.ua (91.193.69.5)  2.398 ms  2.414 ms  2.425 ms
Якщо я під’єднуюсь до ISP 2 через PPPoE, відбувається переналаштування таблиць маршрутизації, змінюється Gateway  на адресу ISP 2. Всі пакунки, які надсилає авторизатор для ISP 1 проходять вже через шлюз ISP 2 і авторизація не відбувається, ISP 1 каже що неможливо визначити клієнта та закриває порти на шлюзі.
user@andygol:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         212.115.225.50  0.0.0.0         UG    0      0        0 ppp0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth1
192.168.2.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
212.115.225.50  0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
Відбувається зміна маршрутизації
user@andygol:~$ sudo traceroute almaz.gts.dp.ua
traceroute to almaz.gts.dp.ua (91.193.69.5), 30 hops max, 60 byte packets
 1  nas-kmn-03.fregat.net (212.115.225.50)  0.189 ms  0.249 ms  0.332 ms
 2  vl33.10GE.backbone.fregat.net (212.115.225.1)  0.940 ms  0.942 ms  1.164 ms
 3  193.111.83.130 (193.111.83.130)  1.284 ms  1.276 ms  1.252 ms
 4  91.193.68.250 (91.193.68.250)  3.140 ms  3.714 ms  4.839 ms
 5  ametist.gts.dp.ua (91.193.69.5)  0.778 ms  0.756 ms  0.738 ms

Проблема 1 полягає в тому, щоб налаштувати маршрутизацію таким чином щоб пакети які призначаються для ISP 1 доходили безпосередньо до нього, а не через шлюз ISP 2, тобто налаштувати маршрутизацію окремо для кожного з провайдерів!

Проблема 2, як задіяти обидва інтерфейси eth0 та eth1 на «Linux Box» для одночасної роботи? Про bounding мені вже говорили. На мою думку треба спочатку вирішити Проблему 1, а Проблема 2 вже повинна розв’язатись легко, чи я не правий?

PS. Вже голова пухне від мануалів, а ще я знайшов http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html та http://lartc.org/howto/
« Змінено: 2012-05-02 17:18:29 від hah »

Відсутній anatolijd

  • Графоман
  • ****
  • дописів: 325
  • Карма: +0/-0
Цитата
Проблема 1 полягає в тому, щоб налаштувати маршрутизацію таким чином щоб пакети які призначаються для ISP 1 доходили безпосередньо до нього, а не через шлюз ISP 2, тобто налаштувати маршрутизацію окремо для кожного з провайдерів!

Проблема 2, як задіяти обидва інтерфейси eth0 та eth1 на «Linux Box» для одночасної роботи? Про bounding мені вже говорили. На мою думку треба спочатку вирішити Проблему 1, а Проблема 2 вже повинна розв’язатись легко, чи я не правий?

Вам потрібно дві таблиці маршрутизації, кожна з таблиць повинна мати свій default gw на окремий інтерфейс, потім правило для маршрутизації трафіку через ту чи іншу таблицю, і правило щоб вихідний трафік йшов через той самий інтерфейс через який прийшов.

Вам потрібно оце: http://lartc.org/howto/lartc.rpdb.multiple-links.html
( http://www.odmin4eg.ru/2011/486/)

2. що значить для одночасної роботи ?
Якщо ви хочете різний тип трафіку ганяти через різних провайдерів (торенти ISP1, все решта через ISP2) то бондінг вам не підходить.

Відсутній hah

  • Дописувач
  • **
  • дописів: 50
  • Карма: +0/-0
Вам потрібно дві таблиці маршрутизації, кожна з таблиць повинна мати свій default gw на окремий інтерфейс, потім правило для маршрутизації трафіку через ту чи іншу таблицю, і правило щоб вихідний трафік йшов через той самий інтерфейс через який прийшов.

Вам потрібно оце: http://lartc.org/howto/lartc.rpdb.multiple-links.html
( http://www.odmin4eg.ru/2011/486/)
Дякую за підказку, почитаю

2. що значить для одночасної роботи ?
Якщо ви хочете різний тип трафіку ганяти через різних провайдерів (торенти ISP1, все решта через ISP2) то бондінг вам не підходить.
Під одночасною роботою я маю на увазі «агрегацію каналів», можливість безперервної роботи у разі відсутності зв’язку з одним із провайдерів, балансування навантаження… . Але є сервіси які доступні тільки в мережі певного провайдера. Так один провайдер надає послугу IPTV, інший такого не має, ще є локальні ресурси в кожного з провайдерів, доступ до яких можливий тільки у мережі конкретного провайдера. Тож також потрібно розділити трафік, що призначається окремо для кожної із мереж, це я так розумію треба зробити за допомогою двох чи більше таблиць маршрутизації.

PS Ще я надибав велику кіпу документації http://www.linuxfoundation.org/collaborate/workgroups/networking

Відсутній hah

  • Дописувач
  • **
  • дописів: 50
  • Карма: +0/-0
Я тут трохи переклав http://lartc.org/howto/lartc.rpdb.multiple-links.html
Цитата
________
                                          +------------+        /
                                          |            |       |
                            +-------------+ Provider 1 +-------
        __                  |             |            |     /
    ___/  \_         +------+-------+     +------------+    |
  _/        \__      |     if1      |                      /
 /             \     |              |                      |
| Local network -----+ Linux router |                      |     Internet
 \_           __/    |              |                      |
   \__     __/       |     if2      |                      \
      \___/          +------+-------+     +------------+    |
                            |             |            |     \
                            +-------------+ Provider 2 +-------
                                          |            |       |
                                          +------------+        \________


По перше, як маршрутизувати відповіді на пакети, що надійшли від певного провайдера, скажімо від Провайдера 1, назад знову ж таки до відповідного провайдера.

Давайте з початку встановимо кілька символічних назв. Нехай
$IF1 — назва першого інтерфейсу (на малюнку if1), а
$IF2 — назва іншого інтерфейсу.
Потім,
$IP1 буде IP-адресою пов’язаною з $IF1, а
$IP2 — IP-адреса пов’язана з $IF2.
Далі,
$GW1 — IP-адреса шлюзу Провайдера 1, а
$GW2 — IP-адреса шлюзу Провайдера 2.
І на останнє,
$P1_NET — мережа до якої належить шлюз $GW1, а
$P2_NET — мережа до якої належить шлюз $GW2.

Тепер додамо дві таблиці маршрутизації T1 та T2 до /etc/iproute2/rt_tables. Тепер задамо маршрутизацію для цих таблиць

        ip route add $P1_NET dev $IF1 src $IP1 table T1
        ip route add default via $GW1 table T1

        ip route add $P2_NET dev $IF2 src $IP2 table T2
        ip route add default via $GW2 table T2

Нічого незвичайного, просто побудуйте маршрут до шлюзу та вкажіть типовий маршрут через цей шлюз, так само як ви могли б це зробити у випадку одного провайдера, але з розміщенням маршрутів в окремих таблицях для кожного провайдера. Зверніть увагу, що мережевого маршруту достатньо для того, щоб знайти будь-який хост у мережі, що містить цей шлюз, як зазначено вище.

Далі треба створити головну таблицю маршрутизації. Це буде гарною ідеєю направити трафік безпосередньо до сусідній хостів через інтерфейс, до якого вони під’єднанні. Зауважте, що аргумент `src' надає можливість переконатись, що обрано правильну вихідну IP-адресу.

          ip route add $P1_NET dev $IF1 src $IP1
          ip route add $P2_NET dev $IF2 src $IP2

Потім ваші налаштування для типової маршрутизації

          ip route add default via $GW1

Далі потрібно задати правила маршрутизації. З їх допомогою буде обиратись відповідна таблиця маршрутизації. Ви потрібні переконатись, що ваші маршрути йдуть через вказаний інтерфейс, якщо ви вже маєте відповідні сирцеві адреси:

          ip rule add from $IP1 table T1
          ip rule add from $IP2 table T2

Цей набір команд гарантує, що всі відповіді на трафік, що поступає певний на інтерфейс був отриманий у відповідь на запит з цього інтерфейсу.

Але в мене лишилось кілька питань.
Отже, як я казав у першому повідомленні цієї гілки, мережеві налаштування я отримую від ISP 1 за допомогою DHCP, а від IPS 2 через PPPoE. Отже потрібно кожного разу визначати значення усіх наведених змінних.

Якщо визначити IP-адресу інтерфейсу eth0 можна так:
ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'то як визначити інші змінні? І як потім зробити так, щоб все це піднімалось під час завантаження системи?
« Змінено: 2012-05-02 18:47:01 від hah »

Відсутній hah

  • Дописувач
  • **
  • дописів: 50
  • Карма: +0/-0
Визначення Default Gateway
« Відповідей #4 : 2012-05-02 20:20:24 »
Отже, щоб визначити типовий шлюз в системі можна скористатись одним із рядків

$ route -n | grep 'UG[ \t]' | awk '{print $2}'

$ ip route list | awk ' /^default/ {print $3}'

$ netstat -rn |awk '{if($1=="0.0.0.0") print $2}'

$ netstat -rn|sed -n '/^0.0.0.0/{ s/^[0. ]*//; s/ .*$//; p; }'

$ ip r | awk '/^def/{print $3}'
всі вони дають нам адресу нашого типового шлюзу, у моєму випадку у разі підключення тільки до ISP 1 — 192.168.2.1 (тут в якості шлюзу виступає мій роутер, через який я під’єднуюсь до ISP 1).

Але, якщо трохи ускладнити задачу.

Як отримати дані, що надсилаються через DHCP?
В них повинно бути все: й IP-адреса, адреса та маска мережі, адреса шлюзу, адреси DNS-серверів.

Адже, якщо в Network Manager’і увімкнути автоматичне під’єднання до ISP 2 через PPPoE, то типовий шлюз ISP 1 буде замінений на шлюз ISP 2, а нам треба зібрати інформацію по двох мережевих інтерфейсах для подальшого створення таблиць маршрутизації.

Відсутній hah

  • Дописувач
  • **
  • дописів: 50
  • Карма: +0/-0
Re: Визначення Default Gateway
« Відповідей #5 : 2012-05-03 16:23:54 »
Як отримати дані, що надсилаються через DHCP?
В них повинно бути все: й IP-адреса, адреса та маска мережі, адреса шлюзу, адреси DNS-серверів.
Сам спитав — сам й знайшов відповідь.

Якщо вам потрібно подивитись дані, що їх отримує через DHCP ваш комп’ютер, подивіться у файл
/var/lib/dhcp/dhclient.leases (може бути тут /var/lib/dhcp3/dhclient.leases)
у мене цей файл виглядає наступним чином
user@andygol:~$ cat /var/lib/dhcp/dhclient.leases
lease {
  interface "eth1";
  fixed-address 192.168.2.100;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 315360000;
  option routers 192.168.2.1;
  option dhcp-message-type 5;
  option dhcp-server-identifier 192.168.2.1;
  option domain-name-servers 91.193.69.4,91.193.68.22;
  option domain-name "andyhome";
  renew 4 2016/07/14 00:09:31;
  rebind 6 2021/01/30 03:23:03;
  expire 0 2022/05/01 09:23:03;
}
lease {
  interface "eth1";
  fixed-address 192.168.2.100;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 315360000;
  option routers 192.168.2.1;
  option dhcp-message-type 5;
  option dhcp-server-identifier 192.168.2.1;
  option domain-name-servers 91.193.69.4,91.193.68.22;
  option domain-name "andyhome";
  renew 4 2012/05/03 09:39:06;
  rebind 4 2012/05/03 09:39:06;
  expire 4 2012/05/03 09:39:06;
}
Опис всіх параметрів можна подивитись man dhcp-options

Для того, що отримати значення конкретного параметру
  • назва інтерфейсу — grep interface /var/lib/dhcp/dhclient.leases | cut -d\" -f2 | awk '{print $1}'|tail -n 1
  • шлюз — grep routers /var/lib/dhcp/dhclient.leases | tail -n 1|awk '{print $3}'|cut -d\; -f1
  • IP-адреса — grep fixed-address /var/lib/dhcp/dhclient.leases | tail -n 1|awk '{print $2}'|cut -d\; -f1
  • Адреса мережі — може хто знає скрипт, що обчислює адресу мережі із IP-адреси хосту та маски мережі?
З ISP1 майже розібрався. Тепер потрібно знайти інформацію щодо визначення параметрів PPPoE з’єднання для ISP2.

UPD Скриптик для знаходження адреси мережі
function get_net() {
ip=$1
mask=$2
for ((i=1;$i<5;i++))
do
ip_=$(echo $ip|cut -d. -f$i)
mask_=$(echo $mask|cut -d. -f$i)
sb[$i]=$(($ip_&$mask_))
done
echo ${sb[1]}.${sb[2]}.${sb[3]}.${sb[4]}
}
« Змінено: 2012-05-03 20:30:51 від hah »

Відсутній hah

  • Дописувач
  • **
  • дописів: 50
  • Карма: +0/-0
Знайшов ще один рецепт http://linux-ip.net/html/adv-multi-internet.html.

Треба спробувати…

Може, хтось вже робив таке, поділіться інформацією.

UPD. http://wiki.opennet.ru/Linux_ppp-oe_%28ADSL%29_Balance - для двох провайдерів (PPPoE - з’єднання з обома) з балансуванням
« Змінено: 2012-05-04 12:41:38 від hah »