Автор Тема: Loadbalancing s rutirane na realni IP-ta  (Прочетена 2532 пъти)

nikec

  • Участници
  • ***
  • Публикации: 3
    • Профил
Loadbalancing s rutirane na realni IP-ta
« -: Jul 20, 2009, 16:37 »
От 3 седмици се опитвам да подкарам един loadbalancing - изчетах доста форуми гооглета и др. инфо но не мога да се справя.

Положението е следното: Влизат два интернета на отделни лан карти и още една лан карта разделена на два интерфейса за вътрешните реални IP-та и за останалите PC-ta с нереални IP-ta. И проблема е в това че няколко от вътрешните PC-ta  са с рални IP-ta  Когато пусна loadbalancing-а  вътрешните реални IP-ta ту имат нет за няколко минути ту нямат.. и така се редува на интервали от по няколко минути...  Останалите които не са с реални IP-ta си имат нет и доколкото виждам балансинга за тях си бачка.

Конфигурацията е следната:
------------------------------------------------
## Local dev --> za vytre6nite realni IP-ta
eth0
IP - 217.79.82.209/29
-----------------------------------------------
## Local dev --> za obiknovennite PC-ta
eth0:1
IP - 192.168.1.1/24
-----------------------------------------------
## Public dev 1 -> Telecoms
eth1
IP - 217.79.86.230/30
GW - 217.79.86.229
------------------------------------------------
## Public dev 2 -> BTC
eth2
IP - 192.168.4.2/24
GW - 192.168.4.1
-----------------------------------------------

Още инфо:
# OS --> CentOS release 5.2 (Final)
# kernel --> 2.6.18-92.el5


##############################################
Скрипта който ползвам е :

#!/bin/bash
#------------------------------
#------------------------------
### REALNITE IP-ta:
REAL_LAN_NET=10.10.10.0/24
#------------------------------
### LOCALNITE IP-ta:
LAN_IF=eth2
LAN_IP=10.10.20.1
LAN_NET=10.10.20.0/24
#------------------------------
### MAIN INTERNET: TELECOMS
INET1_IF=eth0
INET1_IP=3.3.3.77
INET1_NET=3.3.3.0/24
INET1_GW=3.3.3.2
#------------------------------
### SECOND INTERNET: BTC
INET2_IF=eth1
INET2_IP=192.168.10.109
INET2_NET=192.168.10.0/24
INET2_GW=192.168.10.1
#------------------------------
echo "1" > /proc/sys/net/ipv4/ip_forward

/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_nat_irc

IPTABLES=/sbin/iptables

$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t filter -F
$IPTABLES -t filter -X keep_state
$IPTABLES -t nat -X keep_state

$IPTABLES -t filter -N keep_state
$IPTABLES -t filter -A keep_state -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -t filter -A keep_state -j RETURN
$IPTABLES -t nat -N keep_state
$IPTABLES -t nat -A keep_state -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -t nat -A keep_state -j RETURN

$IPTABLES -t nat -A PREROUTING -j keep_state
$IPTABLES -t nat -A POSTROUTING -j keep_state
$IPTABLES -t nat -A OUTPUT -j keep_state
$IPTABLES -t filter -A INPUT -j keep_state
$IPTABLES -t filter -A FORWARD -j keep_state
$IPTABLES -t filter -A OUTPUT -j keep_state

/sbin/ip rule del prio 50 table main
/sbin/ip rule add prio 50 table main
/sbin/ip route del default table main

/sbin/ip rule del prio 201 from $INET1_NET table 201
/sbin/ip rule add prio 201 from $INET1_NET table 201
/sbin/ip route add default via $INET1_GW dev $INET1_IF \
            src $INET1_IP proto static table 201
/sbin/ip route append prohibit default table 201 metric 1 proto static
           
/sbin/ip rule del prio 202 from $INET2_NET table 202
/sbin/ip rule add prio 202 from $INET2_NET table 202
/sbin/ip route add default via $INET2_GW dev $INET2_IF \
            src $INET2_IP proto static table 202
