Chinaunix首页 | 论坛 | 博客
  • 博客访问: 194312
  • 博文数量: 21
  • 博客积分: 2784
  • 博客等级: 少校
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-09 23:41
文章分类

全部博文(21)

文章存档

2012年(1)

2010年(1)

2008年(19)

最近访客

分类: BSD

2008-08-03 23:26:28

FREEBSD ipfw设置

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
阅读(3253) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~