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
${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 таблицу
# Отбираем записи в которых отсутствует указатель маски (/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
1322 Прочтений • [Разделение трафика по разным каналам с помощью IPFW и NAT в связке с MPD (vpn balance ipfw freebsd)] [08.05.2012] [Комментариев: 0]