3

IPFW防火墙-FreeBSD

 2 years ago
source link: https://garywu520.github.io/2022/07/28/IPFW%E9%98%B2%E7%81%AB%E5%A2%99-FreeBSD/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

IPFW防火墙-FreeBSD

2022-07-28

字数统计: 864字

  |   阅读时长≈ 3分

IPFireWall(简称:IPFW),IPFW 是为 FreeBSD 编写的状态防火墙

数据包处理流程:

  • 首先:会将其与规则集中的第一个规则进行比较,并一次处理一个规则,按顺序从上到下移动。

  • 当数据包与规则的选择参数匹配时,将执行规则的操作,并终止对规则集的搜索以查找该数据包。这被称为“首次匹配成功”。

  • 如果数据包与任何规则都不匹配,则会被强制使用IPFW 默认规则(编号:65535)捕获,该规则会拒绝所有数据包并以静默方式丢弃它们。

  • 但是也有例外,如果数据包与包含 countskiptotee 关键字的规则匹配,则搜索将继续。

1. 自定义规则集文件

cat /etc/ipfw.rules

#!/bin/sh
#IPFW-Type Mode: closed(Default: Deny All)

#flush rules
ipfw -q -f flush

#Set ENV
CMD="ipfw add"
NicName="vmx0"

#Allow lo0
$CMD 00010 allow all from any to any via lo0

#------------------------------ Block IP or IP_Range --------------------------------------#
$CMD 00101 deny ip from xx.xx.xx.xx/32 to any in

#--------------------------------------------- In ------------------------------------------------#
#Allow SSH
$CMD 10001 allow tcp from any to me 22 in via $NicName setup limit src-addr 2
#Allow (From Outside ping me) icmp ping
$CMD 10002 allow icmp from any to any in via $NicName keep-state
#Allow (From Outside access local) DNS Port 53
$CMD 10003 allow tcp from any to any 53 in via $NicName keep-state
$CMD 10004 allow udp from any to any 53 in via $NicName keep-state
#Allow ISP's DHCP
$CMD 10005 allow udp from me 68 to any 67 out
$CMD 10006 allow udp from any 67 to me 68 in

#Allow Other TCP Service
$CMD 10007 allow tcp from any to me 80,443,3306,27017 in via $NicName setup limit src-addr 2

#--------------------------------------------- Out --------------------------------------------------#
$CMD 20000 allow all from any to any out via $NicName keep-state

注意事项:

  • 规则第2列RULE_NUMBER取值范围: 1-65534,用于规则的处理顺序,多个规则如果编号相同则并行处理。

  • 如上大部分规则均为Allow,这是因为防火墙类型(sysrc firewall_type=”closed”)设置成了白名单模式

    “closed”表示:完全禁止除回环设备之外的全部 IP 流量(即默认全部拒绝,然后开启白名单)

2. 启用IPFW

#---------注:以下命令将会把参数写入/etc/rc.conf文件中(当然也可以手动粘贴到文件中)---------------#

#将系统配置为在引导时启用IPFW
sysrc firewall_enable="YES"

# 值为“open”表示:使用FreeBSD提供的默认防火墙类型
sysrc firewall_type="closed" #完全禁止除回环设备之外的全部 IP 流量, 即默认全部拒绝,然后开启白名单

#加载自定义规则集文件
sysrc firewall_script="/etc/ipfw.rules"

#开启 syslogd 日志记录
sysrc firewall_logging="YES"

#通过专用接口ipfw0启用日志记录
sysrc firewall_logif="YES"

规则记录次数限制

#限制每次连接尝试记录规则的次数(需要重启系统生效)
echo "net.inet.ip.fw.verbose_limit=5" >> /etc/sysctl.conf
#使用 tcpdump 查看正在记录的实时内容
tcpdump -t -n -i ipfw0

#查看IPFW文本日志
tail -100f /var/log/security
tail -100f /var/log/messages

启用IPFW

service ipfw start|stop|restart|status

3.IPFW常用命令

#列出所有正在运行的规则
$ ipfw list

#列出所有正在运行的规则(带有上次匹配规则的时间戳)
$ ipfw -t list

#列出了匹配规则的记帐信息和数据包计数以及规则本身。第一列是规则编号,后跟匹配的数据包和字节数,后跟规则本身。
$ ipfw -a list

#同时列出静态规则和动态规则
$ ipfw -d list

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK