ip route балансировка

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
xtty
Сообщения: 182
Статус: Развожу чертенков и пингвинов
ОС: Linux

ip route балансировка

Сообщение xtty »

Балансировка посредством iproute и iptables. Время переключения каналов 10 секунд, даже если играться и выдергивать по очереди.Пробелема была в правилами DNAT , так как , после прохождения , он теряет маркировку и уходит уже по любому маршруту. Сделал более легким способом , добавив аллиасы на сетевые интерфейсы и уже входящие и исходящие подключения маркировал и отправлял или по первому или по второму каналу.Работает уже 3 неделю, проблем замеченно не было .
Вот скрипты

Код: Выделить всё

#!/bin/bash
# LAN interface
IF0="eth1"

# WAN interface 1
IF1="eth0"

# WAN interface 2
IF2="eth2"

LO_IFACE="lo"
LO_IP="127.0.0.1"

LAN_IP="172.16.0.92"
MAIL_IP="172.16.0.3"
WEB_IP="172.16.0.3"
MAIL_IP2="172.16.0.4"   (allias на почтовом сервере )
WEB_IP2="172.16.0.4"
RDP_IP="172.16.0.22"
RDP_IP2="172.16.0.23"  (allias на RDP сервере )

IP1="217.*.*.*"
IP2="87.*.*.*"

# gateway 1
P1="217.*.*.*"
# gateway 2
P2="87.*.*.*"

# LAN netmask
P0_NET="172.16.0.0/24"
# WAN1 netmask
P1_NET="255.255.255.248"
# WAN2 netmask
P2_NET="255.255.255.128"


TBL1="provider1"
TBL2="provider2"

# Realtive weight of channels bandwidth
W1="2"
W2="1"

IPTABLES="iptables"


Код: Выделить всё

#!/bin/bash

. /etc/sysconfig/balans/vars

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp

ip route flush table $TBL1
ip route flush table $TBL2

ip route add $P1_NET dev $IF1 src $IP1 table $TBL1 > /dev/null 2>&1
ip route add default via $P1 table $TBL1 > /dev/null 2>&1
ip route add $P2_NET dev $IF2 src $IP2 table $TBL2 > /dev/null 2>&1
ip route add default via $P2 table $TBL2 > /dev/null 2>&1

ip route add $P1_NET dev $IF1 src $IP1 > /dev/null 2>&1
ip route add $P2_NET dev $IF2 src $IP2

ip route add default via $P1 > /dev/null 2>&1

ip rule add from $IP1 table $TBL1 > /dev/null 2>&1
ip rule add from $IP2 table $TBL2 > /dev/null 2>&1

ip rule add fwmark 0x5 table $TBL1
ip rule add fwmark 0x6 table $TBL2

ip route add $P0_NET   dev $IF0 table $TBL1 > /dev/null 2>&1
ip route add $P2_NET   dev $IF2 table $TBL1 > /dev/null 2>&1
ip route add 127.0.0.0/8 dev lo  table $TBL1 > /dev/null 2>&1
ip route add $P0_NET   dev $IF0 table $TBL2 > /dev/null 2>&1
ip route add $P1_NET   dev $IF1 table $TBL2 > /dev/null 2>&1
ip route add 127.0.0.0/8 dev lo  table $TBL2 > /dev/null 2>&1

ip route flush cache


$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -t mangle -N NEW_OUT_CONN

$IPTABLES -N bad_tcp_packets
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets

$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 20 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 25 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 110 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 143 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 3389 -j allowed

$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 3389 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 123 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 2074 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 4000 -j ACCEPT

$IPTABLES -A INPUT -p ALL -i $IF0 -s $P0_NET -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $IP1 -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $IP2 -j ACCEPT

$IPTABLES -A INPUT -p ALL -d $IP1 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $IP2 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $IF1 -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $IF1 -j udp_packets
$IPTABLES -A INPUT -p TCP -i $IF2 -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $IF2 -j udp_packets
#$IPTABLES -A INPUT -p ICMP -i $IF1 -j icmp_packets

$IPTABLES -A INPUT -i $IF1 -d 224.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $IF2 -d 224.0.0.0/8 -j DROP

$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "

$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets

