hb2k 发表于 2008-2-27 18:12:03

[大闲人重拳出击]:替代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 编辑 ]

hb2k 发表于 2008-2-27 18:45:49

限制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。

DreamCat 发表于 2008-2-28 11:19:24

HB2K有空了??:lol 大家有福了~

hb2k 发表于 2008-2-28 13:54:50

呵呵,平常心平常心。多谢DreamCat !

落后了,还是各位版主强啊!我都不会用ros了!
那天看了个网络故障用的ros,糗了好一阵子才搞定。
补充下:
freebsd启用pf 必须在/etc/rc.conf下加入pf_enable="YES"
或者启动之后运行pfctl -e。
大家还有什么要问的,"寡人"一一作答。

hb2k 发表于 2008-2-28 21:46:35

感觉大家应该尽量讨论些基本的东西,原理性的东西,如果一味追求soft router短时间内会有很大的快感成就感,但过分依赖别人的成果是不是很危险?应该多学学台湾一些论坛的人们,无论深度还是描述一件事都给人很多启发,明白why to比how to更重要,进而共同提高~~。

hb2k 发表于 2008-3-3 13:19:45

不好意思,大家千万不要照做。

运行了3天,系统垮了,正在查原因。

parphy 发表于 2008-3-4 22:38:27

是自己崩溃的还是被攻了?

hb2k 发表于 2008-3-5 15:07:23

已经搞定了。

是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 编辑 ]

hb2k 发表于 2008-3-5 15:11:38

parphy的800M有消息没?

我迫切的想知道怎么搞,如何搞。

jtfzp 发表于 2008-3-23 08:26:54

好文要顶啊。我本来也装了个FREEBSD,准备自己搞个防火墙,内核也编译好了,结果工作一忙,都扔下三个月没搞了。希望楼主多出点这样的好贴,谢谢。

ljmtoo 发表于 2008-5-9 20:00:10

顶:) :) :)
页: [1]
查看完整版本: [大闲人重拳出击]:替代linux+iptables实现超大流量nat/pat+双线接入+单ip限速-->