/sbin/ip route append prohibit default table 202 metric 1 proto static
   
/sbin/ip rule del prio 222 table 222
/sbin/ip rule add prio 222 table 222
/sbin/ip route add default table 222 proto static \
            nexthop via $INET1_GW dev $INET1_IF \
            nexthop via $INET2_GW dev $INET2_IF

$IPTABLES -t nat -A POSTROUTING -o $INET1_IF -s $LAN_NET -j SNAT --to-source $INET1_IP
$IPTABLES -t nat -A POSTROUTING -o $INET2_IF -s $LAN_NET -j SNAT --to-source $INET2_IP
$IPTABLES -t nat -A POSTROUTING -o $INET1_IF -s $REAL_LAN_NET -j SNAT --to-source $INET1_IP

###############################################################



Не мога да разбера къде е проблема ..

Благодаря на всеки който отдели от времето си за да помогне
Активен

plamen_f

  • Напреднали
  • *****
  • Публикации: 1246
    • Профил
Re: Loadbalancing s rutirane na realni IP-ta
« Отговор #1 -: Jul 20, 2009, 17:51 »
Винаги когато тръгна да усложнявам нещата попадам в каша. Струва ми се, че и ти си в такава  :)
Опита ми ме е научил да не откривам топлата вода - много преди мен е открита.

На няколко пъти във форума става дума за проблеми като твоя.
Моята препоръка - погледни http://www.pfsense.com/ - уверявам те работи леко и безупречно.

Активен

nikec

  • Участници
  • ***
  • Публикации: 3
    • Профил
Re: Loadbalancing s rutirane na realni IP-ta
« Отговор #2 -: Jul 20, 2009, 23:48 »
Винаги когато тръгна да усложнявам нещата попадам в каша. Струва ми се, че и ти си в такава  :)
Опита ми ме е научил да не откривам топлата вода - много преди мен е открита.

На няколко пъти във форума става дума за проблеми като твоя.
Моята препоръка - погледни http://www.pfsense.com/ - уверявам те работи леко и безупречно.

Благодаря за предложението, но предпочитам да не сменям ОС.
На този етап имам по-добро предложение от един познат, който предложи просто да добавя следните редове:

ip route add 217.79.82.208/29 via 217.79.86.229
ip route add 217.79.82.208/29 via 217.79.86.229 table 201
ip route add 217.79.82.208/29 via 217.79.86.229 table 202
ip route add 217.79.82.208/29 via 217.79.86.229 table 222

В момента тествам как се държи така рутера -- предполагам до утре ще стане ясно и ще пиша какво се е случило.

Активен

nihat

  • Участници
  • ***
  • Публикации: 3
    • Профил
Re: Loadbalancing s rutirane na realni IP-ta
« Отговор #3 -: Aug 04, 2009, 17:04 »
Винаги когато тръгна да ..................

Благодаря за предложението, но ..........

За сега нямам резултат - тестовете продължават ...!
Ако има някой който да е постигнал или знае как да постигне това което целя, моля да помогне.
Активен

ntrance

  • Напреднали
  • *****
  • Публикации: 696
    • Профил
Re: Loadbalancing s rutirane na realni IP-ta
« Отговор #4 -: Aug 04, 2009, 17:14 »
Ако бяхте погленали ... по добре с този форум съм побликувал скрипт за load balancing  потърсете го

Причината  няколко минути да имат  и няколко минути да нямат , че  дефакто се сменят gateway .. имам в предид единия не ти работи както трябва , понеже той ги сменя ... ако ползваш нет 1.1.1.1 след 2 минути  може да ползваш 2222  ....  виж скрипта който съм постнал сега неми се тарси пак ... а реалните  ип лесна работа прекарай  ги през нат с  iptables ...
« Последна редакция: Aug 04, 2009, 17:18 от ntrance »
Активен

ntrance

  • Напреднали
  • *****
  • Публикации: 696
    • Профил