$IPTABLES -A FORWARD -i $IF0 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 3389 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 5060 -j ACCEPT
$IPTABLES -A FORWARD -p UDP --dport 5060 -j ACCEPT
$IPTABLES -A FORWARD -p UDP --dport 5061 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 20 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 21 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 25 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 23 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 80 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 110 -j ACCEPT
$IPTABLES -A FORWARD -p TCP --dport 143 -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "

$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets

$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $IP1 -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $IP2 -j ACCEPT
$IPTABLES  -t mangle -A PREROUTING -i $IF1 -p tcp --dport 3389 -j MARK --set-mark 5
$IPTABLES  -t mangle -A PREROUTING -i $IF2 -p tcp --dport 3389 -j MARK --set-mark 6
$IPTABLES  -t mangle -A PREROUTING -i $IF1 -p tcp --dport 25 -j MARK --set-mark 5
$IPTABLES  -t mangle -A PREROUTING -i $IF2 -p tcp --dport 25 -j MARK --set-mark 6
$IPTABLES  -t mangle -A PREROUTING -i $IF1 -p tcp --dport 80 -j MARK --set-mark 5
$IPTABLES  -t mangle -A PREROUTING -i $IF2 -p tcp --dport 80 -j MARK --set-mark 6
$IPTABLES  -t mangle -A PREROUTING -i $IF1 -p tcp --dport 110 -j MARK --set-mark 5
$IPTABLES  -t mangle -A PREROUTING -i $IF2 -p tcp --dport 110 -j MARK --set-mark 6
$IPTABLES  -t mangle -A PREROUTING -i $IF1 -p tcp --dport 143 -j MARK --set-mark 5
$IPTABLES  -t mangle -A PREROUTING -i $IF2 -p tcp --dport 143 -j MARK --set-mark 6


$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "

$IPTABLES -t nat -A POSTROUTING -p tcp -m iprange --src-range 172.16.0.1-172.16.0.99 -o $IF1 -j SNAT --to-source $IP1
$IPTABLES -t nat -A POSTROUTING -p udp -m iprange --src-range 172.16.0.1-172.16.0.99 -o $IF1 -j SNAT --to-source $IP1
$IPTABLES -t nat -A POSTROUTING -p tcp -m iprange --src-range 172.16.0.1-172.16.0.99 -o $IF2 -j SNAT --to-source $IP2
$IPTABLES -t nat -A POSTROUTING -p udp -m iprange --src-range 172.16.0.1-172.16.0.99 -o $IF2 -j SNAT --to-source $IP2

$IPTABLES -t nat -A POSTROUTING -p tcp -m iprange --src-range 172.16.0.200-172.16.0.255 -o $IF1 -j SNAT --to-source $IP1
$IPTABLES -t nat -A POSTROUTING -p udp -m iprange --src-range 172.16.0.200-172.16.0.255 -o $IF1 -j SNAT --to-source $IP1
$IPTABLES -t nat -A POSTROUTING -p tcp -m iprange --src-range 172.16.0.200-172.16.0.255 -o $IF2 -j SNAT --to-source $IP2
$IPTABLES -t nat -A POSTROUTING -p udp -m iprange --src-range 172.16.0.200-172.16.0.255 -o $IF2 -j SNAT --to-source $IP2

$IPTABLES -t nat -A POSTROUTING -s 172.16.0.0/24 -o $IF0 -p tcp -m tcp --dport 3389 -j SNAT --to-source $IP1
$IPTABLES -t nat -A POSTROUTING -s 172.16.0.0/24 -o $IF0 -p tcp -m tcp --dport 3389 -j SNAT --to-source $IP2

$IPTABLES -t nat -A POSTROUTING -p tcp -s $P0_NET --dst $MAIL_IP --dport 25 -j SNAT --to-source $LAN_IP
$IPTABLES -t nat -A POSTROUTING -p tcp -s $P0_NET --dst $MAIL_IP --dport 110 -j SNAT --to-source $LAN_IP
$IPTABLES -t nat -A POSTROUTING -p tcp -s $P0_NET --dst $MAIL_IP --dport 143 -j SNAT --to-source $LAN_IP
$IPTABLES -t nat -A POSTROUTING -p tcp -s $P0_NET --dst $WEB_IP --dport 80 -j SNAT --to-source $LAN_IP

