electro_ Posted February 8, 2016 (edited) всем спасибо Edited February 9, 2016 by electro_ Share this post Link to post Share on other sites More sharing options...
vop Posted February 8, 2016 Второй дефолт поднимается с метрикой, больше 1 ip ro add default via 194.44.239.73 dev eth0.1365 ip ro add default via 194.44.6.65 dev eth1.1368 metric 2 Первый можно прописать через gateway в самом начале. Share this post Link to post Share on other sites More sharing options...
[anp/hsw] Posted February 8, 2016 Дефолты переключаться так не будут (точнее будут, но если шлюз перестанет отвечать на ARP-запросы), т.е. это не полноценное резервирование. Еще могут переключиться, если физически линк пропадет на интерфейсе, но это не ваш случай (при vlan не сработает, он всегда UP). Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted February 8, 2016 Примите фул вью об обоих операторов? Нафига эта свистопляска с горожением костылей и сомнительными схемами фейлавера? Лучшая схема фейлавера, что я видел в своей жизни - это принятый BGP Full view. Share this post Link to post Share on other sites More sharing options...
electro_ Posted February 8, 2016 ' timestamp='1454944047' post='1239203']Дефолты переключаться так не будут (точнее будут, но если шлюз перестанет отвечать на ARP-запросы), т.е. это не полноценное резервирование. Еще могут переключиться, если физически линк пропадет на интерфейсе, но это не ваш случай (при vlan не сработает, он всегда UP). В чем прикол, что эта схема не работает, когда гасится первый дефолт, второй не подхватывает Share this post Link to post Share on other sites More sharing options...
[anp/hsw] Posted February 8, 2016 А как вы его гасите? Вы в курсе, что по-хорошему еще conntrack надо очистить? Share this post Link to post Share on other sites More sharing options...
electro_ Posted February 8, 2016 ' timestamp='1454944371' post='1239208']А как вы его гасите? Вы в курсе, что по-хорошему еще conntrack надо очистить? Вытащил кабель. Нет пинга -- переход на второй шлюз, вот что мне нужно. conntrack - iptables не использую Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted February 8, 2016 Блин, B-G-P! Ставите препенд на входящий трафик для бэкап провайдера. Ставите препенд на исходящий трафик на маршруты через бэкап провайдера. Как только основной сдохнет, входящий _автоматом_ полетит на вас. А исходяший полетит через нескоько секунду - как только отвалятся лучшие маршруты. Share this post Link to post Share on other sites More sharing options...
electro_ Posted February 8, 2016 (edited) Примите фул вью об обоих операторов? Нафига эта свистопляска с горожением костылей и сомнительными схемами фейлавера? Лучшая схема фейлавера, что я видел в своей жизни - это принятый BGP Full view. ДА, принимаю Full view, оператов один, два канала, один Киев, второй резерв Львов. Каким образом сие чудо сконфигурировать ? Блин, B-G-P! Ставите препенд на входящий трафик для бэкап провайдера. Ставите препенд на исходящий трафик на маршруты через бэкап провайдера. Как только основной сдохнет, входящий _автоматом_ полетит на вас. А исходяший полетит через нескоько секунду - как только отвалятся лучшие маршруты. Да, простите, но я не очень силен в БГП. Можете на это примере соорудить конфиг, а его волью и на стенде потестирую. Буду очень благодарен. Я так понял BGP дает работать без дефолтных маршутов ? или мне на сервере нужно принимать 2 дефолта ? Edited February 8, 2016 by electro_ Share this post Link to post Share on other sites More sharing options...
Hawk128 Posted February 8, 2016 Ну и что что один пров, стыка то два. Они независимые. Не вижу проблемы резервировать через БГП. У самого сейчас есть линк с двумя каналами от одного прова - 2 сессии БГП. Все прекрасно работает. Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted February 8, 2016 BGP может работать в двух режимах (условно) - 1) default 2) full view. При фул вью вы получаете таблицу маршрутов всего интернета, которые видны через данного аплинка при дефалте - 1 путь. Пример дать не могу, у вас же итак BGP настроен, просто примите full view от обоих (обычно нужно написать/позвонить оператору) и посмотрите, что будет. Самое страшное что случится - вольется трафик на бэкап канал. Ну и памяти чтобы на машине было хотя бы гигабайта два, а-то не влезет :) Share this post Link to post Share on other sites More sharing options...
kayot Posted February 8, 2016 pavel.odintsov И на кой ему для 1 ноги фуллвью? :) Share this post Link to post Share on other sites More sharing options...
electro_ Posted February 9, 2016 pavel.odintsov И на кой ему для 1 ноги фуллвью? :) У всех когда то бывает первый раз :) Share this post Link to post Share on other sites More sharing options...
kayot Posted February 9, 2016 electro_ Это как младенцу презерватив вручить, когда-то пригодится :) Share this post Link to post Share on other sites More sharing options...
electro_ Posted February 9, 2016 electro_ Это как младенцу презерватив вручить, когда-то пригодится :) -j DROP Share this post Link to post Share on other sites More sharing options...
trksergey Posted February 11, 2016 (edited) Возможно подойдет следующий вариант (Ubuntu 14) Нужно добавить две дополнительные таблицы роутинга (по одной для каждого провайдера) в файл /etc/iproute2/rt_tables # cat /etc/iproute2/rt_tables 1 provider1 2 provider2 У каждого провайдера будет своя таблица маршрутизация. Запускаем по крону (5 минут) следующий скрипт. #!/bin/bash ############################################# # CONFIG # ############################################# ## IP CONFIG ################################ ### LAN LAN_IF="em2" LAN_NETWORK="10.0.0.0/8" ### WAN 1 DORIS WAN1_IF="em1.3" WAN1_IP="ххх.ххх.ххх.174" WAN1_GATEWAY="ххх.ххх.ххх.173" WAN1_NETWORK="ххх.ххх.ххх.172/30" ### WAN 2 EVROTEL WAN2_IF="em1.4" WAN2_IP="ххх.ххх.ххх.174" WAN2_GATEWAY="ххх.ххх.ххх.173" WAN2_NETWORK="ххх.ххх.ххх.172/30" # IP ROUTE TABLES WAN1_ROUTE_TABLE="provider1" WAN2_ROUTE_TABLE="provider2" ## IP PING HOSTS ############################# PING_HOSTS="8.8.8.8 77.88.8.1" PING_COUNT=3 PING_MAX_LOSS=2 PING_OPT="-c$PING_COUNT -s 100 -W5 -i1 -I" ## DIRECTORY ################################ # полный путь до скрипта ABSOLUTE_FILENAME=`readlink -e "$0"` # каталог в котором лежит скрипт DIRECTORY=`dirname "$ABSOLUTE_FILENAME"` ## STATUS FILE FILE_STATUS="${DIRECTORY}/status.dat" ## IPTABLES IPTABLES_COMMON="${DIRECTORY}/iptables/common.sh" IPTABLES_WAN1="${DIRECTORY}/iptables/wan1.sh" IPTABLES_WAN2="${DIRECTORY}/iptables/wan2.sh" IPTABLES_BOTH="${DIRECTORY}/iptables/both.sh" ## ROUTE ROUTING="${DIRECTORY}/routing.sh" ## "WHITE" IP REALIP="${DIRECTORY}/iptables/realip.sh" REALIP_LIST="${DIRECTORY}/realip.list" ############################################# # VAR # ############################################# ## FILE VAR VAR_FILE_AUTO_SW=1 # enable auto switch VAR_FILE_PING_HOST=0 # not testing hosts VAR_FILE_IF1=1 # interface 1 up VAR_FILE_IF2=1 # interface 2 up VAR_FILE_STATUS=3 # load iptables for both inteface ## TESTING TEST_RESULT=0 # testing host, return code 0 - not work; 1 - int 1; 2 - int 2; 3 - work both TEST_WAN1_IFUP=1 # interface 1 up TEST_WAN2_IFUP=1 # interface 2 up ############################################# # FUNCTION # ############################################# # log "message" function log() { DATE=$(date +"%d-%m-%y %H:%M:%S"); LOG_FILE="${DIRECTORY}/sw.log"; echo "$DATE | $1" >> $LOG_FILE return 0 } ############ lock ########################### LOCK_FILE=${DIRECTORY}/sw.lock if [ -e $LOCK_FILE ] then PID=`cat $LOCK_FILE` PID_NAME=`ps -p $PID -o comm=` if [ ! -z $PID_NAME ] then log "[ERR] The script $0 is found in the list of processes"; exit -1; else log "[WARNING] Discovered lock-file with a non-existent ID process" rm $LOCK_FILE fi fi echo $$ > $LOCK_FILE ######### end lock ######################### # FILE VAR ################################ # Structure file # AUTO:HOSTS:IF1:IF2:STATUS function load() { while IFS=: read F_AUTO F_HOSTS F_IF1 F_IF2 F_STATUS do VAR_FILE_AUTO_SW=$F_AUTO; VAR_FILE_PING_HOST=$F_HOSTS; VAR_FILE_IF1=$F_IF1; VAR_FILE_IF2=$F_IF2; VAR_FILE_STATUS=$F_STATUS; done < $FILE_STATUS } function save() { echo "$VAR_FILE_AUTO_SW:$VAR_FILE_PING_HOST:$VAR_FILE_IF1:$VAR_FILE_IF2:$VAR_FILE_STATUS" > $FILE_STATUS } function resetif() { load; VAR_FILE_AUTO_SW=1; VAR_FILE_PING_HOST=1; VAR_FILE_IF1=2; VAR_FILE_IF2=2; VAR_FILE_STATUS=4; echo "$VAR_FILE_AUTO_SW:$VAR_FILE_PING_HOST:$VAR_FILE_IF1:$VAR_FILE_IF2:$VAR_FILE_STATUS" > $FILE_STATUS log "--RESET CONFIG--" } # config to log configtolog() { log "Auto=${VAR_FILE_AUTO_SW} Hosts=${VAR_FILE_PING_HOST} Doris=${VAR_FILE_IF1} Evrotel=${VAR_FILE_IF2} Iptables=${VAR_FILE_STATUS}"; } ## PING ############################################## # lping interface host function lping() { status=`ping $PING_OPT $1 $2 | grep "packet loss" | awk '{print $1-$4}'` if [ $status -lt $PING_MAX_LOSS ]; then echo 1 else echo 0 fi } # testing gateway provider function tprovider() { TEST_WAN1_IFUP=$(lping $WAN1_IF $WAN1_GATEWAY) TEST_WAN2_IFUP=$(lping $WAN2_IF $WAN2_GATEWAY) #log "Test provider wan1=$TEST_WAN1_IFUP ; wan2=$TEST_WAN2_IFUP " } # tetsting hosts # work on both interface only load route both interface function thosts() { # succeful ping in interfaces PING_IF1=0 PING_IF2=0 # number ping hosts NUM_HOST=0 for HOST_UP in $PING_HOSTS do if (( $TEST_WAN1_IFUP == 1 )); then PING_IF1=$(( $PING_IF1 + $(lping $WAN1_IF $PING_HOSTS) )) fi if (( $TEST_WAN2_IFUP == 1 )); then PING_IF2=$(( $PING_IF2 + $(lping $WAN2_IF $PING_HOSTS) )) fi NUM_HOST=$(($NUM_HOST+1)) done #log "Host test Doris=${PING_IF1} Evrotel=${PING_IF2}"; # result if (( ($PING_IF1 > 0) || ($PING_IF2 > 0) )); then # interface enable if (( (($PING_IF1 == $NUM_HOST) && ($PING_IF2 == $NUM_HOST)) || ($PING_IF1 == $PING_IF2) )); then # turn on both intrerface echo 3 elif (( $PING_IF1 > $PING_IF2 )); then # turn on interface 1 echo 1 else # turn on interface 2 echo 2 fi else # interface not on echo 0 fi } # manual turn on inteface function onWAN1 () { log "Turn on onWAN1 (хххх) interface" source $ROUTING ip route delete default ip route add default via $WAN1_GATEWAY dev $WAN1_IF source $IPTABLES_WAN1 TEST_RESULT=1 VAR_FILE_STATUS=1 log "Turn on WAN1 finish" } function onWAN2 () { log "Turn on onWAN2 (хххх) interface" source $ROUTING ip route delete default ip route add default via $WAN2_GATEWAY dev $WAN2_IF source $IPTABLES_WAN2 TEST_RESULT=2 VAR_FILE_STATUS=2 log "Turn on WAN2 finish" } function onBOTH() { log "Turn on both interface (хххх + хххх)" source $ROUTING ip route delete default ip route add default scope global nexthop via $WAN1_GATEWAY dev $WAN1_IF weight 1 nexthop via $WAN2_GATEWAY dev $WAN2_IF weight 1 source $IPTABLES_BOTH TEST_RESULT=3; VAR_FILE_STATUS=3 log "Turn on BOTH finish" } # AUTO #################################### function auto_sw() { load; # Выводим данные о начальных данных #configtolog; # Тестируем интерфейсы tprovider; if (( ( $TEST_WAN1_IFUP == 1 ) || ( $TEST_WAN2_IFUP == 1 ) )); then # Если работает хоть один интерфейс if (( ($TEST_WAN1_IFUP != $VAR_FILE_IF1) || ($TEST_WAN2_IFUP != $VAR_FILE_IF2) )); then # Если изменилось состояние одного из интерфейса log "Interface changes"; # Сохраняем данные о интерфейсах VAR_FILE_IF1=$TEST_WAN1_IFUP; VAR_FILE_IF2=$TEST_WAN2_IFUP; if (( ($TEST_WAN1_IFUP == 1) && ($TEST_WAN2_IFUP == 1) )); then # Если включились оба интервейса log "WAN1 and WAN2 to UP" if (( $VAR_FILE_PING_HOST == 1 )); then #log "Enable check host" onBOTH; #ip route delete default #ip route add default scope global nexthop via $P1 dev $IF1 weight $W1 nexthop via $P2 dev $IF2 weight $W2 else log "Fast switch - BOTH" onBOTH; fi else # Если включился только один интерфейс if (( $TEST_WAN1_IFUP == 1 )); then log "Fast switch - WAN1 (хххх)" onWAN1; else log "Fast switch - WAN2 (хххх)" onWAN2; fi fi fi # host testing if (( ($VAR_FILE_PING_HOST == 1) && ($TEST_WAN1_IFUP == 1) && ($TEST_WAN2_IFUP == 1) )); then TEST_RESULT=$(thosts); #log "debug ${TEST_RESULT} ${VAR_FILE_STATUS}" if (( $TEST_RESULT != $VAR_FILE_STATUS )); then log "Host changes ${TEST_RESULT}" case $TEST_RESULT in 1) onWAN1;; 2) onWAN2;; *) onBOTH; VAR_FILE_STATUS=$TEST_RESULT; ;; esac fi fi else # Выключенны оба информацию log "DOWN BOTH INTERFACE!!!" onBOTH; VAR_FILE_AUTO_SW=1; VAR_FILE_IF1=2; VAR_FILE_IF2=2; VAR_FILE_STATUS=4; TEST_RESULT=0; fi save; } ############################################# # Command # ############################################# # echo enable params function echo_help() { echo " " echo "[input params]" echo "--------------------------" echo "-start) reset and start" echo "-wan1) switch provider 1 (хххх). auto=off" echo "-wan2) switch provider 2 (хххх). auto=off" echo "-all) switch both provider. auto=off" echo "-hosts) on check hosts and -nohosts) off check hosts" echo "-auto) auto switch only else auto=on" echo "-t) test" echo "-a) set auto" return 0 } if [ $# = 0 ]; then echo_help exit 0 else load; case $1 in -wan1) #switch if1; VAR_FILE_AUTO_SW=0; #log "Console switch if1." log "[OFF] Auto mode" onWAN1; save; ;; -wan2) #switch if2; VAR_FILE_AUTO_SW=0; #log "Console switch if2" log "[OFF] Auto mode" onWAN2; save; ;; -all) #Switch all if; VAR_FILE_AUTO_SW=0; #log "Console switch both" log "[OFF] Auto mode" onBOTH; save; ;; -start) # Start log ">>> START >>>"; onBOTH; VAR_FILE_AUTO_SW=1; save; resetif; auto_sw; ;; -auto) #AUTO TESTING if (( $VAR_FILE_AUTO_SW == 1 )); then auto_sw; else log "[ERR] Auto switch DISABLE - auto mode off"; fi ;; -t) # Set auto mode #log "Test"; tprovider; ;; -a) # Set auto mode log "Console on auto mode"; VAR_FILE_AUTO_SW=1; save; resetif; ;; -hosts) # Set on check hosts log "[ON ] check hosts"; VAR_FILE_PING_HOST=1; save; #resetif; ;; -nohosts) # Set off check hosts log "[OFF] check hosts"; VAR_FILE_PING_HOST=0; save; #resetif; ;; -d) # Set off check hosts log "Debug"; tprovider; TEST_RESULT=$(thosts); echo "debug ${TEST_RESULT}" #resetif; ;; *) echo "Error command"; log "ERROR Console command" echo_help; ;; esac fi ########### delete lock ################# rm $LOCK_FILE exit 0; routing.sh #!/bin/bash # Clear route table ip route flush table $WAN1_ROUTE_TABLE > /dev/null 2>&1 ip route flush table $WAN2_ROUTE_TABLE > /dev/null 2>&1 # Create route table ip route add $WAN1_NETWORK dev $WAN1_IF src $WAN1_IP table $WAN1_ROUTE_TABLE > /dev/null 2>&1 ip route add default via $WAN1_GATEWAY table $WAN1_ROUTE_TABLE > /dev/null 2>&1 ip route add $WAN2_NETWORK dev $WAN2_IF src $WAN2_IP table $WAN2_ROUTE_TABLE > /dev/null 2>&1 ip route add default via $WAN2_GATEWAY table $WAN2_ROUTE_TABLE > /dev/null 2>&1 ip route add $WAN1_NETWORK dev $WAN1_IF src $WAN1_IP > /dev/null 2>&1 ip route add $WAN2_NETWORK dev $WAN2_IF src $WAN2_IP > /dev/null 2>&1 ip route add default via $WAN1_GATEWAY > /dev/null 2>&1 ip rules add from $WAN1_IP table $WAN1_ROUTE_TABLE > /dev/null 2>&1 ip rules add from $WAN2_IP table $WAN2_ROUTE_TABLE > /dev/null 2>&1 ip route add $LAN_NETWORK dev $LAN_IF table $WAN1_ROUTE_TABLE > /dev/null 2>&1 ip route add $WAN2_NETWORK dev $WAN2_IF table $WAN2_ROUTE_TABLE > /dev/null 2>&1 ip route add 127.0.0.1/8 dev lo table $WAN1_ROUTE_TABLE > /dev/null 2>&1 ip route add $LAN_NETWORK dev $LAN_IF table $WAN2_ROUTE_TABLE > /dev/null 2>&1 ip route add $WAN1_NETWORK dev $WAN1_IF table $WAN2_ROUTE_TABLE > /dev/null 2>&1 ip route add 127.0.0.1/8 dev lo table $WAN2_ROUTE_TABLE > /dev/null 2>&1 # Set rules for mark trafic ip rule add fwmark 10 table $WAN1_ROUTE_TABLE 2>&1 ip rule add fwmark 20 table $WAN2_ROUTE_TABLE 2>&1 source $IPTABLES_COMMON; ip route delete default ip route add default scope global nexthop via $WAN1_GATEWAY dev $WAN1_IF weight 1 \ nexthop via $WAN2_GATEWAY dev $WAN2_IF weight 1 status.dat 1:1:1:1:3 common.sh #!/bin/bash # Start config iptables # Enable forward echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/ip_dynaddr echo 1 > /proc/sys/net/ipv4/conf/default/forwarding #CLEAR IPTABLE ########################## iptables -F iptables -F -t nat iptables -t mangle -F iptables -X #DEFAULT POLICE ########################## iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT #LOCALHOST INTERFACE ##################### iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #OUT SERVICE ############################# #SSH iptables -A INPUT -i ${LAN_IF} -s ${LAN_NETWORK} -p TCP --dport 22 -j ACCEPT iptables -A INPUT -i ${WAN1_IF} -p TCP --dport 22 -j DROP iptables -A INPUT -i ${WAN2_IF} -p TCP --dport 22 -j DROP #PING iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A OUTPUT -p icmp -j ACCEPT #BLACKLIST iptables -A FORWARD -m set --match-set blacklist src -j DROP iptables -t nat -A PREROUTING -s ${LAN_NETWORK} -m set --match-set blacklist dst -p tcp -m tcp --dport 80 -j REDIRECT --to-port 3128 iptables -A INPUT -i ${LAN_IF} -s ${LAN_NETWORK} -j ACCEPT wan1.sh #!/bin/bash #LOCAL INTERFACE ######################### # LOAD REAL IP source $REALIP; # Marking trafic # mark 10 - ххххх trafic iptables -t mangle -A PREROUTING -s 10.0.0.0/20 ! -d 10.0.0.0/20 -j MARK --set-mark 10 # OUT trafic iptables -t nat -A POSTROUTING -m mark --mark 10 -j SNAT --to-source ххх.ххх.ххх.65-ххх.ххх.ххх.94 --persistent wan2.sh #!/bin/bash # Load iptables #LOCAL INTERFACE ######################### # Marking trafic # mark 20 - Evrotel trafic iptables -t mangle -A PREROUTING -s 10.0.0.0/20 ! -d 10.0.0.0/20 -j MARK --set-mark 20 # OUT trafic iptables -t nat -A POSTROUTING -m mark --mark 20 -j SNAT --to-source ${WAN2_IP} both.sh #!/bin/bash log "start iptables both" # Load iptables #LOCAL INTERFACE ######################### # LOAD REAL IP source $REALIP; # Marking trafic # mark 10 - ххх trafic # mark 20 - yyy trafic iptables -t mangle -A PREROUTING -s 10.0.0.0/255.255.240.1 -j MARK --set-mark 10 iptables -t mangle -A PREROUTING -s 10.0.0.1/255.255.240.1 -j MARK --set-mark 20 # OUT trafic iptables -t nat -A POSTROUTING -m mark --mark 10 -j SNAT --to-source xxx.xxx.xxx.65-xxx.xxx.xxx.94 --persistent #{WAN1_IP} iptables -t nat -A POSTROUTING -m mark --mark 20 -j SNAT --to-source ${WAN2_IP} sudo crontab -e */5 * * * * sudo /etc/script/sw/sw.sh -auto Директории sw/ - корневой каталог - iptables/ - каталог с настройками iptables | common.sh - iptables для всех интерфейсов | wan1.sh - iptables для ххх | wan2.sh - iptables для yyy | both.sh - iptables для балансировки нагрузки, работают два канала | realip.sh - скрипт выдачи белых ip адресов nat 1-1 | sw.sh - главный файл и конфигурация | sw.log - логи | routing.sh - создает маршруты для интерфейсов | status.dat - в файле сохраняются данные о состояние интерфейсов между запуском скрипта В скрипте добавьте свои настройки и проверьте скрипт - выдран с рабочего сервера с обвязкой. Есть одна особенность работы при тестирование внешних ip - "check hosts on", не шлюзов - он переключается при потери более 2/3 пакетов и не переключается обратно при восстановлении, только если на активном канале пропадет интернет. Поэтому необходимо раз в сутки по крону перезапускать скрипт - 2 3 * * * sudo /dir/sw.sh -start; Если у Вас на шлюзе не стоит dns и т.п., то выше указанная проблема исправляться удаление строки в скрипте ip route add default scope global nexthop via $WAN1_GATEWAY dev $WAN1_IF weight 1 nexthop via $WAN2_GATEWAY dev $WAN2_IF weight 1 В этом варианте при пропадание одного из каналов на шлюзе будут нестабильно работать софт, потеря пакетов. Edited February 11, 2016 by trksergey Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted February 11, 2016 pavel.odintsov И на кой ему для 1 ноги фуллвью? :) Можно и без фул вью :) Я просто такое с фул вью делал, потому что у меня 3 аплинка и они всегда все active. С дефалтами просто не особо понятно, как их квагга в роут таблицу линукса запихает. Но решать задачу нужно силами BGP, пусть с приемом только дефалта, а не наколенных скриптов. Люди думали, писали, корректировали протокол в котором учтено все, что нужно учесть для роутинга. Нет, блин, все равно у всех желание написать чудо скрпит там, где 1) он сделает хуже 2) он сделает точку отказа. Share this post Link to post Share on other sites More sharing options...