第 15.3 节 IPFilter(IPF)
IPF(IPFilter,IP 过滤器)是一款开源软件,作者 Darren Reed。以下仅供参考未经测试。
如果想启用 ipf,可以执行以下命令:
# 复制示例文件作为默认配置规则集文件,否则 ipfilter 启动后会没有规则。示例文件自带的规则不影响使用
# cp /usr/share/examples/ipfilter/ipf.conf.sample /etc/ipf.rules
启动 ipfilter
# service ipfilter enable
# service ipfilter start
启动 ipnat
ipnat 是 IPF 的一部分,专门用于处理 NAT 规则的维护。
# 复制示例文件作为默认配置规则集文件,否则 ipnat 无法启动
# cp /usr/share/examples/ipfilter/ipnat.conf.sample /etc/ipnat.rules
# 设置 ipnat 开机启动
# service ipnat enable
# 启动 ipnat
# service ipnat start
注意,ipfilter 服务重启后,ipnat 也需要重启。
ipf 的管理命令主要用 ipf、ipfstat 和 ipnat,常用操作示例如下:
# 启动 ipfilter,相当于 service ipfilter start
ipf -E
# 停止 ipfilter,相当于 service ipfilter stop
ipf -D
# 加载规则集文件中的规则
ipf -f /etc/ipf.rules
# 查看所有规则
ipfstat
# 查看规则,i 表示输入规则,o 表示输出规则,h 表示通过该规则的流量,n 表示记录编号
ipfstat -iohn
# 进入监控模式,按 Q 退出
ipfstat -t
# 清理已加载的规则
ipf -Fa
# 加载规则集文件中的 NAT 规则
ipnat -f /etc/ipnat.rules
# 汇总并显示 NAT 状态
ipnat -s
# 列表显示 NAT 规则,加 h 表示同时显示通过该规则的流量
ipnat -lh
# 清理已加载的 NAT 规则
ipnat -CF
# 以上操作并没有对规则的管理,因此还需要修改规则集文件,常用示例如下:
# 拒绝所有访问
block all # ipfilter 是默认明示禁止的防火墙,因此需要通过下列规则禁止所有访问
# 拒绝所有进入的流量
block in all # block 是动作,block 表示拒绝,pass 表示通过;in 为数据方向,in 为入,out 为出,在 ipfilter 里数据方向是必须的
# all 是 from any to any 的简写,表示从源地址到目标地址,地址通常用网段 (如 192.168.1.0/24) 或 IP 地址 (如 192.168.1.100),any 是特殊词,表示任何地址
# 拒绝所有外部流量
block out all # 放开回环接口的访问权限,回环接口不对外部
# 放行所有回环接口流量
pass in quick on lo0 all # quick 关键字表示若规则匹配,就停止执行,不会再执行后续规则
# 放行所有回环接口输出流量
pass out quick on lo0 all # 放开回环接口的访问权限,回环接口不对外部
# 允许任何设备以 TCP 协议访问本机 80 端口
pass in quick proto tcp from any to 192.168.1.184 port = 80 # proto tcp 是访问协议,常用值有 tcp、udp、tcp/udp、icmp,不写则表示支持所有协议;port = 80 是目标端口
# 允许本机向外发送回显信息
pass out quick proto tcp from 192.168.1.184 to any # 允许回显信息给任何访问的设备
# 增加 80 端口到 8080 端口流量转发的规则
rdr em0 192.168.1.184 port 80 -> 192.168.1.184 port 8080 # 转发流量到本机的 8080 端口,通常用来进行端口映射
# 允许本机通过 ICMP 协议 ping 外部设备
pass out quick proto icmp from 192.168.1.184 to any icmp-type 8 keep state # ICMP type 8 是查询请求,keep state 表示维持状态
# 允许外部设备通过 ICMP 协议 ping 本机
pass in quick proto icmp from any to 192.168.1.184 icmp-type 8 keep state # 允许任何外部设备 ping 本机
# 允许本机通过 ICMP 协议进行 traceroute
pass out quick proto icmp from 192.168.1.184 to any icmp-type 0 # ICMP type 0 是回显应答
# 允许本机通过 UDP 协议进行 traceroute,端口号从 33434 开始,每转发一次端口号加 1
pass out quick proto udp from 192.168.1.184 to any port 33434 >< 34500 keep state # traceroute 默认使用 UDP 协议,端口号从 33434 开始
常用的规则集文件 /etc/ipf.rules
如下:
# 拒绝所有进入的流量
block in all # 拒绝任何来自外部的输入流量
# 拒绝所有外出的流量
block out all # 拒绝任何从本机出去的流量
# 放行回环接口的所有流量
pass in quick on lo0 all # 允许本机与回环接口之间的通信
# 放行回环接口的所有输出流量
pass out quick on lo0 all # 允许回环接口向外发送数据
# 设置任何设备可以访问服务器的 22、80、443、4200、10000 端口
pass in quick proto tcp from any to 192.168.1.184 port = { 22,80,443,4200,10000 } # 允许外部设备通过 TCP 协议访问本机指定端口
# 允许本机向外发送 22、80、443、4200、10000 端口的流量
pass out quick proto tcp from 192.168.1.184 port = { 22,80,443,4200,10000 } to any # 允许本机通过 TCP 协议访问任何外部设备的这些端口
# 允许本机访问外部设备的 80 和 443 端口,并保持连接状态
pass out quick proto tcp from 192.168.1.184 to any port = { 80,443 } keep state # 设置本机访问任何网络设备的 80、443 端口并保持连接状态
# 设置本机访问 DNS 服务器
pass out quick proto udp from any to any port = 53 keep state # 允许本机通过 UDP 协议访问任何 DNS 服务器的 53 端口
# 设置本机访问 DHCP 服务器
pass out quick proto udp from any to any port = 67 keep state # 允许本机通过 UDP 协议访问 DHCP 服务器的 67 端口
# 允许本机向任何外部设备发送 ICMP ping 请求
pass out quick proto icmp from 192.168.1.184 to any icmp-type 8 keep state # ICMP type 8 表示查询请求,keep state 维护状态
# 允许外部设备向本机发送 ICMP ping 请求
pass in quick proto icmp from any to 192.168.1.184 icmp-type 8 keep state # 允许外部设备 ping 本机
# 允许本机向任何外部设备发送 ICMP 回显应答
pass out quick proto icmp from 192.168.1.184 to any icmp-type 0 # ICMP type 0 是回显应答,允许本机响应 ping 请求
# 设置本机使用 UDP 协议进行 traceroute,端口号从 33434 开始,逐步增加
pass out quick proto udp from 192.168.1.184 to any port 33434 >< 34500 keep state # traceroute 默认使用 UDP 协议,端口号从 33434 开始
# 数据转发前要放开相应端口,允许外部设备访问本机 8080 端口
pass in quick proto tcp from any to 192.168.1.184 port = 8080 # 允许外部设备通过 TCP 协议访问本机的 8080 端口
常用的 NAT 规则集文件 /etc/ipnat.rules
如下:
# 设置本机 8080 端口到 80 端口的流量转发
rdr on em0 proto tcp from any to 192.168.1.184 port 8080 -> 192.168.1.184 port 80 # 将来自本机 em0 网卡的 8080 端口流量转发到本机的 80 端口
保存文件,接下来在终端执行命令:
# 清理已加载的所有规则,并加载 /etc/ipf.rules 文件中的规则
ipf -Fa -f /etc/ipf.rules # -Fa 清理所有规则,-f 用来加载指定的规则文件
# 清理已加载的所有 NAT 规则,并加载 /etc/ipnat.rules 文件中的 NAT 规则
ipnat -CF -f /etc/ipnat.rules # -CF 清理 NAT 规则,-f 用来加载指定的 NAT 规则文件
最后更新于