$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP1 --dport 3389 -j DNAT --to-destination $RDP_IP
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP2 --dport 3389 -j DNAT --to-destination $RDP_IP2
$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $RDP_IP -p tcp --sport 3389 -j MARK --set-mark 5
$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $RDP_IP2 -p tcp --sport 3389 -j MARK --set-mark 6
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $LAN_IP --dport 25 -j DNAT --to-destination $MAIL_IP
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $LAN_IP --dport 110 -j DNAT --to-destination $MAIL_IP
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $LAN_IP --dport 143 -j DNAT --to-destination $MAIL_IP

$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP1 --dport 25 -j DNAT --to-destination $MAIL_IP
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP1 --dport 110 -j DNAT --to-destination $MAIL_IP
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP1 --dport 143 -j DNAT --to-destination $MAIL_IP

$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP2 --dport 25 -j DNAT --to-destination $MAIL_IP2
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP2 --dport 110 -j DNAT --to-destination $MAIL_IP2
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP2 --dport 143 -j DNAT --to-destination $MAIL_IP2

$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $MAIL_IP -p tcp --sport 25 -j MARK --set-mark 5
$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $MAIL_IP -p tcp --sport 110 -j MARK --set-mark 5
$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $MAIL_IP -p tcp --sport 143 -j MARK --set-mark 5

$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $MAIL_IP2 -p tcp --sport 25 -j MARK --set-mark 6
$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $MAIL_IP2 -p tcp --sport 110 -j MARK --set-mark 6
$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $MAIL_IP2 -p tcp --sport 143 -j MARK --set-mark 6


$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $LAN_IP --dport 80 -j DNAT --to-destination $WEB_IP
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP1 --dport 80 -j DNAT --to-destination $WEB_IP
$IPTABLES -t nat -A PREROUTING -p TCP -m tcp -d $IP2 --dport 80 -j DNAT --to-destination $WEB_IP2

$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $WEB_IP -p tcp --sport 80 -j MARK --set-mark 5
$IPTABLES -t mangle -A PREROUTING -i $IF0 -s $WEB_IP2 -p tcp --sport 80 -j MARK --set-mark 6


и скрипт проверки каналов

Код: Выделить всё

#!/bin/bash

. /etc/sysconfig/balans/vars

OLDIF1=0
OLDIF2=0

. /etc/sysconfig/balans/routing.sh
while true; do


ping -c 3 -s 100 $P1 -I $IF1 > /dev/null
 if [ $? -ne 0 ]; then
   echo "Failed IF1!"
 NEWIF1=0
 else
 NEWIF1=1
 fi

 ping -c 3 -s 100 $P2 -I $IF2 > /dev/null
 if [ $? -ne 0 ]; then
 echo "Failed IF2!"
 NEWIF2=0
 else
 NEWIF2=1
 fi

 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

else
echo "Not changed"
fi

OLDIF1=$NEWIF1
OLDIF2=$NEWIF2
sleep 3
done


Вот уже готовый вариант , рабочий .
Gentoo 2014

Спасибо сказали:
Аватара пользователя
xtty
Сообщения: 182
Статус: Развожу чертенков и пингвинов
ОС: Linux

Re: ip route балансировка

Сообщение xtty »

