unix功能:ufw和firewalld介绍
网站内部链接:
ufw
介绍
ufw, Uncomplicated Firewall, 其在 Ubuntu 8.04 LTS 后的所有发行版中默认可用, 其图形用户界面为Gufw
, 其是为轻量化配置 iptables 而开发的一款工具, 提供了更加友好的交互逻辑和简便的配置规则.
- ubuntu 上安装 ufw, 默认情况下其已经安装:
apt-get install ufw
- 安装完成之后需要开启 ufw:
ufw enable/disable
格式
命令的基本格式:
1 | # 0. 显示规则并展示规则序号 |
使用
查看当前 ufw 配置的规则, 每一行就是一个规则:
ufw status
打开某个端口或者某个服务, 类似 firewalld, 其中
ufw status
输出的最后一列就是之前设置的端口以及服务
1 | # 1. ftp, 此时设置开启21端口, 可以通过端口来开启 |
- 开启防火墙以及设置日志信息, 设置默认策略
1 | # 1. 查看规则 |
firewalld
介绍
firewalld 是 centos7 之后内置的一款动态防火墙管理器, 其通过”网络/防火墙”空间的方式, 为不同的网络连线或接口定义自身的信任等级. firewall-cmd
则是 firewalld 的字符界面管理工具, 其支持动态更新, 新增防火墙 zone 概念, 相比原始的 iptables 配置, 其有如下两个好处:
- 动态修改单条规则, 然而 iptables 更改某个规则之后需要全部刷新才能生效
- 理解使用更加简便
其他相关工具还有firewall-config
, 其是 firewalld 中可选的图形化配置工具, firewall-applet
是 firewalld 中可选的状态栏小图标程序.
格式
firewalld 命令的基本格式: firewall-cmd options
1 | # 1. 显示状态 |
firewalld 命令的安装和启动配置:
1 | # 1. 安装firewalld |
使用
- 配置 firewalld
1 | # a. 查看设置: |
- 服务 service 管理
1 | # 显示服务列表 |
- 端口管理
1 | # 打开443/TCP端口 |
- 端口转发
1 | firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080 |
ufw,firewalld,iptables 关系
iptables 和 ufw,firewalld
上文已经详细的介绍了 ufw 和 firewalld 的使用, 这里我们简单的梳理下ufw, firewalld, iptables
三者的关系以及互相之间的影响. 首先, 从整个时间轴的角度来看待:
- a. iptables 最先被使用, 其基于 netfilter 用于配置 centos 和 ubuntu 等基于 unix 内核的防火墙
- b. centos7 内置 firewalld 以替代 iptables 作为新的防火墙管理工具, 当然后者仍然能够使用
- c. ubuntu8.04LTS 后内置 ufw 作为新的防火墙管理工具
其次, 从功能角度考虑, ufw 和 firewall 都是对 iptables 的补充和完善, 但是这两者提供了更加友好和更加简单的命令配置为系统管理员提供更加简便快捷的防火墙配置操作, 当然, 这两者底层调用仍然是 iptables, 最终影响到 netfilter 内核.
下面我们通过实际情况来说明配置 ufw 或者 firewalld 是怎么影响到 iptables 的规则输出.
- firewalld 未启动, iptables 未配置任何规则时, 命令
iptables -L
的输出如下:
1 | # 1. 关闭firewalld |
此时, 外部主机访问该服务器没有任何限制, 防火墙处于不设防的状态.
- firewalld 启动并设置某些规则时, 命令的输出如下
1 | # 1. 启动firewalld并设置规则 |
这里 mysql 就是 3306 端口, http 就是 80 端口, 说明通过 firewalld 配置防火墙规则最终也影响到了 iptables 规则.
- firewalld 默认未开启, 关闭 ufw, 此时 iptables 的输出类似上面的 1 测试输出
1 | # 1. 关闭ufw |
- firewalld 默认未开启, 启动 ufw 并设置规则, 此时 iptables 的输出发生变动, 产生新的防火墙规则策略
1 | # 1. 启动ufw |
ufw 和 firewalld
注意, ufw 一般为 ubuntu 系统默认安装的防火墙规则管理软件, firewalld 为 centos 默认按照的防火墙规则管理软件, 这两者是不能同时共存的, 否则会产生冲突, 具体问题可以参考下面的问题描述.
1 | 1. 操作前的系统环境 |
相反的冲突逻辑也是可能存在的, 对于此类问题有如下几个基本的排查步骤:
- 查看服务是否开启:
netstat -anp|grep port
- 查看服务是否开启:
- 查看 firewall 状态, 若开启, 强制关闭(如果你想使用 ufw, 相反则保留 firewalld):
firewall-cmd --state
- 查看 firewall 状态, 若开启, 强制关闭(如果你想使用 ufw, 相反则保留 firewalld):
- 查看 ufw 状态:
ufw status
- 查看 ufw 状态:
netfilter
netfilter 是 unix 内核的包过滤框架(packet filtering framework), 其中 hook 点来注册相应回调处理函数, 其包含 5 个 hook 点, 包经过协议栈时会触发内核模块注册在这里的处理函数, 触发哪个 hook 取决于包的方向, 包的目的地址以及包在上一个 hook 点是被丢弃还是拒绝.
下面几个 hook 是内核协议栈中已经定义好的:
NF_IP_PRE_ROUTING
: 接收到的包进入协议栈后立即触发此 hook,在进行任何路由判断 (将包发往哪里)之前NF_IP_LOCAL_IN
: 接收到的包经过路由判断,如果目的是本机,将触发此 hookNF_IP_FORWARD
: 接收到的包经过路由判断,如果目的是其他机器,将触发此 hookNF_IP_LOCAL_OUT
: 本机产生的准备发送的包,在进入协议栈后立即触发此 hookNF_IP_POST_ROUTING
: 本机产生的准备发送的包或者转发的包,在经过路由判断之后, 将触发此 hook
注册处理函数时必须提供优先级,以便 hook 触发时能按照 优先级高低调用处理函数。这使得多个模块(或者同一内核模块的多个实例)可以在同一 hook 点注册,并且有确定的处理顺序。内核模块会依次被调用,每次返回一个结果给 netfilter 框架,提示该对这个包做什么操作。