FreeBSD启用IPFW防火墙

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

参考文档

相关推荐
我在人间贩卖青春3 天前
UNIX域套接字
unix·套接字
学嵌入式的小杨同学7 天前
【嵌入式 Linux 实战 1】Ubuntu 环境搭建 + 目录结构详解:嵌入式开发入门第一步
linux·c语言·开发语言·数据结构·vscode·vim·unix
先做个垃圾出来………10 天前
Linux/Unix系统下的基础文本处理命令
java·linux·unix
半桶水专家13 天前
什么是 Unix Socket?
服务器·unix
大神与小汪13 天前
STM32上进行Unix时间戳转换
stm32·嵌入式硬件·unix
duxingzhe10314 天前
Unix Network Programming Episode 105
服务器·unix
Kevin-anycode17 天前
如何将自己的应用上传文件功能对接到群辉的NAS上
java·unix
游戏23人生25 天前
正则表达式介绍
servlet·正则表达式·unix
郭涤生1 个月前
第十章_信号_《UNIX环境高级编程(第三版)》_笔记
服务器·笔记·unix
郭涤生1 个月前
第二章_UNIX标准及实现_《UNIX环境高级编程(第三版)》_笔记
unix