>
>делаю bridge для одной только цели. простейшую считалку трафика с ограничением. например,
>прошло ч-з внешнюю сетевуху 1 GB за сутки отрубаем интырнет. ну
>или интерфейс кладем. кто, что может предложить.
>
>зы просто считалки не предлагать, супер навороченные билинги не предлагать Есть некоторый опыт в этом деле. Вопшем всё выглядит вот так:
brigde1# dmesg | head
Copyright (c) 1992-2006 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 6.1-RELEASE #3: Tue Jun 10 13:52:55 EEST 2008
root@brigde1:/usr/src/sys/i386/compile/BRIDGE
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: AMD-K6(tm) 3D processor (350.80-MHz 586-class CPU)
Origin = "AuthenticAMD" Id = 0x58c Stepping = 12
Features=0x8021bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,PGE,MMX>
AMD Features=0x80000800<SYSCALL,3DNow>
brigde1#
brigde1# uname -a
FreeBSD brigde1 6.1-RELEASE FreeBSD 6.1-RELEASE #3: Tue Jun 10 13:52:55 EEST 2008 root@brigde1:/usr/src/sys/i386/compile/BRIDGE i386
brigde1#
brigde1# ifconfig -a
rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
inet6 fe80::202:44ff:fe43:a333%rl0 prefixlen 64 scopeid 0x1
inet 172.16.0.254 netmask 0xffff0000 broadcast 172.16.255.255
ether 00:02:44:43:a3:33
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
rl1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
inet6 fe80::280:48ff:fe45:c9b4%rl1 prefixlen 64 scopeid 0x2
inet 172.16.0.253 netmask 0xffff0000 broadcast 172.16.255.255
ether 00:80:48:45:c9:b4
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
pflog0: flags=0<> mtu 33208
pfsync0: flags=0<> mtu 2020
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6
inet 127.0.0.1 netmask 0xff000000
bridge0: flags=8043<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether ac:de:48:8e:8e:21
priority 32768 hellotime 2 fwddelay 15 maxage 20
member: rl1 flags=3<LEARNING,DISCOVER>
member: rl0 flags=3<LEARNING,DISCOVER>
brigde1#
brigde1# cat /usr/src/sys/i386/conf/BRIDGE | tail -40
### ADDED OPTIONS ###
option IPFIREWALL
option IPFIREWALL_VERBOSE
option IPFIREWALL_VERBOSE_LIMIT=100
option IPDIVERT
option DUMMYNET
option BRIDGE
device if_bridge
options IPFIREWALL_FORWARD
options IPFIREWALL_FORWARD_EXTENDED
options IPFILTER
options IPFILTER_LOG
options HZ=1000
options MAXCONS=1024
options NETGRAPH
options NETGRAPH_BPF
options NETGRAPH_ETHER
options NETGRAPH_IFACE
options NETGRAPH_KSOCKET
options NETGRAPH_SOCKET
options NETGRAPH_TEE
device pf
device pflog
device pfsync
options ALTQ
options ALTQ_CBQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_HFSC
options ALTQ_CDNR
options ALTQ_PRIQ
brigde1#
brigde1# cat /etc/rc.conf
# Enable network daemons for user convenience.
# Please make all changes to this file, not to /etc/defaults/rc.conf.
# This file now contains just the overrides from /etc/defaults/rc.conf.
gateway_enable="YES"
keymap="us.iso"
sshd_enable="YES"
sendmail_enable="NONE"
defaultrouter="172.16.0.255"
hostname="brigde1"
firewall_enable="YES"
firewall_script="/opt/lanadmin/bridge.sh"
fsck_y_enable="YES"
background_fsck="NO"
smartd_enable="YES"
brigde1#
файл /opt/lanadmin/bridge.sh выглядит следующим образом (много неинтересных строк опущено):
#!/bin/sh
### SETUP_BRIDGE ###
/sbin/ifconfig bridge0 create
/sbin/ifconfig bridge0 addm rl0
/sbin/ifconfig bridge0 addm rl1
/sbin/ifconfig rl0 up
/sbin/ifconfig rl1 up
/sbin/ifconfig bridge0 up
/sbin/ifconfig rl0 inet 172.16.0.254 netmask 255.255.0.0
/sbin/ifconfig rl1 inet 172.16.0.253 netmask 255.255.0.0
/sbin/route add default 172.16.0.255
### SETUP_FIREWALL ###
/sbin/ipfw add 1 allow mac-type arp
/sbin/ipfw add 3000 deny tcp from 172.16.0.0/16 to any not established tcpflags fin,syn,rst,psh,urg,ack
/sbin/ipfw add 3010 deny tcp from 172.16.0.0/16 to any not established tcpflags !fin,!syn,!rst,!psh,!urg,!ack
/sbin/ipfw add 3020 deny tcp from 172.16.0.0/16 to any not established tcpflags fin
/sbin/ipfw add 10001 count ip from not 172.16.0.0/16 to 172.16.0.1 out
/sbin/ipfw add 10002 count ip from not 172.16.0.0/16 to 172.16.0.2 out
/sbin/ipfw add 10003 count ip from not 172.16.0.0/16 to 172.16.0.3 out
/sbin/ipfw add 10004 count ip from not 172.16.0.0/16 to 172.16.0.4 out
...
...
...
/sbin/ipfw add 20001 count ip from 172.16.0.1 to not 172.16.0.0/16 out
/sbin/ipfw add 20002 count ip from 172.16.0.2 to not 172.16.0.0/16 out
/sbin/ipfw add 20003 count ip from 172.16.0.3 to not 172.16.0.0/16 out
/sbin/ipfw add 20004 count ip from 172.16.0.4 to not 172.16.0.0/16 out
...
...
...
/sbin/ipfw add 40001 pipe 40001 ip from not 172.16.0.0/16 to 172.16.0.1 out
/sbin/ipfw add 50001 pipe 50001 ip from 172.16.0.1 to not 172.16.0.0/16 out
/sbin/ipfw pipe 40001 config bw 128kbit
/sbin/ipfw pipe 50001 config bw 128kbit
/sbin/ipfw add 40002 pipe 40002 ip from not 172.16.0.0/16 to 172.16.0.2 out
/sbin/ipfw add 50002 pipe 50002 ip from 172.16.0.2 to not 172.16.0.0/16 out
/sbin/ipfw pipe 40002 config bw 64kbit
/sbin/ipfw pipe 50002 config bw 64kbit
/sbin/ipfw add 40003 pipe 40003 ip from not 172.16.0.0/16 to 172.16.0.3 out
/sbin/ipfw add 50003 pipe 50003 ip from 172.16.0.3 to not 172.16.0.0/16 out
/sbin/ipfw pipe 40003 config bw 64kbit
/sbin/ipfw pipe 50003 config bw 64kbit
/sbin/ipfw add 40004 pipe 40004 ip from not 172.16.0.0/16 to 172.16.0.4 out
/sbin/ipfw add 50004 pipe 50004 ip from 172.16.0.4 to not 172.16.0.0/16 out
/sbin/ipfw pipe 40004 config bw 64kbit
/sbin/ipfw pipe 50004 config bw 64kbit
...
...
...
/sbin/ipfw add 65500 allow ip from 172.16.0.0/16 to any
/sbin/ipfw add 65510 allow ip from any to 172.16.0.0/16
exit $?
#EOF
Краткое описание:
простая машина, класса "тазик", без особых наворотов или возможностей,
сетвые интерфейсы - rl0, rl1 - rtl8139d
бридж-интерфейс как и следовало бы ожидать - bridge0 :-) (создаётся скриптом /opt/lanadmin/bridge.sh при старте машины)
строки в конце файла конфигурации кернела обеспечивают поддержку всего необходимого для создания моста плюс некоторые навороты, которые, впрочем, не юзаю (пока что :-) )
самое важное там - вот это:
option IPFIREWALL
option IPFIREWALL_VERBOSE
option IPFIREWALL_VERBOSE_LIMIT=100
option IPDIVERT
option DUMMYNET
option BRIDGE
device if_bridge
options IPFIREWALL_FORWARD
options IPFIREWALL_FORWARD_EXTENDED
Внимание: эти опци меняются от версии к версии и могут не работать под бздёй 7.х Под 5.х точно не будет - там название некоторых девайсов и опций чуть другое.
далее - начальная конфигурация сетевых интерфейсов через /etc/rc.conf (см. выше)
В принципе, айпишники на физических интерфейсах нафик не нужны, держу просто "на всякий случай".
Из /etc/rc.conf вызывается /opt/lanadmin/bridge.sh, который, собственно, и конфигурит всё.
Правила типа
/sbin/ipfw add 10001 count ip from not 172.16.0.0/16 to 172.16.0.1 out
/sbin/ipfw add 20001 count ip from 172.16.0.1 to not 172.16.0.0/16 out
являются счётчиками пакетов/байтов (первое для даунлоад, второе - для аплоад). Их значения поминутно заносятся в базу данных. Ограничения по трафику при привышении обьёма переданного не реализованы, но легко добавляются в эту схему (считывание данных за текущий день из БД и вставка определённого блокирующего правила в фаерволл или понижение скорости уже существующими правилами типа
/sbin/ipfw add 40001 pipe 40001 ip from not 172.16.0.0/16 to 172.16.0.1 out
/sbin/ipfw add 50001 pipe 50001 ip from 172.16.0.1 to not 172.16.0.0/16 out
/sbin/ipfw pipe 40001 config bw 128kbit
/sbin/ipfw pipe 50001 config bw 128kbit
(первые 2 строки создают пайпы для даунлоада и аплоада для конкретной клиентской машины, вторые 2 строки - конфигурят скорость по этим пайпам)
).
Есть ещё кронджобы
brigde1# crontab -l
0 * * * * /usr/sbin/ntpdate 172.16.0.1
*/5 0 * * * /opt/lanadmin/ip_shaper.sh day
*/5 9-23 * * * /opt/lanadmin/ip_shaper.sh day
*/5 1-8 * * * /opt/lanadmin/ip_shaper.sh night
brigde1#
которые меняют скорость пайпов в зависимости от времени суток.
Там просто строки вида
/sbin/ipfw pipe 40001 config bw 2Mbit/s
/sbin/ipfw pipe 50001 config bw 64kbit
Вот в кратце и всё. Есть вопросы - обращайтесь.
respect,
ronin