Как и обещал, пишу.
Довольно много времени потратил на понимание происходящего..
И так есть у меня сервер, он же ОпенВПН сервер в одной организации. и вот упёрлась организация в ширину канала, собственно беда в том, что по этому же каналу ходил SIP трафик, и сильно «лагал» когда ширины канала не хватало 🙁
Подключаем ещё один канал от второго провайдера. есть сервер в нём внешний канал (eth1), локальная сеть(eth0), ещё ходит OpenVPN (tun0) для связи с остальными филиалами.
Добавился ещё один внешний провайдер (eth4). для его подключение я сделал так.
Напомню, что linux умеет работать с несколькими таблицами маршрутизации
Тоесть для удобства я могу для каждого своего филиала создать табилцу маршрутизации, и в ней уже удобно управлять маршрутами, потом мне не надо будет листать простыню маршрутов таблицы main
в файл
/etc/iproute2/rt_tablesCode language: Bash (bash)
Добавил 2 таблицы
201 T1
202 T2Code language: Bash (bash)
У каждого провайдера будет своя таблица маршрутизация
Т1 — первый провайдер
Т2 — второй
Создал скрипт, что будет заведовать маршрутизацией.
#!/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
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_redirectsCode language: Bash (bash)
Где
IP# это ИП адрес на интерфейсе,
P# шлюз на интерфейсе
после этого сервер отвечает по обоим интерфейсам. также пинги/трацерты с сервера ходят через нужный интерфейс.
ping -I eth4 ya.ru Code language: Bash (bash)
теперь мне нужно что нужные мне клиенты ходили через этот интерфейс наружу. в iptables.up.rules у меня есть правила НАТа
-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 MASQUERADECode language: Bash (bash)
первыми 2мя строками я хочу чтоб вот 192.168.5.102 и 10.10.10.6 НАТились через нового провайдера. rp_filter выключаем вот так в sysctrl
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0Code language: Bash (bash)
Теперь, надо понимать, что если идёт пакет на 192.168.5.108, то он попадает в таблицу T2 а в ней у нас что? правильно один только дефаултгетвей! а что такое другие подсети филиалов и ОпенВПН мы знать не знаем, поэтому тоже необходимо добавить маршрут в таблицу Т2 для указания где у нас ходятся 10.10.10.0
ip route add 10.10.10.0/24 via 10.10.10.2 dev tun0 table T2Code language: Bash (bash)
Всё это кидаем в первый скрипт, а скрипт в автозагрузку. Теперь ещё важный момент, браузер у нас работает прозрачно через squid3 и получается, что весь трафик ходит через один интерфейс, а хттп трафик ходит через другой, не хорошо получается. поэтому читаем вот эту статью