Re: Loadbalancing s rutirane na realni IP-ta
« Отговор #5 -: Aug 04, 2009, 17:20 »
Намерих го

root@dalkia-server:/etc/network# cat routing
# Mandatory variables
TABLE1=1 # The TABLE ID associated to your 1st ISP
  IF1=eth1 # The NIC name connected to your 1st ISP
  GW1=192.168.121.1 # 1st or Default Internet Service Provider Gateway (Router IP Address)

TABLE2=2 # The TABLE ID associated to your 2th ISP
  IF2=eth0 # The NIC name connected to your 2th ISP
  GW2=192.168.0.169 # 2th Internet Server Provider Gateway (Router IP Address)

#TABLE2=n # The TABLE ID associated to your n.. ISP # This line is an example
#   IF2=ethn # The NIC name connected to your n... ISP # This line is an example
#   GW2=192.168.nnn.nnn # n... Internet Provider Gateway # This line is an example

izbalancing() {
# Command Syntax: $1 "InterfaceName" "TableID" "IPDefaultGateway"
# Add a Command line for any external internet connection
$1 $IF1 $TABLE1 $GW1
$1 $IF2 $TABLE2 $GW2
#$1 $IFn $TABLEn $GWn # This line is an example

if [ "$1" = "start" ]
  then
    # Misc
    $IP route del default
    $IP route add default equalize nexthop via $GW1 nexthop via $GW2
    #$IP route add default equalize nexthop via $GW1 nexthop via $GW2 nexthop via $GWn # ...so on...

## NOTE!!
# You must execute the following iptables rules if you want act as Load Balanced/MultiHomed GNU/Linux Firewall
# > mangle table <
$IPTABLES -t mangle -A PREROUTING  -p ALL -j CONNMARK --restore-mark


$IPTABLES -t mangle -A PREROUTING  -p ALL -i $IF1 -m mark --mark 0 -j MARK --set-mark $TABLE1
$IPTABLES -t mangle -A PREROUTING  -p ALL -i $IF2 -m mark --mark 0 -j MARK --set-mark $TABLE2
# $IPTABLES -t mangle -A PREROUTING  -p ALL -i $IFn -m mark --mark 0 -j MARK --set-mark $TABLEn # This line is an example

$IPTABLES -t mangle -A POSTROUTING -p ALL -o $IF1 -m state --state NEW -j MARK --set-mark $TABLE1
$IPTABLES -t mangle -A POSTROUTING -p ALL -o $IF2 -m state --state NEW -j MARK --set-mark $TABLE2
# $IPTABLES -t mangle -A POSTROUTING -p ALL -o $IFn -m state --state NEW -j MARK --set-mark $TABLEn # This line is an example


$IPTABLES -t mangle -A POSTROUTING -p ALL         -m state --state NEW -j CONNMARK --save-mark

# > nat table <
$IPTABLES -t nat    -A POSTROUTING -p ALL -o $IF1 -m mark --mark $TABLE1 -j SNAT --to-source $(find_primary_ip $IF1)
$IPTABLES -t nat    -A POSTROUTING -p ALL -o $IF2 -m mark --mark $TABLE2 -j SNAT --to-source $(find_primary_ip $IF2)
# $IPTABLES -t nat    -A POSTROUTING -p ALL -o $IFn -m mark --mark $TABLEn -j SNAT --to-source $(find_primary_ip $IFn) # This line is an example
fi
}

# Default commands path
     IP=ip
IPTABLES=iptables


###############################################################################################
###############################################################################################
## CONFIGURATION IS OVER, DON'T EDIT ANYTHING BELLOW                                         ##
###############################################################################################
###############################################################################################

### $1 = Ethernet Interface Name
### $2 = Table Number
### $3 = Default Gateway

# Init default policies and variables
init() {
 # Enable fast failover of broken gateways links (this isn't a real failover)
 echo "10" > /proc/sys/net/ipv4/route/gc_timeout

 # Make this machine a Routing Machine(tm) :-)
 echo "1"  > /proc/sys/net/ipv4/ip_forward

 # Variables
 IF=$1
 TABLE=$2
 FWIP=$(find_primary_ip $IF)
 GWIP=$3

 #echo "Init: IF=$IF TABLE=$TABLE FWIP=$FWIP GWIP=$GWIP IP=$IP"
}

