IPFW介绍
IPFIREWALL (IPFW,IP 防火墙) 是一款由 FreeBSD 发起的防火墙应用软件,它由 FreeBSD 项目编写和维护。
ipfw 在基本系统的内核(GENERIC)作为可加载模块而存在。
启用方式一: 编译内核
IPFW内核选项
在我们自己编译FreeBSD内核时候,ipfw有几个选项可以设置
            
            
              sh
              
              
            
          
          options IPFIREWALL   # 开启IPFW防火墙
options IPFIREWALL_VERBOSE  # 开启IPFW冗余信息检索
options IPFIREWALL_VERBOSE_LIMIT=3  # 设置冗余信息重复数为3
options IPFIREWALL_DEFAULT_TO_ACCEPT  # 设置IPFW防火墙默认放行流量
options IPFIREWALL_NAT   # 开启IPFW内核级NAT
options DUMMYNET  # 流量整形
options LIBALIAS  # 对NAT的库支持
options HZ=2000 # 调整心跳时钟,影响防火墙的延时选项内核配置文件在/sys/amd64/conf/目录下的GENERIC

拷贝内核配置文件
我们将默认的内核配置文件拷贝为一个新的配置文件
            
            
              sh
              
              
            
          
          root@freebsd14_node1:/sys/amd64/conf # cp GENERIC postkarte修改内核名称
编辑postkarte内核配置文件,修改ident选项为postkarte和文件名称相同

内核配置中包含一个防火墙相关配置文件
我们新创建一个防火墙相关内核配置文件,在内核配置文件中使用include包含进来

ipfw_kern文件内容如下
            
            
              sh
              
              
            
          
          root@freebsd14_node1:/sys/amd64/conf # cat ipfw_kern 
options IPFIREWALL   
options IPFIREWALL_VERBOSE 
options IPFIREWALL_VERBOSE_LIMIT=3 
options IPFIREWALL_DEFAULT_TO_ACCEPT 
options IPFIREWALL_NAT
options DUMMYNET
options LIBALIAS
options HZ=2000 检查内核配置是否有问题
            
            
              sh
              
              
            
          
          root@freebsd14_node1:/sys/amd64/conf # config postkarte 
Kernel build directory is ../compile/postkarte
Don't forget to do ``make cleandepend && make depend''
编译内核
            
            
              sh
              
              
            
          
          root@freebsd14_node1:/sys/amd64/conf # cd ../compile/postkarte
root@freebsd14_node1:/sys/amd64/compile/postkarte # make cleandepend && make depend && make && make install && reboot注: 编译比较耗时。
启用方式二: 加载IPFW内核模块
IPFW内核模块
            
            
              sh
              
              
            
          
          ipfw_load=YES
ipfw_nat_load=YES
libalias_load=YES
dummynet_load=YES添加内核模块配置
修改/boot/loader.conf文件, 该文件是 FreeBSD 系统中的一个重要配置文件,它用于控制系统的引导加载程序(boot loader)的行为。这个文件在系统启动过程中被读取,用于设置内核加载参数和系统启动时的各种选项,添加内容如下
            
            
              sh
              
              
            
          
          root@freebsd14_node1:~ # cat /boot/loader.conf
kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"
cryptodev_load="YES"
zfs_load="YES"
ipfw_load=YES
ipfw_nat_load=YES
libalias_load=YES
dummynet_load=YES
net.inet.ip.fw.verbose=1
net.inet.ip.fw.verbose_limit=3
net.inet.ip.fw.default_to_accept=1
重启系统
警告
IPFW 默认会有一条规则,规则号为
65535,是不可以删除的:这条规则会把所有流量都切断。故在未配置好防火墙前,请勿启动 IPFW,否则就会面临被阻挡在防火墙之外的麻烦。
            
            
              sh
              
              
            
          
          root@freebsd14_node1:~ # reboot查看当前防火墙规则
使用ipfw list查看列表,可以看到65535最后一条规则。该规则是IPFW默认规则,是不可以删除的:这条规则有可能会把所有流量都切断。故在未配置好防火墙前,请勿启动 IPFW,否则就会面临被阻挡在防火墙之外的麻烦。
            
            
              sh
              
              
            
          
          root@freebsd14_node1:~ # ipfw list
