一、安装
选择最小化安装,并且选上src下面得sys(编译内核用),以及man、ports,在后面选择安装包时,选上bash、cvsup-whitout-gui、perl,免得到时安装其他软件要用到时又得上网下载安装,而这些包比较大,如果你的网络不是非常好的话,那将非常的慢。启动时选上inetd、启用ssh。
二、升级ports树
进入root用户不用我说了吧,直接root登录或者用其他用户su到root也行,当然还得确定你已经连上网络了。
# cd /usr/ports/net/cvsup-without-gui //因为还没装x只能用这种方式了
# make install clean // 意思不用我多说了吧
完成之后进入cvsup目录
# cd /usr/share/examples/cvsup //进入cvsup目录
# cp ports-supfile /root //保险起见还是备份一下得好^_^
# cd //进入自己的目录
# vi ports-supfile
其他的就不改了,网上又文章说把ports-all 注释了,再到下面去修改自己要升级的ports,但是考虑到又些软件的依赖性,免得升级了之后出问题,就不改了,保存退出。
执行升级
# cvsup -g -L 2 ports-supfile
到出现下面的信息就可以啦。
Shutting down connection to server Finished successfully
三、编译内核
# cd sys/i386/conf
# cp GENERIC kernel_ipfw
#取消控制台按Ctrl+Alt+Del重启
options SC_DISABLE_REBOOT
#启用内核防火墙
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=10
#options IPFIREWALL_DEFAULT_TO_ACCETP
另外,防火墙编译进去后,默认是拒绝所有连接得,即它当中最后有一条默认的规则编号65535这一条:deny ip from any to any是启用的。但是我们可以在编译内核时加上:
optins IPFIREWALL_DEFAULT_TO_ACCETP,这样默认情况下,防火墙时对外开放的,不过我们这里没有把这个编译进去,需要时自己修改防火墙的设置吧,这样比较放心,^_^ 因为我们这里不做网关,其他的的详细设置也就不加进去。
其他的内核设置看机器的具体情况而定,这里不做多讲。
编辑完成之后执行:
# /usr/sbin/config/kernel_ipfw
# cd ../compile/kernel_ipfw
# make celandepend && make depend
# make && make install clean
如果出现错误,看提示做相关更改,完成之后reboot,进入系统执行uname -a看看是否成功。
四、系统参数设置
在启动项中加入配额以及防火墙选项:
加入下面内容:
sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enbale="NO"
sendmail_msp_queue_enable="NO"
#因为我们不配置mail服务器,也用不着sendmail就全部禁用吧。
update_motd="NO"
# 启动登录时老出现这个信息界面,比较烦人,去掉,顺便把etc目录下面的motd文件里面的东西清光
firewall_enable="YES"
firewall_quiet="NO"
firewall_logging="YES"
tcp_drop_synifn="NO" 做web服务器时这项要改成NO,而不能是YES.
tcp_restric_rst="YES"
tcpdrop_redirect="YES"
这里需要说明的是,就是防火墙启用之后默认的规则是
deny ip from any to any
这个上面说过了,但是我在以前做的FreeBSD 4.10版本的系统中加了
ipfw add allow ip from any to any
之后防火墙就是完全开放了,但是在这个6.1的版本中我加了这条依然是无效,可能版本不一样ipfw的检查机制也不一样了吧,既然无效,那就只能是换其他的方法了,
幸好我这里还有一个其他的方法^_^
firewall_type="open"
重启机器,这样防火墙就是对外开放了,不知道这条在4.10的系统中是不是有用,有机会去试试。防火墙启用之后可能我们原来的网络地址会不生效了,执行sysinstall重新设置一下ip地址等网络设置。
五、ipfw规则设置
上面我们设置了firewall_type="open"
这个是让防火墙完全开放,现在我们来具体设置防火墙的规则:
增加下面内容:
#!/bin/sh
# DNS服务器与客户端的通讯端口都是udp的53号端口,因此我们只有开放自己与DNS服务器之间的53号端口进行通信即可,如果你知道自己的DNS服务器的ip地址可以把下面的any改成你的DNS地址。
# DNS
ipfw add allow udp from me to any 53 out
ipfw add allow udp from any 53 to me in
# DHCP的服务器与客户端的通讯端口是udp 67、68端口,其工作原理这里不多做介绍,如果你知道自己的DHCP服务器地址可以把其中的any改成你的DHCP服务器地址,前面两条是正常情况下的规则,如果你的DHCP服务器不是很可靠,你可以加上下面注释掉的两条,当然一般情况下这两条可以不加。
# DHCP
ipfw add allow udp from me 68 to any 67 out
ipfw add allow udp from any 67 to me 68 in
# ipfw add allow udp from any 68 to 255.255.255.255 67 out
# ipfw add allow udp from any 67 to 255.255.255.255 68 in
# 在创建与ICMP有关的规则时,只能指定ICMP数据包的type而不能指定它的code。
# 允许接受一些ICMP types (不支持codes)
###########允许双向的path-mtu
ipfw add allow icmp from any to any icmptypes 3
ipfw add allow icmp from any to any icmptypes 4
我需要考虑是否需要ping我的网络之外的主机或运行traceroute命令,由于二者都需要,并希望收到相应的应答,但我并不希望互联网上的所有用户都可以对我运行ping 或traceroute命令,因此,我需要添加下面的规则:
###########允许我对外部的主机运行ping命令,并得到相应的应答
ipfw add allow icmp from me to any icmptypes 8 out
ipfw add allow icmp from any to me icmptypes 0 in
###########允许我运行traceroute命令
ipfw add allow icmp from any to any icmptypes 11 in
# ICMP type 8是一个查询请求,ICMP type 0是对查询请求的应答。由于我只允许反复地发出请求并接受应答,从而我可以ping别人而别人不能ping我。
如果想别人也能ping到自己的话,只需要把上面的规则相对设置一下:
ipfw add allow icmp from any to me icmptype 8 inipfw add allow icmp from me to any icmptype 0 out
# 在运行traceroute命令时,就会向外发出UDP数据包。如果希望能够获得所有应答信息,我还必须允许系统接受所有的CMP type 11数据包。
####### TCP类型服务 ##########
# 只允许向外发送信息包
ipfw add check-state
ipfw add deny tcp from any to any in established
ipfw add allow tcp from any to any out setup keep-state
# 允许ssh等tcp端口的服务
ipfw add allow tcp from any to me 21,22,80,3306 in
ipfw add allow tcp from me 22 to any out
# 由于web服务通过80端口进来,但是出去的数据是随机的,所以还得再加一条:
ipfw add allow tcp from me to any out
但是是由于对ipfw了解不深,根据一般的防火墙的检验规则都是数据通讯先从客户端发个请求从某个端口进来,防火墙检验过后再让数据从哪个特定的或者是随机的选一个端口让数据出去,再出去时再检查状态,但是我不知道加了这条之后会不会允许不需要外面先请求进来而系统内部可以主动的向外发送数据,而不加阻拦和检查,如果是这样的话那是相当的危险,做为服务器,客户随便上传一个木马什么的不是允许出去了么?而之前上面的那两条check state是不是还起检查作用,我不知道,这个有待学习研究。