[大闲人重拳出击]:替代linux+iptables实现超大流量nat/pat+双线接入+单ip限速-->
linux内核又惊爆漏洞,而且linus越来越独裁了,kernel马上50MB了,源代码臃肿。加上我这么喜新厌旧~~改用bsd了。开始拉。
安装freebsd.最小化+src-kernel部分。
应用pf作nat/pat ipfw做单ip限速。
配置内核,加入如下文本:
options IPFIREWALL
options IPFIREWALL_VERBOSE //不是必须,怕以后用到。
options IPFIREWALL_DEFAULT_TO_ACCEPT//不是必须,怕以后用到。
options IPFIREWALL_VERBOSE_LIMIT=30 //不是必须,怕以后用到。
options DUMMYNET
device pf
device pflog //不是必须,怕以后用到。
device pfsync //不是必须,怕以后用到。
options ALTQ //不是必须,怕以后用到。
options ALTQ_CBQ # Class Bases Queuing (CBQ) //不是必须,怕以后用到。
options ALTQ_RED # Random Early Detection (RED) //不是必须,怕以后用到。
options ALTQ_RIO # RED In/Out //不是必须,怕以后用到。
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)//不是必须,怕以后用到。
options ALTQ_PRIQ # Priority Queuing (PRIQ) //不是必须,怕以后用到。
根据你自己的dmesg配置硬件,裁切内核,不要怕。
config GENERIC
cd ..
cd compile/
cd GENERIC
make depend
make
make install
好了,reboot
起来了,pf和ipfw已经随内核起来了。
电信:fxp0 219.146.0.130/30互联地址是219.146.0.129 {欢迎来搞!正好测试稳定性}
网通: fxp1 218.58.57.146/30互联地址是218.58.57.145 {欢迎来搞!正好测试稳定性}
私网:fxp3192.168.0.1/24
vi /etc/pf.conf
加入如下配置:
set state-policy if-bound
set block-policy return
set optimization aggressive //这个属性参数很多,自己小心设。
scrub in all
nat on fxp0 from 192.168.0.0/24 to any -> 219.146.0.130
//注:如果你是isp的用到地址池,千万记得+ source-hash参数,不然的话连接的源ip不唯一。
nat on fxp1 from 192.168.0.0/24 to any -> 218.58.57.146
存盘退出。
pfctl -F all -f /etc/pf.conf
重新加载规则。
pfctl -sa 察看所有参数和生效的规则。
sysctl -w net.inet.ip.forwarding=1(开转发)
然后echo "net.inet.ip.forwarding=1">>/etc/sysctl.conf保证下次重启参数不实效。
这时192.168.0.0/24可以上网了,不过没有配置任何过滤规则,只能用单电信链路。
搞点静态路由到网通方向:
route add 218.7.0.0/24 218.58.57.145
route add 218.8.0.0/15 218.58.57.145
route add 218.12.0.0/16 218.58.57.145
......(省篇幅)
照这个格式把手里的路由表加到rc.conf里或者自己的脚本,开机自启即可。
开始搞针对per ip限速:
直接敲:
ipfw add pipe 1 ip from any to 192.168.0.0/24
ipfw pipe 1 config bw 500KBytes/s queue 50 mask dst-ip 0x000000ff
好了,自己测测看吧。每个ip都限到了,不过不太准,速率有出入(偏小)。
至于"回流""ftp传输模式"老生常谈,请参考pf_faq_cn。
希望能抛砖引玉,获得更好的思路,如有不足,欢迎斧正!
运行情况:
#ifstat
em0 em1 em2
KB/s inKB/s out KB/s inKB/s out KB/s inKB/s out
961.09 921.5110202.26 7416.08 8119.4211299.53
995.82 960.2710886.57 7447.74 8187.1412028.89
951.68 919.7610090.23 7546.08 8252.0411188.06
737.22 937.5810191.67 7253.56 7984.2911062.72
# vmstat 1
procs memory page disks traps cpu
r b w avm fre fltrepipofrsr sd0 cd0int sys cs us sy id
0 0 0 80881781640 245 0 0 0 0 0 0 0 4294964606 715 321 26 73
0 0 0 80881781640 20 0 0 0 0 0 0 0 10761 74 80 40 60
0 0 0 80881781640 7 0 0 0 0 0 0 0 10685 94 90 34 66
0 0 0 80881781640 7 0 0 0 0 0 0 0 10911 23 750 45 55
0 0 0 80881781640 11 0 0 0 0 0 0 0 10657 35 220 39 61
0 0 0 80881781640 7 0 0 0 0 0 0 0 10627 23 80 41 59
0 0 0 80881781640 7 0 0 0 0 0 0 0 10564 88 80 38 62
0 0 0 80881781640 7 0 0 0 0 0 0 0 10550 23 80 39 61
已经达到100Mb.
sysctl.conf以及pf.conf的优化文件请参考www.bsdlover.cn上我跟剑心通明的讨论。
[ 本帖最后由 hb2k 于 2008-2-27 18:32 编辑 ]
限制per ip的会话数也很简单。
pass in on $in_if inet proto {tcp,udp} from $in_if:network to any (max 20000 source-track rule, max-src-nodes 300,max-src-states 200, tcp.established 60, tcp.closing 5)max 整个网络最大的连接IP数
max-src-nodes 300 一台工作站连接最大IP数
max-src-states 200 一台工作站IP并发数
$in_if代表接私网的interface。 HB2K有空了??:lol 大家有福了~
呵呵,平常心平常心。多谢DreamCat !
落后了,还是各位版主强啊!我都不会用ros了!那天看了个网络故障用的ros,糗了好一阵子才搞定。
补充下:
freebsd启用pf 必须在/etc/rc.conf下加入pf_enable="YES"
或者启动之后运行pfctl -e。
大家还有什么要问的,"寡人"一一作答。 感觉大家应该尽量讨论些基本的东西,原理性的东西,如果一味追求soft router短时间内会有很大的快感成就感,但过分依赖别人的成果是不是很危险?应该多学学台湾一些论坛的人们,无论深度还是描述一件事都给人很多启发,明白why to比how to更重要,进而共同提高~~。
不好意思,大家千万不要照做。
运行了3天,系统垮了,正在查原因。 是自己崩溃的还是被攻了?已经搞定了。
是ipc.nmbclusters泄露导致的。限速要改成这句:
ipfw add pipe 3 ip from any to 10.72.0.0/19
ipfw pipe 3 config bw 300KBytes/s queue 20Kbytes mask dst-ip 0x000015ff
原先用包个数作队列,有可能产生50*1024个queue,这样做是不对的。现在经过魔鬼级人物指导作速率queue,
这样的话对netstat -m: ipc.nmbclusters占用非常小了。
同时内核要加入
net.inet.ip.dummynet.hash_size=65536
net.inet.ip.dummynet.max_chain_len=256
增强dummy的hash.
[ 本帖最后由 hb2k 于 2008-3-5 15:13 编辑 ]
parphy的800M有消息没?
我迫切的想知道怎么搞,如何搞。 好文要顶啊。我本来也装了个FREEBSD,准备自己搞个防火墙,内核也编译好了,结果工作一忙,都扔下三个月没搞了。希望楼主多出点这样的好贴,谢谢。 顶:) :) :)
页:
[1]