The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Разделение трафика по разным каналам с помощью IPFW и NAT в связке с MPD (vpn balance ipfw freebsd)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: vpn, balance, ipfw, freebsd,  (найти похожие документы)
From: Sergey Rudenko <sergey_rudenko@bk.ru.> Newsgroups: email Date: Sun, 6 Oct 2006 17:02:14 +0000 (UTC) Subject: Разделение трафика по разным каналам с помощью IPFW и NAT в связке с MPD Разделение трафика по разным каналам с помощью IPFW и NAT в связке с MPD Дано: - Интерфейс который смотрит в локальную сеть ISP - Интерфейс который смотрит в локальную сеть - VPN аккаунт для подключения к UA-IX - VPN аккаунт для подключения к World Задача: Заспределять траффик между этими интерфейсами. То есть в Мир через Мир, в Украину через Украину ... Итак. Предполагается, что уже есть настроенный IPFW с поддержкой FWD. Пакеты будем пробрасывать через NAT. Настройка MPD По умолчанию установлен шлюз в локальную сеть провайдера mpd.conf default: load vpn load vpn2 vpn: # Настройки подключения к Украинскому VPN new -i ng0 vpn vpn set iface idle 0 set bundle authname "ua" set bundle password "pass" set iface up-script /usr/local/etc/mpd/io-up.sh set iface down-script /usr/local/etc/mpd/io-down.sh load all vpn2: # Настройки подключения к "Мировому" VPN new -i ng1 vpn2 vpn2 set iface idle 0 set bundle authname "world" set bundle password "pass" set iface up-script /usr/local/etc/mpd/up.sh set iface down-script /usr/local/etc/mpd/down.sh load all all: set bundle disable multilink set iface enable tcpmssfix set pptp disable windowing set link keep-alive 60 180 set link mtu 1500 set link accept chap set link no pap set bundle enable compression set ccp yes mppc set ccp yes mpp-e40 set ccp yes mpp-e128 set bundle enable crypt-reqd set ccp yes mpp-stateless set ipcp no vjcomp open mpd.links vpn: set link type pptp set pptp self 192.168.138.1 # Адрес с которого подключаемся к VPN set pptp peer 10.3.0.2 # Адрес Украинского VPN сервера set pptp enable originate incoming outcall vpn2: set link type pptp set pptp self 192.168.138.1 # Адрес с которого подключаемся к VPN set pptp peer 10.10.10.10 # Адрес "Мирового" VPN сервера set pptp enable originate incoming outcall io-up.sh #!/bin/sh /sbin/route add 10.3.0.2 192.168.138.254 # Добавляем маршрут к Украинскому VPN серверу /sbin/natd -a ua.ua.ua.ua -p 8672 # Запускаем НАТ на Украинский Выделеный адрес /sbin/natd -a 192.168.138.1 -p 8673 # Запускаем НАТ на адрес интерфейса смотрящего в локальную сеть провайдера io-down.sh В данной конфигурации пустой up.sh #!/bin/sh /sbin/route add 10.10.10.10 192.168.138.254 # Добавляем маршрут к "Мировому" VPN серверу /sbin/route add 10.3.0.2 192.168.138.254 # Добавляем маршрут к Украинскому VPN серверу /sbin/route change default wg.wg.wg.wg # Изменяем шлюз по умолчанию на шлюз в мир /sbin/natd -a w.w.w.w # Запускаем НАТ на "Мировой" адрес down.sh #!/bin/sh /sbin/route change default 192.168.138.254 # Изменяем шлюз по умолчанию на шлюз в локальную сеть провайдера /usr/bin/killall -9 natd # Прибиваем НАТ IPFW /etc/rc.firewall Здесь лишнее прибрано дабы не засорять понимание #!/bin/sh - if [ -z "${source_rc_confs_defined}" ]; then if [ -r /etc/defaults/rc.conf ]; then . /etc/defaults/rc.conf source_rc_confs elif [ -r /etc/rc.conf ]; then . /etc/rc.conf fi fi uaip="ua.ua.ua.ua" # Выделеный адрес в UA-IX uaif="ng0" # Интнрфейс в UA-IX uagw="uag.uag.uag.uag" # Gateway UA-IX wip="w.w.w.w" # Выделеный адрес в World wgw="wg.wg.wg.wg" # Gateway World wif="ng1" # Интерфейс World exip="192.168.138.1" # Адрес на интерфейсе смотрящем в сеть провайдера exgw="192.168.138.254" # Gateway ISP exif="rl1" # Интерфейс смотрящий в сеть провайдера loip="192.168.0.5" # Адрес на интерфейсе смотрящем в локальную сеть loif="rl0" # Интерфейс смотрящий в локальную сеть lonet="192.168.0.0/24" # Локальная сеть setup_loopback () { ${fwcmd} add 1 pass all from any to any via lo0 ${fwcmd} add 2 deny all from any to 127.0.0.0/8 ${fwcmd} add 3 deny ip from 127.0.0.0/8 to any } isp_nets () { ${fwcmd} table 7 flush ${fwcmd} table 7 add 192.168.6.1/32 ${fwcmd} table 7 add 192.168.6.3/32 ${fwcmd} table 7 add 192.168.50.30/32 ${fwcmd} table 7 add 192.168.50.168/32 ${fwcmd} table 7 add 192.168.6.86/32 ${fwcmd} table 7 add 192.168.50.193/32 ${fwcmd} table 7 add 192.168.8.192/32 ${fwcmd} table 7 add 192.168.4.88/32 ${fwcmd} table 7 add 192.168.45.6/32 ${fwcmd} table 7 add 192.168.6.47/32 ${fwcmd} table 7 add 192.168.12.57/32 } ${fwcmd} -f flush case ${firewall_type} in [Oo][Pp][Ee][Nn]) setup_loopback isp_nets # Заполняем 7 таблицу сетями провайдера /scripts/ipfwua.sh # Данный скрипт добавляет в 1 таблицу список Украинских сетей #Отбираем всё Украинское и запускаем через Украинский шлюз ${fwcmd} add 1100 divert 8672 ip from ${lonet},${wip} to table\(1\) ${fwcmd} add 1200 fwd ${uagw} ip from ${uaip} to table\(1\) ${fwcmd} add 1300 divert 8672 ip from table\(1\) to ${uaip} #Отбираем сети провайдера и запускаем через шлюз провайдера ${fwcmd} add 1400 divert 8673 ip from ${lonet},${wip},${uaip} to table\(7\) ${fwcmd} add 1500 fwd ${exgw} ip from ${exip} to table\(7\) ${fwcmd} add 1600 divert 8673 ip from table\(7\) to ${exip} #Всё остальное летит через мир ${fwcmd} add 1800 divert natd all from any to any via ${wif} ;; esac /scripts/ipfwua.sh Данный скрипт добавляет список украинских сетей в 1 таблицу #!/bin/sh UA_SRC=ua-list.txt UA_DST=dst.lst rm $UA_SRC rm $UA_DST wget http://noc.ua-ix.net.ua/ua-list.txt # Отбираем записи в которых отсутствует указатель маски (/24) for ip in 'cat $UA_SRC | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v / '; do echo $ip/24 >> $UA_DST done for ip in 'cat $UA_SRC | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep / '; do echo $ip >> $UA_DST done ipfw table 1 flush for ip in 'cat $UA_DST'; do ipfw table 1 add $ip done Собственно всё. Удачи. Замечания по сущевству приветствуются, остальных попрошу воздержаться от высказываний Sergey Rudenko aka Redacid 2006

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1.1, universite (ok), 16:18, 09/10/2006 [ответить]  
  • +/
    >/scripts/ipfwua.sh   # Данный скрипт добавляет в 1 таблицу список Украинских сетей

    А можно это скрипт показать?

     
  • 1.2, Redacid (?), 11:16, 10/10/2006 [ответить]  
  • +/
    Можно, но он не совсем правильный, хотя меня и устраивает. Всё дело в том, что на пару секунд таблица полностью очищается и трафик пойдёт через Мировой канал.

    #!/bin/sh

    UA_SRC=ua-list.txt
    UA_DST=dst.lst

    rm $UA_SRC
    rm $UA_DST
    wget http://noc.ua-ix.net.ua/ua-list.txt

    for ip in 'cat $UA_SRC | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v / '; do
    echo $ip/24 >> $UA_DST
    done

    for ip in 'cat $UA_SRC | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep / '; do
    echo $ip >> $UA_DST
    done

    ipfw table 1 flush

    for ip in 'cat $UA_DST'; do
    ipfw table 1 add $ip
    done

     
  • 1.3, selidora (?), 18:19, 03/11/2006 [ответить]  
  • +/
    я делаю так:


    #!/bin/sh
    /usr/local/bin/wget -q -O - http://noc.ix.net.ua/ua-list.txt | \
      /usr/bin/sed s%"\.0$"%"\.0/24"%g > /etc/ua-list.txt && \
    for SUBNET in '\
      /sbin/ipfw table 0 list | /usr/bin/cut -f 1 -d " " | /usr/bin/diff /etc/ua-list.txt - | \
      /usr/bin/grep -v [a-z] | /usr/bin/grep ">" | /usr/bin/cut -f 2 -d " " ' ; do
      /sbin/ipfw -q table 0 delete $SUBNET
    done && \
    for SUBNET in '\
      /sbin/ipfw table 0 list | /usr/bin/cut -f 1 -d " " | /usr/bin/diff /etc/ua-list.txt - | \
      /usr/bin/grep -v [a-z] | /usr/bin/grep "<" | /usr/bin/cut -f 2 -d " "' ; do
      /sbin/ipfw -q table 0 add $SUBNET
    done

    и по крону хоть каждые 10 минут.

     
     
  • 2.4, uanic (??), 15:48, 17/01/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Вот варант который работает и очень хорошо
    http://uanic.kiev.ua/UA_networks.html
     
     
  • 3.9, Kris (??), 12:34, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Вот варант который работает и очень хорошо
    >http://uanic.kiev.ua/UA_networks.html

    Ссылка не работает :( Обнови пожалуйста.

     

  • 1.5, Redacid (??), 19:31, 17/02/2007 [ответить]  
  • +/
    Selidora:Спасибо за скрипт. Хоть он уменя и не заработал, но дал логику для переделки своего. Его и выкладываю.

    #!/bin/sh

    wget -q -O - http://noc.ix.net.ua/ua-list.txt | sed 's/\.0$/.0\/24/g' > /etc/ua-list.txt

    for SUBNET in 'ipfw table 0 list | cut -f 1 -d " " | diff /etc/ua-list.txt - | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep ">" | cut -f 2 -d " " ' ; do
    ipfw -q table 0 delete $SUBNET
    done

    for SUBNET in 'ipfw table 0 list | cut -f 1 -d " " | diff /etc/ua-list.txt - | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep "<" | cut -f 2 -d " " ' ; do
    ipfw -q table 0 add $SUBNET
    done

     
     
  • 2.6, Uanic (??), 09:41, 20/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    У меня парочку вопросов.
    Сколько времени занимает выполнение этого скрипта?
    Есть задержки в выполнении правил ipfw, потому, как допустим для pf поиск в таблице состоящей из 10 или 10000 записей нет никакой?

    Я, когда создавал первый раз таблицу из ~700 сетей в ipfw то у меня на это уходило 30-40 секунд, затем уменьшил, оптимизировав скрипт до 3-4 секунд. Но всё равно как-то не нравилось.

    Заранее спасибо.

     

  • 1.7, Redacid (??), 20:57, 04/03/2007 [ответить]  
  • +/
    Последний у меня выполняется секунд 5, основное время уходит, на сравнение таблиц
     
  • 1.8, Redacid (??), 20:59, 04/03/2007 [ответить]  
  • +/
    ощутимых задержек замечено небыло, ведь таблица сидит в памяти.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру