linux два интерфейса (linux два провайдера)

Как и обещал, пишу.
Довольно много времени потратил на понимание происходящего..

И так есть у меня сервер, он же ОпенВПН сервер в одной организации. и вот упёрлась организация в ширину канала, собственно беда в том, что по этому же каналу ходил SIP трафик, и сильно “лагал” когда ширины канала не хватало 🙁

Подключаем ещё один канал от второго провайдера. есть сервер в нём внешний канал (eth1), локальная сеть(eth0), ещё ходит OpenVPN (tun0) для связи с остальными филиалами.

Добавился ещё один внешний провайдер (eth4). для его подключение я сделал так.
Напомню, что linux умеет работать с несколькими таблицами маршрутизации

Тоесть для удобства я могу для каждого своего филиала создать табилцу маршрутизации, и в ней уже удобно управлять маршрутами, потом мне не надо будет листать простыню маршрутов таблицы main

в файл [cc lang=”bash”] /etc/iproute2/rt_tables[/cc]
Добавил 2 таблицы
[cc lang=”bash”]
201 T1
202 T2
[/cc]
У каждого провайдера будет своя таблица маршрутизация
Т1 – первый провайдер
Т2 – второй

Создал скрипт, что будет заведовать маршрутизацией.
[cc lang=”bash”]#!/bin/sh
IP1=217.111.111.99
IP2=94.11.111.81
P1=217.111.111.97
P2=94.11.111.82
IF1=eth1
IF2=eth4
# добавим дефаулт гетвей в каждую таблицу.
ip route add default via $P1 table T1
ip route add default via $P2 table T2
# Говорим, что по дефолту будем ходить через первого провайдера.
ip route add default via $P1
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2
#Перечисляю хосты, что будут ходить через новый интерфейс вот так
#Но не забываем их указывать в NAT iptables
ip rule add from 192.168.5.107 table T2
ip rule add from 192.168.5.108 table T2
ip rule add from 192.168.5.112 table T2
ip rule add from 192.168.5.199 table T2
#Это так на всякий случай
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

[/cc] Где
IP# это ИП адрес на интерфейсе,
P# шлюз на интерфейсе
после этого сервер отвечает по обоим интерфейсам. также пинги/трацерты с сервера ходят через нужный интерфейс.
[cc lang=”bash”] ping -I eth4 ya.ru [/cc]
теперь мне нужно что нужные мне клиенты ходили через этот интерфейс наружу. в iptables.up.rules у меня есть правила НАТа
[cc lang=”bash”]
-A POSTROUTING -s 192.168.5.102 -o eth4 -j MASQUERADE
-A POSTROUTING -s 10.10.10.6 -o eth4 -j MASQUERADE
-A POSTROUTING -s 192.168.0.0/255.255.0.0 -o eth1 -j MASQUERADE
-A POSTROUTING -s 10.10.0.0/255.255.0.0 -o eth1 -j MASQUERADE
[/cc]
первыми 2мя строками я хочу чтоб вот 192.168.5.102 и 10.10.10.6 НАТились через нового провайдера. rp_filter выключаем вот так в sysctrl
[cc lang=”bash”]
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
[/cc]

Теперь, надо понимать, что если идёт пакет на 192.168.5.108, то он попадает в таблицу T2 а в ней у нас что? правильно один только дефаултгетвей! а что такое другие подсети филиалов и ОпенВПН мы знать не знаем, поэтому тоже необходимо добавить маршрут в таблицу Т2 для указания где у нас ходятся 10.10.10.0
[cc lang=”bash”]ip route add 10.10.10.0/24 via 10.10.10.2 dev tun0 table T2[/cc]

Всё это кидаем в первый скрипт, а скрипт в автозагрузку. Теперь ещё важный момент, браузер у нас работает прозрачно через squid3 и получается, что весь трафик ходит через один интерфейс, а хттп трафик ходит через другой, не хорошо получается. поэтому читаем вот эту статью

Оставите комментарий ?

10 Комментарии。

  1. Всё очень просто http://traffpro.ru позволяет иметь два провайдера и более, резервировать каналы, аварийно переключать при падении одно из них и так далее.

  2. ну это же не unix way, ведь кайф когда решаешь проблему руками, а не идёшь в магазин за софтиной решающую задачу, не?

  3. А как быть что-бы было
    net.ipv4.conf.all.rp_filter = 1
    ?

  4. Скажите, а если мне надо резервный канал иметь, но переключение автоматом чтобы было – куда копать?
    Спасибо!

  5. а если второй интерфейс с динамическим IP, как заводить настройки IP и gateway?

  6. Через сокеты

  7. Подскажите, а как быть с туннелем? У меня два провайдера, через одного из них поднимается туннель и весь траф заворачивается в этот туннель. Второй пров включен напрямую. Мне нужно, чтобы из внутренней сети 192.168.100.0/24 траф уходил в туннель, а из сети 192.168.200.0/24 ко второму прову. Я не знаю как прописать роут в туннель, ведь он сам его отдает от сервера.

  8. спасибо
    но вы не поверите, как мне не хватало этой строчки
    ip route add 10.10.10.0/24 via 10.10.10.2 dev tun0
    чтобы заработал openvpn в 18 убунте!

  9. помоему ошибочка вышла в названии
    linux да интерфейса

  10. да, спасибо

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>