FreeBSD防火墙的安装和设置

FreeBSD自带有一个基于包过滤的防火墙——ipfw,虽然功能没有专业防火墙那么强大,但是应付一个Web站点的安全还是足够的,所以我们决定选用该防火墙来保护我们的Web服务器。

1. 安装ipfw
IPFW 的主要部分是在内核中运行的, 因此会需要在FreeBSD内核配置文件中添加部分选项。(注意,如果你没有安装FreeBSD核心源代码,是无法进入以下目录的,所以运行之前一定要先安装内核源代码)我们先进入内核配置文件:

  # cd /sys/i386/conf

  # cp GENERIC ./kernel_fw

  打开内核配置文件:

  # ee ./kernel_fw

  添加四个选项,不需要后面的注释信息:

  options IPFIREWALL # 将包过滤部分的代码编译进内核。

  options IPFIREWALL_VERBOSE

  # 启用通过syslogd记录的日志。如果没有指定这个选项,即使您在过滤规则中指定记录包, 也不会真的记录它们

  options IPFIREWALL_VERBOSE_LIMIT=10

  # 限制通过 syslogd( 记录的每项包规则的记录条数。在恶劣的环境中如果您想记录防火墙的活动, 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击, 那么这个选项将会很有用。

  options IPFIREWALL_DEFAULT_TO_ACCEPT

  # 这将把默认的规则动作从 “deny 改为 “allow.这可以防止在没有配置防火墙之前使用启用过 IPFIREWALL 支持的内核重启时把自己锁在外面。 另外, 如果您经常使用 ipfw( 来解决一些问题时它也非常有用。 尽管如此,在使用时应该小心,因为这将使防火墙敞开, 并改变它的行为。

  编译内核:

  # /usr/sbin/config kernel_fw

  # cd ……/compile/kernel_fw (注意你的版本,如果是低于5.0的版本用……/……/compile/kernel_fw)

  # make depend

  # make

  # make install

重启系统。注意,我们没有选择options IPFIREWALL_DEFAULT_TO_ACCEPT该选项,就是说默认系统启动后是打开防火墙的,并且防火墙默认是不允许任何连接的(deny from any to any),所以一定要在本地操作,否则你将被“锁在门外”,如果你选择了该选项则可以使用ssh等连接不受影响,不过这相对不安全。

2. 配置ipfw
如果配置普通情况下的规则,使用命令配置的模式:

  ipfw的配置命令:ipfw [-N] 命令 [编号] 动作 [log(日志)] 协议 地址 [其它选项]

  例如:

  # ipfw add allow tcp from any to 10.10.10.1 80 #允许外界访问我的web服务

  # ipfw add allow tcp from any to 10.10.10.1 21 #允许外面访问我的ftp服务

  # ipfw add allow tcp from any to 10.10.10.1 22 #允许外界访问我的ssh服务

  如果使用规则包的形式,那么查看下面内容。

  系统启动后,我们还要配置rc.conf文件来运行我们的防火墙:

  # ee /etc/rc.conf

  加入如下内容:

  gateway_enable="YES" # 启动网关

  firewall_enable="YES" # 激活firewall防火墙

  firewall_script="/etc/rc.firewall" # firewall防火墙的默认脚本

  firewall_type="/etc/ipfw.conf" # firewall自定义脚本

  firewall_quiet="NO" # 起用脚本时,是否显示规则信息。现在为“NO”假如你的防火墙脚本已经定型,那么就可以把这里设置成“YES”了。

  firewall_logging_enable="YES" # 启用firewall的log记录。

  设置完成后我们再编辑/etc/syslog.conf文件:

  # ee /etc/syslog.conf

  加入以下行:

  !ipfw

  *.* /var/log/ipfw.log

  现在到了最重要的编辑规则包了:

  # ee /etc/ipfw.conf

  我们添加一下规则:(注意 10.10.10.1是我们服务器的IP)

  ######### TCP ##########

  add 00001 deny log ip from any to any ipopt rr

  add 00002 deny log ip from any to any ipopt ts

  add 00003 deny log ip from any to any ipopt ssrr

  add 00004 deny log ip from any to any ipopt lsrr

  add 00005 deny tcp from any to any in tcpflags syn,fin

  # 这5行是过滤各种扫描包

  add 10001 allow tcp from any to 10.10.10.1 80 in # 向整个Internet开放http服务。

  add 10002 allow tcp from any to 10.10.10.1 21 in # 向整个Internet开放ftp服务。

  add 10000 allow tcp from 1.2.3.4 to 10.10.10.1 22 in

  # 向Internet的xx.xx.xx.xx这个IP开放SSH服务。也就是只信任这个IP的SSH登陆。

  # 如果你登陆服务器的IP不固定,那么就要设为:add 10000 allow tcp from any to 10.10.10.1 22 in

  add 19997 check-state

  add 19998 allow tcp from any to any out keep-state setup

  add 19999 allow tcp from any to any out #这三个组合起来是允许内部网络访问出去,如果想服务器自己不和Internet进行tcp连接出去,可以把19997和19998去掉。(不影响Internet对服务器的访问)

  ########## UDP ##########

  add 20001 allow udp from any 53 to 10.10.10.1 # 允许其他DNS服务器的信息进入该服务器,因为自己要进行DNS解析嘛~

  add 29999 allow udp from any to any out # 允许自己的UDP包往外发送。

  ########## ICMP #########

  add 30000 allow icmp from any to any icmptypes 3

  add 30001 allow icmp from any to any icmptypes 4

  add 30002 allow icmp from any to any icmptypes 8 out

  add 30003 allow icmp from any to any icmptypes 0 in

  add 30004 allow icmp from any to any icmptypes 11 in

  #允许自己ping别人的服务器。也允许内部网络用router命令进行路由跟踪。

 

发表评论

邮箱地址不会被公开。 必填项已用*标注

click to changeSecurity Code