#清除原有的规则,注意nat、queue必须单独清除,仅仅flush清除不掉
ipfw -q flush
ipfw -q nat
flush
ipfw -q queue
flush
#第一句:对172.16.100.12进行端口映射,并定义nat
#第二句:实际上没有什么用处,作为nat时的备用地址
#第三句:把外网IP与内网IP进行映射,并定义nat
ipfw nat 10 config ip
1.2.3.16 redirect_port tcp 172.16.100.12:22 22
ipfw nat 20 config ip
1.2.3.17
ipfw nat 30 config ip
1.2.3.15 redirect_addr 172.16.100.19 1.2.3.15
#
-------------------------------------------------------------------
#
下面两句是sched语句,主要指定调度的算法和掩码,
#
注意这是反掩码,决定了队列的数量,例子中最多有256个队列
#
其实再加上个pipe就可以直接进行限速,
ipfw sched 10 config type
QFQ mask src-ip 0x0000ff00
ipfw sched 20 config type
QFQ mask dst-ip 0x0000ff00
#
-------------------------------------------------------------------
#分队列,注意每一种都为了上传和下载两个方向
ipfw queue 100 config sched
10 weight 90
ipfw queue 110 config sched
20 weight 90
ipfw queue 400 config sched
10 weight 1
ipfw queue 410 config sched
20 weight 1
#
-------------------------------------------------------------------
#
外网服务
ipfw add 10 allow ip from
any to me 22,80,21,22,3306 keep-state
#
-------------------------------------------------------------------
#
内网的tcp包直接通过
ipfw add 100 queue 100 tcp
from 172.16.0.0/16 to any in via em1
ipfw add 110 queue 110 tcp
from any to 172.16.0.0/16 out via em1
#
-------------------------------------------------------------------
###
DNS包也要优先通过,否则解析不到DNS,上网就慢了一大截!
ipfw add 200 queue 100 udp
from 172.16.0.0/16 to any 53 in via
em1
ipfw add 210 queue 110 udp
from any 53 to 172.16.0.0/16 out via em1
#
-------------------------------------------------------------------
###
DMZ的udp,也直接放行
ipfw add 300 queue 100 udp
from 172.16.200.0/24,172.16.100.0/24 to any in
via em1
ipfw add 310 queue 110 udp
from any to 172.16.200.0/24,172.16.100.0/24 out via
em1
#
-------------------------------------------------------------------
#
其它的udp,特别是p2p,慢慢排队吧
#
在udp最泛滥的时候,udp的包大约是tcp包的几十倍,队列调度效果也不好,
#
所以做过状态规则,限制每个ip的udp并发数,注意limit是一个状态规则,
#
要把内核变量:net.inet.ip.fw.dyn_max:设置的大一些,比如65535,甚至是1048576
#
因为是状态规则,本来两可以用一句代替:
# ipfw add 400 allow udp
from 172.16.0.0/16 to any in via em1 limit
scr-addr 10
ipfw add 400 queue 400 udp
from 172.16.0.0/16 to any in via em1
ipfw add 410 queue 410 udp
from any to 172.16.0.0/16 out via em1
#
-------------------------------------------------------------------
#
要手工指定nat映射,这是内核nat比natd麻烦的地方
ipfw add 700 nat 30 ip from
any to 1.2.3.150 in via em0
ipfw add 800 nat 30 ip from
172.16.100.19 to any out via em0
#
-------------------------------------------------------------------
#
正式开始NAT
ipfw
add 1000 nat 10 ip from 172.16.0.0/16 to any out via
em0
ipfw
add 2000 nat 10 ip from any to 1.2.3.16 in via
em0
ipfw
add 3000 nat 20 ip from any to 1.2.3.17 in via
em0
【
#第一句:对172.16.100.12进行端口映射,并定义nat
#第二句:实际上没有什么用处,作为nat时的备用地址
#第三句:把外网IP与内网IP进行映射,并定义nat
ipfw nat 10 config ip 1.2.3.16 redirect_port
tcp 172.16.100.12:22 22
ipfw nat 20 config ip
1.2.3.17
ipfw nat 30 config ip 1.2.3.15 redirect_addr
172.16.100.19 1.2.3.15 】
#####################################################
#
如果想做白名单,可以在下面加上 allow ip from any to any
diverted
# 和
allow ip from any to any established
#
最后就可以deny ip from any to any了。
#
但是对于主要nat的服务器,我一直认为没有必须限制太多,除非遇到了麻烦。
#####################################################
原文地址