FreeBSD_11-系统管理——{Part_8 - IPFW}
内核支持
- 方式一:静态編译进内核
options IPFIREWALL # enables IPFW
options IPFIREWALL_VERBOSE # enables logging for rules with log keyword
options IPDIVERT # enables NAT
options DUMMYNET # enables DUMMYNET- 方式二:动态装载模块
# /boot/loader.conf
ipfw_load="YES"
配置文件
- /etc/rc.conf[.local]
firewall_enable="YES"
firewall_logging="YES"
# 在 /usr/local/etc/rc.d 下自定义开机脚本或在此添加以下任意一条
firewall_type="/PATH.../RULE_FILE" #指定包含自定义配置规则的文件
firewall_script="/PATH.../IPFW_SCRIPT" #指定具有执行权限的 ipfw rule 脚本
SYSCTL
- sysctl net.inet.ip.fw.default_to_accept=1 #默认为 0,即 deny 所有连接;此项为 readonly 参数,只能在 loader.conf 中设定
- sysctl net.inet.ip.fw.enable=0 #停用 ipfw,相当于 ipfw disable firewall,系统安全級别为 3 时,无法关闭
- sysctl net.inet6.ip6.fw.enable=0 #同上,针对 ipv6
- sysctl net.inet.ip.fw.verbose=0 #停止记录详细信息
- sysctl net.inet.ip.fw.verbose_limit=0 #同一连接的消息重复记录的次数,设为 0 表示不限制
- sysctl net.inet.ip.fw.tables_sets=9 #设置默认情况下 RULE 的归属集合(SET),默认是 0,即第一个 SET,可以设置为 0-30 之间的数字
語法概要
- ipfw add RULE_NUMBER set SET_NUMBER ACTION log LOG_AMOUNT PROTO from SRC SRC_PORT to DST DST_PORT OPTIONS
- 规则执行順序(优先級):按 RULE_NUMBER(1-65534) 顺序执行,若多条规则拥有同样的规则号码,则按创建的时间順序执行
- SET_NUMBER:规则集合序号(0-31),多条规则作为一組形成一个集合 SET
- ACTION:可以为 pass(放行)、drop(丢弃)、check-state(检查 keep-state 创建的动态规则)、count(仅用作计数,不做为匹配成功的条件)、skipto ANOTHER_RULE(在规则之间进行逻辑跳转)、divert ANOTHER_PORT(端口间转发,不改变地址)等
- LOG_AMOUNT:ipfw 可以通过 syslogd 将信息写到日志文件的 security facility 中,可在创建规则时指定每条规则可以记录的最大日志数量,若不指定,则取 net.inet.ip.fw.verbose_limit 的值为准,可以通过 ipfw resetlog 命令清空计数
- PROTO:指定当前规则针对的网络协议,如 tcp、udp、icmp、sctp 等几乎所有现存协议均适用,all 或 ip 指作用于所有协议
- SRC:源地址(IPv4、IPv6),可以为单个地址(10.0.0.2)、整个子网(e.g,10.0.0.0/16)、包含多个地址的 table、me(本机 IPv4)、me6(本机 IPv6) 等
- SRC_PORT:端口号(/etc/services 中列出的知名服务可以以其名称代替端口号),留空则表示针对所有端口
- OPTIONS:可选项,值可以为 in(仅针对流入的报文)、out(仅针对流出的报文)、limit(src-addr src-port、dst-addr dst-port 等,用于限制源 IP 或 目标 IP 的连接数量)、icmptypes(仅在 PROTO 的位置指定为 icmp 时有效,如 ping 用的是类型 0,重定向用的是类型 5...)、keep-state(创建动态规则,允许当前规则对应的返回报文通过 ipfw)、via(指定网卡) 、setup(仅对 tcp 协议有效,这是 “tcpflags syn,!ack” 的别名简写,指本主机主动发起的对外连接请求可以通过,但本机响应外部主机请求的报文不能通过)等
語法详解
- FIREWALL CONFIGURATION
- ipfw [-q] add rule #-q 静默模式,不显示任何回应信息
- ipfw [-defnNStT] [set N] show [rule | first-last ...] #-d 同时显示动态规则,-e 显示已经失效(expired)的动态规则,-f 返回任何信息,-n 仅测试語法不真正执行,-N 尝试解析地址与服务名,-S 显示指定规则所属的集合序号,-t 显示时间,-T 显示 UNIX 记元至今的秒数
- ipfw [-f | -q] [set N] flush #清空指定集合内的所有规则,默认是序号为 0 的集合
- ipfw [-q] [set N] {delete | zero | resetlog} [number ...] #删除集合中指定的规则或清空其计数
- ipfw set [disable number ...] [enable number ...] #禁用或启用指定的规则集合
- ipfw set move [rule] number to number #将集合中的全部或指定规则追加至目标集合
- ipfw set swap number number #交换两个集合的序号
- SYSCTL SHORTCUTS
- ipfw enable {firewall | altq | one_pass | debug | verbose | dyn_keepalive} #启用指定的功能模块
- ipfw disable {firewall | altq | one_pass | debug | verbose | dyn_keepalive} #禁用
- LOOKUP TABLES
- ipfw [set N] table name create create-options
- ipfw [set N] table name destroy
- ipfw [set N] table name modify modify-options
- ipfw [set N] table name swap name
- ipfw [set N] table name add table-key [value]
- ipfw [set N] table name add [table-key value ...]
- ipfw [set N] table name atomic add [table-key value ...]
- ipfw [set N] table name delete [table-key ...]
- ipfw [set N] table name lookup addr
- ipfw [set N] table name lock
- ipfw [set N] table name unlock
- ipfw [set N] table {name | all} list
- ipfw [set N] table {name | all} info
- ipfw [set N] table {name | all} detail
- ipfw [set N] table {name | all} flush
- DUMMYNET CONFIGURATION (TRAFFIC SHAPER AND PACKET SCHEDULER)
- ipfw {pipe | queue | sched} number config config-options
- ipfw [-s [field]] {pipe | queue | sched} {delete | list | show} [number ...]
- INTERNAL DIAGNOSTICS
- ipfw internal iflist
- ipfw internal talist
- ipfw internal vlist
Tips
- 若不指定 in 与 out,ipfw 同时作用于出入报文
- 规则中可以使用 and、or、not 等逻辑判断
- 多个网址或端口可以复合书写,最外层的 { ... } 与其中内容之间必須留有空格
- ipfw add pass all from { 10.1.2.0/24{20,35,66,18} or 10.2.3.0/28{6,3,11} } to any
示例一:
试验场景——本机开启路由功能,充当内网的 Gateway
#!/bin/sh
#更改默认的 65535 条规则为 accept
sysctl net.inet.ip.fw.default_to_accept=
# 清空旧规则
ipfw -q -f flush
# 设置变量
CMD="ipfw -q add"
InterFace="alc0" # 网卡名称
# alc1 指连接内部安全网络的网卡名称
$CMD allow all from any to any via alc1
# 放行回环网口
$CMD allow all from any to any via lo0 ######## 如下为流出报文控制策略 ############################
# 监测动态规则
$CMD check-state
# 允许訪问 DNS 服务器并生成动态规则允许对端响应报文通过
$CMD allow tcp from any to ntp1.nl.net out via $InterFace setup keep-state
$CMD allow udp from any to ntp1.nl.net out via $InterFace keep-state
# 同上,允许 DHCP 服务通过
$CMD allow tcp from any to 113.11.1.3 out via $InterFace setup keep-state
$CMD allow udp from any to 113.11.1.3 out via $InterFace keep-state
# 同上,允许 HTTP 与 HTTPs 通过
$CMD allow tcp from any to any out via $InterFace setup keep-state
$CMD allow tcp from any to any out via $InterFace setup keep-state
# 同上,允许 MAIL 服务通过
$CMD allow tcp from any to any out via $InterFace setup keep-state
$CMD allow tcp from any to any out via $InterFace setup keep-state
# 允许所有内网主动发起的对外 icmp 证求,如 ping 等
$CMD allow icmp from any to any out via $InterFace keep-state
# 允许 NTP 服务请求通过并返回結果
$CMD allow tcp from any to any out via $InterFace setup keep-state
$CMD allow udp from any to any out via $InterFace keep-state
# 允许对外发出 SSH 请求
$CMD allow tcp from any to any out via $InterFace setup keep-state
# 丢弃所有不在以上规则范围内的流出报文
$CMD deny log all from any to any out via $InterFace ############ 如下为流入报文控制策略 ###########################
# 拒绝所有来自不可路由的私有 IP 地址的报文
$CMD deny all from 192.168.0.0/ to any in via $InterFace #内网 IP 段
$CMD deny all from 172.16.0.0/ to any in via $InterFace #同上
$CMD deny all from 10.0.0.0/ to any in via $InterFace #同上
$CMD deny all from 127.0.0.0/ to any in via $InterFace #回环口
$CMD deny all from 0.0.0.0/ to any in via $InterFace #回环口别名
$CMD deny all from 169.254.0.0/ to any in via $InterFace #DHCP 自定义地址
$CMD deny all from 192.0.2.0/ to any in via $InterFace #科学文档测试地址
$CMD deny all from { 204.152.64.0/23 or 20.20.20.0/24 } to any in via $InterFace #已被收购的 SUN 公司远古时代的預留测试地址
$CMD deny all from 224.0.0.0/ to any in via $InterFace #D类与E类組播地址
# 丢弃所有 icmp 请求报文
$CMD deny icmp from any to any in via $InterFace
# 端口是用于 Windows 一种 tcp 认証服务
$CMD deny tcp from any to any in via $InterFace
# 丢弃所有 Windows Netbios 域服务请求
$CMD deny tcp from any to any in via $InterFace
$CMD deny tcp from any to any in via $InterFace
$CMD deny tcp from any to any in via $InterFace
$CMD deny tcp from any to any in via $InterFace
# 丢弃所有到达的非首段分片报文(分片攻击:通过将端口号从第一个分片中剥离绕过防火墙)
$CMD deny all from any to any frag in via $InterFace
# 丢弃所有不符合动态规则的 tcp 响应报文
$CMD deny tcp from any to any established in via $InterFace
# 允许连接本机的 webserver,但限制每个源 IP 至多能建立两个连接
$CMD allow tcp from any to me in via $InterFace setup limit src-addr
# 允许连接本机 SSH 服务,但限制至多建立两个连接
$CMD allow tcp from any to me in via $InterFace setup limit src-addr
# 丢弃不符合以上任一规则的流入报文并将信息记入日志
$CMD deny log all from any to any in via $InterFace
...
# 如果同时设置多个网口的规则,统一丢弃规则外报文
$CMD deny log all from any to any
示例二:
带宽及延迟控制
# 指定网络流入的数据包全部转发至本机 5000 端口
ipfw divert ip from 192.168.2.0/ to any in
# 所有发往本机 77 端口的报文,转交給第 1000 条规则进行处理,第 10 条规则仅定义跳转的条件
ipfw add skipto all from any to me in
# 限制 outbound 方向的最小延迟为 250ms,最大带宽为 1Mbit/s
ipfw add pipe ip from any to any out
ipfw pipe config delay 250ms bw 1Mbit/s...
FreeBSD_11-系统管理——{Part_8 - IPFW}的更多相关文章
- FreeBSD_11 - 系统管理——{ Part_5 - ZFS }
参考資料 http://docs.oracle.com/cd/E37934_01/html/E36658/toc.html https://www.freebsd.org/doc/en_US.ISO8 ...
- 1-linux系统管理(一)之安装RHEL 6.4
linux系统管理之安装RHEL 6.4 进入安装界面 这里选择跳过 点击下一步 选择安装语言 选择键盘 选择系统储存方式 选择是否格式化储存设备 给安装的系统一个计算机名 选择时区 给root一个密 ...
- Linux常用系统管理命令(top、free、kill、df)
top -c #任务管理器 free -m #查看内存使用情况 kill -9 2312 (说明:强制杀死进程 kill -9 pid ) df -h #查看磁盘 ...
- centos7系统管理和运维实战
centos7系统管理和运维实战 centos7安装配置 yum install -y net-tools >/etc/hostname echo "sqlserver01" ...
- AIX 5L 系统管理技术 —— 存储管理——卷组
卷组 在安装系统时,就会创建一个rootvg卷组.包含自带硬盘(内置硬盘)和系统逻辑卷,一个系统只能有一个rootvg卷组.一般情况下rootvg卷组最好只包含自带硬盘. 一.创建卷组 在创建卷组之前 ...
- linux 学习 13 系统管理
第十三讲 Linux系统管理 13.1.1进程管理-进程查看 13.1.2进程管理-终止进程 .2工作管理 .3系统资源查看 .4系统定时任务 13.1.1进程管理-进程查看 .进程简介 进程是正在 ...
- Linux快速入门02-文件系统管理
继续进入Linux文件系统的学习,加油,早日突破MS压在自己身上的那道束缚. Linux系列文章 快速入门系列--Linux--01基础概念 快速入门系列--Linux--02文件系统管理 快速入门系 ...
- Linux磁盘及文件系统管理
在LINUX中我们知道一个很重要的概念,那就是"一切皆文件",这里的一切表示所有在LINUX系统的对象,自然也包括了LINUX中的硬盘设备.在LINUX中所有设备都被抽象成一个文件 ...
- Linux_08------Linux的系统管理
分钟,在随机延迟0-45分钟时间 * 使用nice命令指定默认优先级,使用run-parts脚本执行/etc/cron.daily目录中的所有可执行文件. * */
随机推荐
- 前端用Webpact打包React后端Node+Express实现简单留言版
前言 React官方推荐用Browserify或者Webpack 来开发React组件. Webpack 是什么?是德国开发者 Tobias Koppers 开发的模块加载器.Instagram 工程 ...
- JAVA正则表达式中如何匹配反斜杠 \
有时候我们需要匹配反斜杠,你可能会把对应的正则表达式写成 "\\" 然后可能会有如下输出: Exception in thread "main" java.ut ...
- Curator Cache
1.Curator Cache 与原生ZooKeeper Wacher区别 原生的ZooKeeper Wacher是一次性的:一个Wacher一旦触发就会被移出,如果你想要反复使用Wacher,就要在 ...
- Python学习笔记(1)
从今天开始正式学习python,教程看的是廖雪峰老师的Python 2.7教程.链接在此:http://www.liaoxuefeng.com/wiki/0014316089557264a6b3489 ...
- 也来说说关于未在本地计算机上注册“VFPOLEDB.1”的程序的解决方法
大家都知道VFP是一个非常古老的数据库.但是,还有一些单位用到这些数据库. 前段时间,也做了一个关于DBF数据导出的功能的测试.程序以前有同事写好了,但当我进行修改调试的时候,问题就出来了. 调试的时 ...
- 前端自动化工具gulp自动添加版本号
之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查了资料,发现gulp还可以自动添加版本号,这个功能就为我平时 ...
- BJITJobs : 北京IT圈高端职位招聘信息,成功率最高的高端求职渠道
你有实力,但比你差的人都升了,你的师弟都年薪50万了,你还是找不到机会.为什么你离高端机会总是差一步呢?其实你离成功就差一次机会,一个适合你的高端职位的信息! 招聘网站不靠谱:三大网站都是低端职位为主 ...
- Spring中Aop的扩展及剖析
AOP简介: 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范 ...
- PHP基础面试题
1.PHP的意思? 答:PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页 2.谈谈asp,php,jsp的优缺点? 答:ASP全名Active Server Pag ...
- apache rewrite_mod 经典疑问解答
1.RewriteRule ^(com\/.*)$ index.php?do=$1 问:上面的规则匹配表达式 "^(.*)$" 匹配的内容是什么 答:匹配内容是URI站点目录:/d ...