Нету ни у кого ни каких мысле ? Жаль ...
Прикол в том , что даже если убрать правило хождения рдп по другому канала , все равно через минут 15 сессия отрубается.Остается токо одно правило хождения по дефолтному основному маршруту и все равно зависает ...Пните хоть в какое то направление ...((

Если выдернуть кабель второго канала все отлично , рдп не виснет .
Gentoo 2014

Спасибо сказали:
Аватара пользователя
xtty
Сообщения: 182
Статус: Развожу чертенков и пингвинов
ОС: Linux

Re: ip route балансировка

Сообщение xtty »

Связь отрубается не токо на рдп , а по всем протоклам , просто на почте или на веб это не заметно .
Если подключатсья из локалки в инет по рдп , то все ок , а вот если с инета на мои сервера , то обрывется .
Ну блин хоть в какое то направление пните , уже критичеки все это ...
Gentoo 2014

Спасибо сказали:
Аватара пользователя
xtty
Сообщения: 182
Статус: Развожу чертенков и пингвинов
ОС: Linux

Re: ip route балансировка

Сообщение xtty »

Проблему вроде как нашел , не туда шлет . щас попробую скрипт переписать с маркировкой пакетов через iptables .
Gentoo 2014

Спасибо сказали:
Аватара пользователя
xtty
Сообщения: 182
Статус: Развожу чертенков и пингвинов
ОС: Linux

Re: ip route балансировка

Сообщение xtty »

Третий день вожусь, не подскажите как правило написать с маркировкой, что бы если пакет по рдп ( или любому другому протоколу пришел по первому каналу) в любом случае возвращался бы по этому же самому каналу.
Проблема с балансировкой именно в этом , где то через 15 минут , пакет начинает уходить на адресс подключения , по другому каналу. И из-за этого все траблы.
нужно просто промаркировать и отправть на iproute .

Делал так

добовлял в iproute

Код: Выделить всё

ip rule add fwmark 0x5 table $TBL1
ip rule add fwmark 0x6 table $TBL2


и в iptables

Код: Выделить всё

$IPTABLES  -t mangle -A PREROUTING -i $IF1 -m state --state NEW -j CONNMARK --set-mark 5
$IPTABLES  -t mangle -A OUTPUT -j CONNMARK --restore-mark
$IPTABLES  -t mangle -A PREROUTING -i $IF2 -m state --state NEW -j CONNMARK --set-mark 6
$IPTABLES  -t mangle -A OUTPUT -j CONNMARK --restore-mark

и так

Код: Выделить всё

#$IPTABLES -t mangle -A INPUT -i $IF1 -j CONNMARK --set-mark 5
#$IPTABLES -t mangle -A OUTPUT -m connmark --mark 5 -j MARK --set-mark 5
#$IPTABLES -t mangle -A INPUT -i $IF2 -j CONNMARK --set-mark 6
#$IPTABLES -t mangle -A OUTPUT -m connmark --mark 6 -j MARK --set-mark 6


$IF1 и $IF2 это сетевые которые смотрят в инет , два провайдер
Но все равно , когда клиент подключается по рдп, смотря через iptraf , видно что все нормально , через минут 10-15 запросы назад , начинают ломиться через втрого провайдера , и из за этого отваливается сессия.
Подскажите плиз где не правильно делаю ?Сгорела железка, пока ее нету нужно хоть так настроить , обещают убить если не сделаю ((
Gentoo 2014

Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: ip route балансировка

Сообщение sash-kan »

Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
xtty
Сообщения: 182
Статус: Развожу чертенков и пингвинов
ОС: Linux

Re: ip route балансировка

Сообщение xtty »

Уже решил , спасибо всем .
Сделал все просто , добавил аллиас на каждый сервер , на который идет днат и все исходящие соединения маркировал и на iproute .
Позже выложу готовые скрипты , все работает уже второю неделю без проблем.
Gentoo 2014

Спасибо сказали:
ALexhha
Сообщения: 109

Re: ip route балансировка

Сообщение ALexhha »

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

это называется Policy Base Routing

http://www.opennet.ru/docs/RUS/LARTC/x348.html

Позже выложу готовые скрипты , все работает уже второю неделю без проблем.

интересно было бы посмотреть, сейчас у самого такая проблема
Спасибо сказали:
Аватара пользователя
xtty
Сообщения: 182
Статус: Развожу чертенков и пингвинов
ОС: Linux

Re: ip route балансировка

Сообщение xtty »

Исправил первый пост , отредактировал все скрипты на рабочию схему .
Gentoo 2014

Спасибо сказали:
ALexhha
Сообщения: 109

Re: ip route балансировка

Сообщение ALexhha »

А разве при использовании

ip route add default scope global nexthop via $P1 dev $IF1 weight $W1 nexthop via $P2 dev $IF2 weight $W2

надо менять default gw при падении основного канала?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: ip route балансировка

Сообщение IMB »

Надо, если только не хотите "тормозов" сети. Сам сегодня наблюдал подобное, только я использую использую каналы в соотношении 3:1.
Спасибо сказали:
ALexhha
Сообщения: 109

Re: ip route балансировка

Сообщение ALexhha »

Т.е. как я понял, эта команда распределяет нагрузку примерно поровну, если доступны оба канала?
Спасибо сказали: