Написанием данной статьи послужила следующая поставленная задача:
Имеем 2-х операторов предоставляющих канал в конечном формате V.35,
у каждого оператора есть свои реальные IP адреса, пропускает наружу
оператор только свои IP. Клиентам же, в свою очередь, раздаются ТОЛЬКО
реальные IP (т.к.) практически у каждого есть свои VPN, IPSEC, SQL-сервера
и еще черти-знает что.
Собственно формулировка задачи: половине клиентов раздать IP из блока одного
оператора, половине - из блока другого.
Отступление:
Канал точка-точка между оператором1 и нами будет использовать следующие
IP адреса: 192.168.0.1 (наш IP), 192.168.0.2 (оператора), маска подсети
255.255.255.252. Блок IP адресов оператора1: 192.168.1.128-192.168.1.255.
Канал точка-точка между оператором2 и нами будет использовать следующие
IP адреса: 192.168.50.1 (наш IP), 192.168.50.2 (оператора), маска
подсети 255.255.255.252. Блок IP адресов оператора1: 192.168.51.128-192.168.51.255.
Как понимаете, все IP реальные, в примере просто изменены.
Итого нам понадобится:
- Плата TAU-PCI фирмы Cronyx (представляет собой адаптер с двумя каналами V.35,
есть модификация с 4-мя)
- Два кабеля к ней M34/M26 (в стандартный комплект поставки не входят)
- Роутер с установленной FreeBSD 4.8 (опыты проводились именно на ней, но
работать должно на всей ветке 4.X)
Подготовка:
Скачиваем драйвера с http://www.cronyx.ru/ (на момент
написания статьи последняя версия 4.3.2), т.к. в комплекте поставки
идут, мягко говоря, не совсем новые драйвера - в них есть недоработки,
приводящие к "залипанию" буфера чипа. Распаковываем. Далее необходимо
поправить немного в драйверах, чтобы tcpdump мог работать с картой:
файлик if_cp.c пропатчить следующим образом:
469c469
< bpfattach (&d->pp.pp_if, DLT_CHDLC, 4);
---
> bpfattach (&d->pp.pp_if, DLT_PPP, 4);
(совет вполне официальный и получен от техподдержки Кроникс`а).
Ставим их, как написано в readme.
Добавляем в ядро ОБА канала: cp0 и cp1.
Компилируем, ставим ядро.
Редактируем /etc/rc. Маленькое лирическое отступление: зачем это надо - канал при загрузке системы надо отконфигурировать утилитой sconfig (идущей в поставке драйвера), а потом уже применять стандартный ifconfig.
После строк
# Start up the initial network configuration.
#
if [ -r /etc/rc.network ]; then
. /etc/rc.network # We only need to do this once.
network_pass1
fi
вставляем следующее:
echo `Star up TAU-PCI...`
sconfig cp0 cisco #оператор1
sconfig cp1 cisco #оператор2
ifconfig cp0 192.168.0.1 192.168.0.2 netmask 255.255.255.252 up
ifconfig cp1 192.168.50.1 192.168.50.2 netmask 255.255.255.252 up
route add default 192.168.0.2
Допустим, что default route у нас будет оператор1. По большому счету
следуя BSD-style надо было поместить все это в отдельный файл
/etc/rc.cronyx и написать подобный вышеприведенному if...
Главное потом при mergemaster вспомнить что и где мы правили!
Остальные сетевые настройки оставляю на вашу совесть, отмечу только необходимое
в данном примере.
В rc.conf:
firewall_enable="YES"
firewall_quiet="NO"
firewall_logging="YES"
firewall_script="/etc/gw.fw"
gateway_enable="YES"
network_interfaces="fxp1 fxp2 fxp3 lo0"
ifconfig_fxp1="inet 192.168.1.129 netmask 255.255.255.224"
ifconfig_fxp2="inet 192.168.1.161 netmask 255.255.255.224"
ifconfig_fxp3="inet 192.168.1.193 netmask 255.255.255.224"
ifconfig_fxp3_alias0="inet 192.168.51.193 netmask 255.255.255.224"
ifconfig_fxp2_alias0="inet 192.168.51.161 netmask 255.255.255.224"
ifconfig_fxp1_alias0="inet 192.168.51.129 netmask 255.255.255.224"
Как видите, блоки адресов разбиты по 3-м сетевым картам и остаеться еще
один блок в резерве.
ipfw в ядре default to deny.
Далее правила ipfw, находящиеся в файле gw.fw:
fwcmd="/sbin/ipfw"
${fwcmd} -f flush
# Счетчика для траффика клиентов
# Для клиентов оператора1
${fwcmd} add 500 count ip from 192.168.1.130 to any in recv fxp1
${fwcmd} add 501 count ip from any to 192.168.1.130 out xmit fxp1
# Для клиентов оператора2
${fwcmd} add 502 count ip from 192.168.51.130 to any in recv fxp1
${fwcmd} add 503 count ip from any to 192.168.51.130 out xmit fxp1
# Остальные аналогично со сменой интерфейса и IP адресов
#Разрешение клиентов оператора1
${fwcmd} add 1000 pass all from 192.168.1.130 to any
${fwcmd} add 1001 pass all from any to 192.168.1.130
#Разрешение клиентов оператора2
${fwcmd} add 1003 allow ip from any to 192.168.51.130
${fwcmd} add 1004 fwd 192.168.50.2 ip from 192.168.51.130 to any out xmit cp0
${fwcmd} add 1005 allow ip from 192.168.51.130 to any
Вот собственно и все - осталась перезагрузка и благодарности: огромное
спасибо всему форуму, ответы на многие вопросы были найдены именно там.