Ну вот, уже думал, что заниматься это темой больше не буду... а пришлось...
В общем, навоял пока вот такую систему (см конфиги ниже).
Сам пока ничего не придумывал, все где-нибудь по-строчке надергал. После того, как у меня "пошел интернет" стал читать мануалы и прочее, чтобы понять - как же оно все-таки работает
Сразу скажу - топорный вариант, но работало нормально примерно на количестве подключений до 70, а потом стало вылетать в kernel panic...
(в конфигах возможны где-то неточности, потому что брал из кусков рабочих конфигов... которых уже с десяток набралось
mpd.conf:
- Код: Выделить всё
default:
load n707070
load n808080
#load и т.д.
n707070:
create bundle static b-n707070
set iface route default
set iface up-script /usr/local/etc/mpd5/up.sh
#set iface down-script /usr/local/etc/mpd5/down.sh
set iface enable tcpmssfix
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set bundle disable compression
create link static l-n707070 pppoe
set link action bundle b-n707070
set auth authname n707070
set auth password xxxxxxxxxx
set link max-redial 0
set ling mtu 1412
set link enable multilink
set link keep-alive 10 60
set pppoe iface vr0
set pppoe service ""
open
так для каждого подключения (конфиг получился огромный, и пока что я выкрутился так - имея логины и пароли текст этого конфига генерит небольшой скрипт)
up.sh:
- Код: Выделить всё
#!/bin/sh
route delete 91.91.91.91
-этот скрипт добавил, потому что подключения, начинающиеся со 2-го и далее, при подключении не получали ip-адрес, хотя интерфейс ng создавался... в логах было примерно такое:
IFACE: Add route 0.0.0.0/0 91.91.91.91 failed: File exists
down.sh пока не пригодился
(Тут еще одна загвоздка может быть - уже несколько позже прочитал, что при такой ситуации, когда все пакеты уходят в один и тот же шлюз, может (или должно?) ничего не работать (хотя на практике убедился, что как-то оно все же работает). И что поможет только ECMP... так что пока обновляю систему до 8-й версии (с 7.1), а там посмотрим, что это такое)
PBR делал по вот такому примеру:
http://ipfw.ism.kiev.ua/pbr.htmlт.е. куча natd и ipfw примерно такого содержания (пример для 2-х пользователей -
тут тоже делал аналогично конфигу mpd - большая часть текста конфигов сгенерена скриптом):
nat.up:
- Код: Выделить всё
#!/bin/sh
natd -n ng0 -p 8998 -dynamic
natd -n ng1 -p 8999 -dynamic
rc.ipfw:
- Код: Выделить всё
#!/bin/sh
ipfw -q -f flush
ipfw -q -f pipe flush
iif="rl0"
oif="vr0"
cmd="ipfw -q add"
ng0_ip=`ifconfig ng0 | grep inet | awk '{print$2}'`
ng1_ip=`ifconfig ng1 | grep inet | awk '{print$2}'`
#и т.д.
n707070="10.1.1.1"
n808080="10.1.1.2"
#и т.д.
lan_in2="10.0.0.0/8"
$cmd 1 pipe 257 ip from $lan_in2 to any in via $iif
$cmd 2 skipto 1000 all from $lan_in2 to any
$cmd 3 pipe 256 ip from any to $lan_in2 out via $iif
$cmd 4 skipto 1000 all from any to $lan_in2
$cmd 1000 divert 8998 ip from $n707070 to any
$cmd 1001 fwd 91.185.5.169 ip from $ng0_ip to any
$cmd 1002 divert 8998 ip from any to $ng0_ip
$cmd 1003 divert 8999 ip from $n808080 to any
$cmd 1004 fwd 91.185.5.169 ip from $ng1_ip to any
$cmd 1005 divert 8999 ip from any to $ng1_ip
# и т.д. для каждого ip-адреса
ipfw pipe 256 config mask dst-ip 0xffffffff bw 256Kbits queue 30 gred 0.002/3/9/0.1
ipfw pipe 257 config mask src-ip 0xffffffff bw 512Kbits queue 30 gred 0.002/3/9/0.1
$cmd 9976 allow ip from any to any via lo0
$cmd 9977 deny ip from any to 127.0.0.0/8
$cmd 9978 deny ip from 127.0.0.0/8 to any
$cmd 9979 check-state
$cmd 9980 deny all from any to any frag
$cmd 10000 allow ip from any to any
___
Вот так вот все это "взлетело"... ненадолго, потому что начали появляться нюансы в работе...например, случился реконнект на одном из интерфейсов, сменился внешний ip-адрес, потребовалось перегрузить правила на файрволе или перезапустить natd (тоже отваливался). Летало не долго
В общем, сейчас думаю над NAT-ом, который можно поднять через конфиг mpd (правда, ни одного рабочего примера пока не нашел - одни такие же, как я, интересующиеся)
set iface enable nat
и над общей оптимизацией...
Если кто поделится интересными идеями или ссылками, буду рад.