ipfw
一、ipfw简介
Freebsd下最常见的防火墙叫IP FireWall,中文字面意思叫IP防火墙,简称IPFW。
二、配置ipfw
1、准备工作
# cd /sys/i386/conf/
如果提示没有这个目录,那说明你的系统没有安装ports服务,要记住装上。
#cp GENERIC ./kernel_IPFW
2、内核规则
用编辑器打开kernel_IPFW这个文件,在该文件的末尾加入以下四行内容:
# vi kernel_IPFW
options IPFIREWALL
将包过滤部分的代码编译进内核
options IPFIREWALL_VERBOSE
启用通过Syslogd记录的日志;如果没有指定这个选项,即使你在过滤规则中指定了记录包,也不会真的记录它们
options IPFIREWALL_VERBOSE_LIMIT=10
限制通过Syslogd记录的每项包规则的记录条数。如果你受到了大量的攻击,想记录防火墙的活动,但又不想由于Syslog
洪水一般的记录而导致你的日记写入失败,那么这个选项将会很有用。有了这条规则,当规则链中的某一项达到限制数值时,
它所对应的日志将不再记录。
options IPFIREWALL_DEFAULT_TO_ACCEPT
这句是最关键的。将把默认的规则动作从 “deny” 改为 “allow”。这句命令的作用是,在默认状态下,IPFW会接受任何
的数据,也就是说服务器看起来像没有防火墙一样,如果你需要什么规则,在安装完成后直接添加就可以了
三、编译系统内核
1、#/usr/sbin/config kernel_IPFW
执行结束后会出现如下提示:Kernel build directory is ../compile/kernel_IPFW Don't forget to do a make depend'
2、#cd ../compile/kernel_IPFW
在这个地方注意一下,Freebsd 4.X版本是../../compile/kernel_IPFW,但Freebsd 5.0版本却是../compile/kernel_IPFW
3、#make
#make install
4、查看是否编译成功
#uname -a
# kldstat
Id Refs Address Size Name
1 2 0xc0100000 4547d4 kernel
2 1 0xc2134000 15000 linux.ko
四、加载启动项
编译完成了,我们要让系统自动启动IPFW并记录日志,需要进行如下操作:
1、编辑器编辑/etc/rc.conf
加入如下参数:
firewall_enable="YES"
激活Firewall防火墙
irewall_script="/etc/rc.firewall"
Firewall防火墙的默认脚本
firewall_type="open"
从/etc/rc.firewall或包含规则集的文件中的防火墙类型中指定防火墙类型。 /etc/rc.firewall中可选的防火墙类型为:
open-不限制IP访问;closed-禁止除通过lo0进行的之外的所有IP服务; client-对工作站的基本保护;simple-对LAN
的基本保护。如果给的是一个指定的文件名,则必须使用全路径名
firewall_script="/etc/ipfw.conf"
Firewall自定义脚本
firewall_quiet="NO"
启用脚本时,是否显示规则信息;假如你的防火墙脚本已经不会再有修改,那么就可以把这里设置成“YES”了。
firewall_logging="YES"
启用Firewall的Log记录
警告: 设置 firewall_logging 的唯一作用是,系统将把 net.inet.ip.fw.verbose sysctl 变量置为 1 。 并没有能够
设置日志限制的 rc.conf 变量,不过这种限制可以通过设置某些 sysctl 变量来完成, 可以手工进行操作, 也可以写到
/etc/sysctl.conf 文件中:
net.inet.ip.fw.verbose_limit=5
2、编辑/etc/syslog.conf文件
在文件最后加入如下内容:
!ipfw
*.* /var/log/ipfw.log
这行的作用是将IPFW的日志写到/var/log/ipfw.log文件里,当然,你也可以为日志文件指定其他目录。
3、#reboot
五、使用并保存规则
1、使用规则
# ipfw show
65535 5294 820413 allow ip from any to any
#ipfw add 10001 deny all from 10.5.3.70 to any
# ipfw show
10001 0 0 deny ip from 10.5.3.70 to any
65535 5673 854504 allow ip from any to any
2、保存规则
# vi /etc/rc.firewall
查找到open
添加ipfw add 10001 deny all from 10.5.3.70 to any
# sh /etc/rc.firewall all (生效)
Flushed all rules.
10001 deny ip from 10.5.3.70 to any
或
# /etc/netstart
# ipfw show
10001 0 0 deny ip from 10.5.3.70 to any
65535 6712 791642 allow ip from any to any
六、ipfw命令
按顺序列出所有的规则:
# ipfw list
列出所有的规则, 同时给出最后一次匹配的时间戳:
# ipfw -t list
列出所有的记账信息、 匹配规则的包的数量, 以及规则本身。 第一列是规则的编号,随后是发出包匹配的数量, 进入
包的匹配数量, 最后是规则本身。
# ipfw -a list
列出所有的动态规则和静态规则:
# ipfw -d list
同时显示已过期的动态规则:
# ipfw -d -e list
将计数器清零:
# ipfw zero
只把规则号为 NUM 的计数器清零:
# ipfw zero NUM
七、IPFW 规则集
规则集是一组根据包中选择的数值使用 allow 或 deny 写出的 ipfw 规则。在两个主机之前的双向包交换组成了一次会
话交互。 防火墙规则集, 会对同一个包处理两次:第一次是包从公网上到达防火墙时, 而第二次则是包返回 Internet
公网上的主机时。 每一个 TCP/IP 服务 (例如 telnet, www, mail, 等等), 都有事先定义好的协议, 以及一个端口号。
这可以作为建立允许或阻止规则时的基本选择依据。当有数据包进入防火墙时, 会从规则集里的第一个规则开始进行比较,
并自顶向下地进行匹配。 当包与某个选择规则参数相匹配时, 将会执行规则所定义的动作,并停止规则集搜索。 这种策
略, 通常也被称作 “最先匹配者获胜” 的搜索方法。如果没有任何与包相匹配的规则, 那么它就会根据强制的 ipfw默
认规则, 也就是 65535 号规则截获。 一般情况下这个规则是阻止包, 而且不给出任何回应。
注意: 如果规则定义的动作是 count、 skipto 或 tee 规则的话, 搜索会继续。这里所介绍的规则, 都是使用了那些包
含状态功能的, 也就是 'keep state'、 'limit'、 'in'/'out'、 或者 'via' 选项的规则。 这是编写包容式防火
墙规则集所需的基本框架。包容式防火墙只允许与规则匹配的包通过。 这样,您就既能够控制来自防火墙后面的机器
请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它
的访问请求都会被阻止, 并记录下来。包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访
问通过。
警告: 在操作防火墙规则时应谨慎行事, 如果操作不当,有可能将自己反锁在外面。
八、ipfw与nat结合实验
1、编译系统内核
# cp GENERIC kernel_IPFW_NAT
用编辑器打开kernel_IPFW_NAT这个文本文件,在该文件里加入以下内容:
options IPFIREWALL //通知操作系统的内核检查每个IP数据包,将它们与规则集进行比较
options IPDIVERT //启用由ipfw divert使用的转向IP套接字。这一选项需要与natd联合使用。
options IPFIREWALL_VERBOSE //向系统的注册程序发送注册信息包。
options IPFIREWALL_VERBOSE_LIMIT=100 //限制一台机器注册的次数。
options IPSTEALTH //启动支持秘密转发的代码,这一选项在使防火墙不被traceroute和类似工具
发现时很有用。
options ACCEPT_FILTER_DATA
options ACCEPT_FILTER_HTTP //接受过滤器中的静态连接
options ICMP_BANDLIM //ICMP_BANDLIM根据带宽限制产生icmp错误。一般情况下我们需要这个选项,
它有助于你的系统免受D.O.S.攻击。
把以上参数加入以后保存kernel_IPFW_NAT文件。
#/usr/sbin/config kernel_IPFW_NAT
#cd ../../compile/kernel_IPFW_NAT
#make
#make install
2、编辑/etc/rc.conf配置文件
ifconfig_rl0="inet 10.5.1.155 netmask 255.255.255.0" //IP
ifconfig_rl0_alias0="inet 192.168.1.1 netmask 255.255.255.0" //虚拟IP
gateway_enable="YES" //启动网关
natd_interface="rl0" //NATD服务启用在哪块网卡
natd_enable="YES" //激活NATD服务
natd_flags="-config /etc/natd.conf" //NATD服务参数设置文件
defaultrouter="10.5.1.10" //默认路由
firewall_enable="YES" //激活firewall防火墙
firewall_type="/etc/ipfw.conf" //firewall自定义脚本
firewall_script="/etc/ipfw.conf"
firewall_quiet="NO" //起用脚本时,是否显示规则信息。现在为“NO”假如
你的防火墙脚本已经定型,那么就可以把这里设置成“YES”了
firewall_logging="YES" //启用firewall的log记录
3、编辑/etc/syslog.conf配置文件
在文件最后加入如下内容:
!ipfw
*.* /var/log/ipfw.log
这行的作用是将IPFW的日志写到/var/log/ipfw.log文件里,当然,你也可以为日志文件指定其他目录
4、编辑/etc/ipfw.conf配置文件
ipfw add 00400 divert natd ip from any to any via rl0 //natd服务启动设置
ipfw add 00401 deny log ip from any to any ipopt rr
ipfw add 00402 deny log ip from any to any ipopt ts
ipfw add 00403 deny log ip from any to any ipopt ssrr
ipfw add 00404 deny log ip from any to any ipopt lsrr
ipfw add 00405 deny tcp from any to any in tcpflags syn,fin //这5行是过滤各种扫描包
ipfw add 00501 allow tcp from 10.5.3.105 to 192.168.1.1 22 in
ipfw add 00502 allow tcp from any to 192.168.1.3 80 in //192.168.1.3是内部的WEBIP
ipfw add 19997 check-state
ipfw add 19998 allow tcp from any to any out keep-state setup
ipfw add 19999 allow tcp from any to any out //这三个组合起来是允许内部网络访问出去,
如果想服务器自己不和Internet进行tcp连接
出去,可以把19997和19998去掉。(不影响
Internet对服务器的访问)
ipfw add 10002 allow all from 10.5.3.105 to any
ipfw add 10003 allow all from 192.168.1.0/24 to any
ipfw add 00503 allow tcp from 10.5.3.70 to 192.168.1.1 22 in
5、编辑/etc/natd.conf配置文件
log yes //启动natd的log记录
redirect_port tcp 192.168.1.3:80 10.5.1.155:80
redirect_port tcp 192.168.1.1:22 10.5.1.155:22
# ps auxwww |grep natd
root 81 0.0 0.1 476 324 ?? Ss 9:15PM 0:00.04 /sbin/natd -config /etc/natd.conf -n rl0
6、测试
测试OK