Хм.., однако..
ОК, условимся,В ядре есть все что требуется для IPFW NAT ROUTETABLES NETGRAPH
Установлен MPD ( разумеется из портов :) )
em0 интерфейс безлимитки
em1 интерфейс лимитки
em2 интерфейс смотрит в локальную сеть
определяемся
ng0 = pppoe0 = em0 => безлимитка
ng1 = pppoe1 = em1 => лимитка
cat /usr/local/etc/mpd5/mpd.conf
startup:
# configure mpd users
set user admin foobar admin
set user foo bar
# configure the console
set console self 127.0.0.1 5005
set console open
# configure the web server
set web self 0.0.0.0 5006
set web open
default:
load pppoe0
load pppoe1
load pptp_server
pppoe0:
create bundle static B1
set iface up-script "/usr/local/etc/mpd5/ng0_up.sh"
set iface down-script "/usr/local/etc/mpd5/ng0_down.sh"
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
create link static L1 pppoe
set link action bundle B1
set auth authname "name1"
set auth password "passwd1"
set link max-redial 0
set link mtu 1492
set link keep-alive 5 15
set pppoe iface em0
open
pppoe1:
create bundle static B2
set iface up-script "/usr/local/etc/mpd5/ng1_up.sh"
set iface down-script "/usr/local/etc/mpd5/ng1_down.sh"
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
create link static L2 pppoe
set link action bundle B2
set auth authname "name2"
set auth password "passwd2"
set link max-redial 0
set link mtu 1492
set link keep-alive 5 15
set pppoe iface em1
open
pptp_server:
create bundle template B
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
set ipcp ranges 172.16.1.1/32 0.0.0.0/0
# set ipcp dns 192.168.10.2
create link template L pptp
set link action bundle B
set link enable multilink
set link yes acfcomp protocomp
set link no pap chap
set link enable chap
set link keep-alive 10 60
set link mtu 1472
set pptp self 192.168.10.2
# set pptp disable windowing
set link enable incoming
Скрипты up и down автоматически выполняющиеся при взлете и падении pppoe
(не забыть сделать исполняемыми! :) )
Для первого интерфейса em0 (ng0 = pppoe0)
cat /usr/local/etc/mpd5/ng0_up.sh
#!/bin/sh
# ------------------ КОНФИГУРИМ NAT 1 НА ИНТЕРФЕЙСЕ NG0 -------------------- #
/sbin/ipfw -q add 60 nat 1 all from any to any out xmit $1 tagged 1
/sbin/ipfw -q add 61 nat 1 all from any to $3 in recv $1
# -------------------- ДОБАВЛЯЕМ МАРШРУТ ПО УМОЛЧАНИЮ ---------------------- #
/sbin/route -q add default -iface $1
# ------------ ОБЪЯВЛЯЕМ КОНФИГУРАЦИЮ NAT 1 НА ИНТЕРФЕЙСЕ NG0 -------------- #
/sbin/ipfw -q nat 1 config if $1 reset
cat /usr/local/etc/mpd5/ng0_down.sh
#!/bin/sh
# ------------------- УДАЛЯЕМ ПРАВИЛА 60 И 61 ДЛЯ NAT 1 -------------------- #
/sbin/ipfw -q delete 60 61
# ------- ПРОВЕРЯЕМ МАРШРУТ ПО УМОЛЧАНИЮ NG0 И ЕСЛИ ОН ЕСТЬ - УДАЛЯЕМ ------ #
/usr/bin/netstat -nr | /usr/bin/grep 'default' | /usr/bin/awk '{print $2}' | /usr/bin/grep 'ng0'
if [ $? = 0 ]; then
/sbin/route -q delete default -iface `ifconfig ng0 | grep 'inet' | awk '{print $2}'`
fi
# --------------------------- УДАЛЯЕМ САМ NAT 1 ---------------------------- #
/sbin/ipfw -q nat 1 delete
Ну и соответственно для второго интерфейса em1 (ng1 = pppoe1)
cat /usr/local/etc/mpd5/ng1_up.sh
#!/bin/sh
# ------------------ КОНФИГУРИМ NAT 2 НА ИНТЕРФЕЙСЕ NG1 -------------------- #
/sbin/ipfw -q add 70 nat 2 all from any to any out xmit $1 tagged 2
/sbin/ipfw -q add 71 nat 2 all from any to $3 in recv $1
# -------------------- ДОБАВЛЯЕМ МАРШРУТ ПО УМОЛЧАНИЮ ---------------------- #
/sbin/route -q add default -iface $1
# ------------ ОБЪЯВЛЯЕМ КОНФИГУРАЦИЮ NAT 2 НА ИНТЕРФЕЙСЕ NG1 -------------- #
/sbin/ipfw -q nat 2 config if $1 reset
cat /usr/local/etc/mpd5/ng1_down.sh
#!/bin/sh
# ------------------- УДАЛЯЕМ ПРАВИЛА 70 И 71 ДЛЯ NAT 2 -------------------- #
/sbin/ipfw -q delete 31 70 71
# ------- ПРОВЕРЯЕМ МАРШРУТ ПО УМОЛЧАНИЮ NG1 И ЕСЛИ ОН ЕСТЬ - УДАЛЯЕМ ------ #
/usr/bin/netstat -nr | /usr/bin/grep 'default' | /usr/bin/awk '{print $2}' | /usr/bin/grep 'ng1'
if [ $? = 0 ]; then
/sbin/route -q delete default -iface `ifconfig ng1 | grep 'inet' | awk '{print $2}'`
fi
# --------------------------- УДАЛЯЕМ САМ NAT 2 ---------------------------- #
/sbin/ipfw -q nat 2 delete
В /etc/rc.conf есть строка
firewall_type="/etc/fw.conf"
и defaultrouter НЕ ЗАДАН!
Минимальные правила фаервола
cat /etc/fw.conf
# ------------------- ОЧИЩАЕМ ПЕРЕД ЗАГРУЗКОЙ ВСЕ ПРАВИЛА ------------------ #
-f -q flush
# ------------------------ КОНФИГУРИМ multi-routing ------------------------ #
add 50 setfib 0 tag 1 all from table(0) to any
add 50 setfib 1 tag 2 all from table(1) to any
# ----------------------------- ПЕТЛЕВОЙ ИФЕЙС ----------------------------- #
add 100 allow all from any to any via lo0
add 200 deny all from any to 127.0.0.0/8
add 300 deny all from 127.0.0.0/8 to any
# ------------------------------ РАЗРЕШАЕМ ВХОД ---------------------------- #
add 1100 allow all from any to { table(0) or table(1) } out xmit em2
# ------------------------------ РАЗРЕШАЕМ ВЫХОД --------------------------- #
add 1200 allow all from { table(0) or table(1) } to any in recv em2
# ------------------------------ ВРУБАЕМ ЛОГ ------------------------------- #
add 2000 deny log proto all
add 9000 allow ip from any to any
add 65000 deny ip from any to any
Конфиг mpd в части сервера pptp_server рихтануть конкретно для себя, здесь приведен для примера, добавить необходимые правила в фаервол.
Условимся, что в таблице 0 находятся IP адреса для анлимит, в таблице 1 - лимит
Для пробы проверяем:
# ipfw table 0 add 192.168.0.10
# ipfw table 0 add 192.168.0.11
# ipfw table 1 add 192.168.0.100
# ipfw table 1 add 192.168.0.111
Соответственно адреса 10 и 11 пойдут по анлиму, а 100 и 111 по лиму ))