## STOP

# Stop izbalancing
stop() {
 init $1 $2 $3
 route_stop
 rule_stop
}

# Reset routing tables
route_stop() {
 # Flush whole routing table of current table
 if [ ! -z "$($IP route show table $TABLE)" ]
   then
     $IP route flush table $TABLE
 fi

 # Reset to default Single Gateway
 if [ ! -z "$GW1" ]
   then
     $IP route del default
     $IP route add default via $GW1
 fi
 # If you don't want to reset the routing cache every time you run this ******, comment the following line
 $IP route flush cache
}

# Reset rule tables
rule_stop() {
 # Flush whole rule table of current table (except for fwmark rules)
 $IP rule list | grep "lookup $TABLE" | grep -v "from all fwmark" | awk '{print $2" "$3" "$4" "$5" "$6" "$7}' $1 | while read RULE
   do
     $IP rule del $RULE
   done

 # Flush whole fwmark rule table of current table
 $IP rule list | grep "lookup $TABLE" | grep "from all fwmark" | awk '{print $4" "$5" "$6" "$7}' $1 | while read RULE
   do
     $IP rule del $RULE
   done
}

## START

# Start izbalancing Subsystem
start() {
 #echo "1 Before init ($1 $2 $3)"
 init $1 $2 $3
 #echo "2 Before stop ($1 $2 $3)"
 stop $1 $2 $3
 #echo "3 Before route_start ($1 $2 $3)"
 route_start
 #echo "4 Before rule_start ($1 $2 $3)"
 rule_start
}

route_start() {
 # Import from table 'default' to 'current table' the whole routing settings
 $IP route show table main | grep -Ev ^default | grep -Ev nexthop | while read ROUTE; do $IP route add table $TABLE $ROUTE; done
 # Add the default interface gateway to the current table
 $IP route add table $TABLE default via $GWIP
}

# Add iproute2 rules in current table
rule_start() {
 $IP rule add from   $FWIP  lookup $TABLE
 $IP rule add fwmark $TABLE lookup $TABLE

 for IP_ALIAS in $(find_secondary_ip $IF)
  do
    $IP rule add from $IP_ALIAS lookup $TABLE
  done
}

#########################################################
# Autodetect IP number of specified network interface
find_primary_ip() {
 if [ ! -z $1 ]
   then
     echo $($IP addr show $1 | grep 'inet' | grep -v ":" | awk '{print $2}' | sed -e 's/\/.*//')
 fi
}

find_secondary_ip() {
 if [ ! -z $1 ]
   then
     echo $($IP addr show $1 | grep 'inet' | grep "$1:" | awk '{print $2}' | sed -e 's/\/.*//')
 fi
}

###############################################################################################
## Valid ****** input from command line
case $1 in
   stop)
izbalancing stop
       ;;
   start)
izbalancing start
       ;;
   restart)
izbalancing start
       ;;
    *)
       echo "InitZero GNU/Linux Firewall/Router Incoming/Outgoing MultiHomed/LoadBalanced Subsystem"
       echo " < vsichko e nared>"
       echo "Version $VERSION"
       echo
       echo "Usage: $0 [OPTIONS]"
       echo
       echo "Available Options:"
       echo "       start,  Start the izbalancing subsystem"
       echo "        stop,  Stop the izbalancing subsystem"
       echo "     restart,  ReStart the izbalancing subsystem"
       echo
       echo "     example: $0 start"
       exit 0
esac

## The End
###############################################################################################.
root@dalkia-server:/etc/network#
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Problem s rutirane
Кошче
fichkata82 4 1763 Последна публикация Nov 10, 2007, 01:49
от edmon
Rutirane?
Кошче
ChochoD 11 3331 Последна публикация Mar 15, 2008, 13:44
от neter