65535 allow ip from any to any因为在/boot/loader.conf中配置了net.inet.ip.fw.default_to_accept=1, 所以第65535条规则是允许所有流量,如果不配置默认会拒绝所有。

查看内核载入的模块
            
            
              sh
              
              
            
          
          root@freebsd14_node1:~ # kldstat 
Id Refs Address                Size Name
 1   44 0xffffffff80200000  1f41458 kernel
 2    2 0xffffffff82142000    49540 ipfw.ko
 3    1 0xffffffff8218d000   5e9340 zfs.ko
 4    1 0xffffffff82777000     7808 cryptodev.ko
 5    2 0xffffffff8277f000    15130 libalias.ko
 6    1 0xffffffff82795000     76a8 ipfw_nat.ko
 7    1 0xffffffff8279d000    26408 dummynet.ko
 8    1 0xffffffff83018000     3220 intpm.ko
 9    1 0xffffffff8301c000     2178 smbus.ko
10    1 0xffffffff8301f000     3360 uhid.ko
11    1 0xffffffff83023000     3360 wmt.ko
启用方式三: 修改/etc/rc.conf文件
开机启动防火墙
            
            
              sh
              
              
            
          
          sysrc firewall_enable="YES"启动防火墙
警告
IPFW 默认会有一条规则,规则号为
65535,是不可以删除的:这条规则会把所有流量都切断。故在未配置好防火墙前,请勿启动 IPFW,否则就会面临被阻挡在防火墙之外的麻烦。
            
            
              sh
              
              
            
          
          service ipfw start查看防火墙规则列表
使用ipfw list查看列表,可以看到65535最后一条规则。该规则是IPFW默认规则,是不可以删除的:这条规则会把所有流量都切断。故在未配置好防火墙前,请勿启动 IPFW,否则就会面临被阻挡在防火墙之外的麻烦。
            
            
              sh
              
              
            
          
          root@freebsd14_node1:~ # ipfw list
00100 allow ip from any to any via lo0
00200 deny ip from any to 127.0.0.0/8
00300 deny ip from 127.0.0.0/8 to any
00400 deny ip from any to ::1
00500 deny ip from ::1 to any
00600 allow ipv6-icmp from :: to ff02::/16
00700 allow ipv6-icmp from fe80::/10 to fe80::/10
00800 allow ipv6-icmp from fe80::/10 to ff02::/16
00900 allow ipv6-icmp from any to any icmp6types 1
01000 allow ipv6-icmp from any to any icmp6types 2,135,136
65535 deny ip from any to any可以看到只使用firewall_enable="YES"配置的话默认会拒绝,所以我们还要添加接下来的的相关rc配置
其他 RC 配置
            
            
              sh
              
              
            
          
          sysrc firewall_type="open"  # 允许任何访问。如果不这么做,会调用默认规则 65535------deny ip from any to any,拒绝所有 IP。你就只能去物理机上再操作了。基本等同于 net.inet.ip.fw.default_to_accept=1,该配置可以在/boot/loader.conf中设置
sysrc firewall_script="/etc/rc.firewall"  # 指定 ipfw 规则的路径,在此处编辑规则
sysrc firewall_logging="YES"  # 这样 ipfw 就可以打印日志
sysrc firewall_logif="YES"  # 把日志打印到 `ipfw0` 这个设备里firewall_type="open"的作用其实是匹配/etc/rc.firewall中的一条一个配置添加一些防火墙规则。(不推荐,因为刷新清空防火墙规则的话会被清除,推荐使用 net.inet.ip.fw.default_to_accept=1这个内核配置参数)

添加firewall_type="open"后再次查看防火墙规则
        
            
            
              sh
              
              
            
          
          root@freebsd14_node1:~ # ipfw list
00100 allow ip from any to any via lo0
00200 deny ip from any to 127.0.0.0/8
00300 deny ip from 127.0.0.0/8 to any
00400 deny ip from any to ::1
00500 deny ip from ::1 to any
00600 allow ipv6-icmp from :: to ff02::/16
00700 allow ipv6-icmp from fe80::/10 to fe80::/10
00800 allow ipv6-icmp from fe80::/10 to ff02::/16
00900 allow ipv6-icmp from any to any icmp6types 1
01000 allow ipv6-icmp from any to any icmp6types 2,135,136
65000 allow ip from any to any
65535 allow ip from any to any