找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 14805|回复: 10

[linux] [大闲人重拳出击]:替代linux+iptables实现超大流量nat/pat+双线接入+单ip限速-->

[复制链接]
发表于 2008-2-27 18:12:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
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    {欢迎来搞!正好测试稳定性}
私网:fxp3  192.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 in  KB/s out   KB/s in  KB/s out   KB/s in  KB/s out
  961.09    921.51  10202.26   7416.08   8119.42  11299.53
  995.82    960.27  10886.57   7447.74   8187.14  12028.89
  951.68    919.76  10090.23   7546.08   8252.04  11188.06
  737.22    937.58  10191.67   7253.56   7984.29  11062.72

# vmstat 1
procs   memory        page                    disks     traps         cpu
r b w    avm    fre   flt  re  pi  po  fr  sr sd0 cd0  int   sys   cs us sy id
0 0 0   80881781640   245   0   0   0   0   0   0   0 4294964606   715   32  1 26 73
0 0 0   80881781640    20   0   0   0   0   0   0   0 10761    74    8  0 40 60
0 0 0   80881781640     7   0   0   0   0   0   0   0 10685    94    9  0 34 66
0 0 0   80881781640     7   0   0   0   0   0   0   0 10911    23   75  0 45 55
0 0 0   80881781640    11   0   0   0   0   0   0   0 10657    35   22  0 39 61
0 0 0   80881781640     7   0   0   0   0   0   0   0 10627    23    8  0 41 59
0 0 0   80881781640     7   0   0   0   0   0   0   0 10564    88    8  0 38 62
0 0 0   80881781640     7   0   0   0   0   0   0   0 10550    23    8  0 39 61
已经达到100Mb.

sysctl.conf以及pf.conf的优化文件请参考www.bsdlover.cn上我跟剑心通明的讨论。

[ 本帖最后由 hb2k 于 2008-2-27 18:32 编辑 ]
routeros
 楼主| 发表于 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。
routeros
回复

使用道具 举报

发表于 2008-2-28 11:19:24 | 显示全部楼层
HB2K有空了?? 大家有福了~
routeros
回复

使用道具 举报

 楼主| 发表于 2008-2-28 13:54:50 | 显示全部楼层

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

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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2008-3-3 13:19:45 | 显示全部楼层

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

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

使用道具 举报

发表于 2008-3-4 22:38:27 | 显示全部楼层
是自己崩溃的还是被攻了?
routeros
回复

使用道具 举报

 楼主| 发表于 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 编辑 ]
routeros
回复

使用道具 举报

 楼主| 发表于 2008-3-5 15:11:38 | 显示全部楼层

parphy的800M有消息没?

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

使用道具 举报

发表于 2008-3-23 08:26:54 | 显示全部楼层
好文要顶啊。我本来也装了个FREEBSD,准备自己搞个防火墙,内核也编译好了,结果工作一忙,都扔下三个月没搞了。希望楼主多出点这样的好贴,谢谢。
routeros
回复

使用道具 举报

发表于 2008-5-9 20:00:10 | 显示全部楼层
routeros
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2024-4-30 14:06 , Processed in 0.072384 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表