欢迎光临
我们一直在努力

CentOS 7 firewalld 动态防火墙介绍

FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。

更全面的内容可以查看 FirewallD 官网文档

firewalld 最重要的是 zone 区域的概念

什么是区域?
网络区域定义了网络连接的可信等级。这是一个一对多的关系,这意味着一次连接可以仅仅是一个区域的一部分,而一个区域可以用于很多连接。

预定义的区域列表如下, 每个区域都是一个 xml 文件, 保存在 /usr/lib/firewalld/zones/ 中, 不要编辑这里的文件

自定义区域则保存在 /etc/firewalld/zones/ 中, 可以编辑这里的文件, 这里的设置将覆盖 /usr/lib/firewalld/zones/ 中的设置

区域列表, public 是默认区域, 由 firewalld 提供的区域按照从不信任到信任的顺序排序。

drop(丢弃)
    任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(阻塞)
    任何进入的网络连接都被拒绝,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接。
public(公开)
    用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
external(外部)
    用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
dmz(隔离区)
    用以允许隔离区(dmz)中的电脑有限地被外界网络访问。只接受被选中的连接。
work(工作)
    用于工作网络。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
    用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
    用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
    可接受所有的网络连接。

什么是接口?
就是指实际的网卡, 如 eth0, em1. 一个接口只能属于一个区域

什么是服务?
一项服务可以是本地和目的地端口的列表,如果服务被允许的话,也可以是一系列自动加载的防火墙辅助模块。服务通过单个的 XML 配置文件来指定,这些配置文件则按以下格式命名:service-name.xml。

预定义服务保存在 /usr/lib/firewalld/services/ 中
自定义服务保存在 /etc/firewalld/services/ 中

CentOS 7 默认使用 firewalld 防火墙, 如果没有启用. 先启用.

systemctl enable firewalld
systemctl start firewalld

配置防火墙
有两种工具可以配置

firewall-config ,图形界面工具, 需要安装图形界面相关的依赖, 这里就不多介绍了.

firewall-cmd , 命令行工具, 主要使用它来配置防火墙.

在设置命令后加 –permanent 参数才会永久保存, 否则在重新加载配置后会丢失设置.

#查看版本
firewall-cmd --version

#显示帮助
firewall-cmd --help

#查看防火墙状态
firewall-cmd --state

#列出所有支持的icmp类型
firewall-cmd --permanen --get-icmptypes


#列出所有区域
firewall-cmd --permanen --get-zones
#查看当前活动区域
firewall-cmd --get-active-zones

#设置默认区域
firewall-cmd --set-default-zone=public

#列出某个区域的所有设置
firewall-cmd --permanen --zone=public --list-all

#列出所有区域的所有设置
firewall-cmd --permanen --list-all-zones



#把指定的接口加入到某个区域中
firewall-cmd --permanen --zone=public --add-interface=eth0

#修改接口所属区域
firewall-cmd --permanen --zone=public --change-interface=eth0

#从区域中删除一个接口
firewall-cmd --permanen --zone=public --remove-interface=eth0

#查询区域中是否包含某接口
firewall-cmd --permanen --zone=public --query-interface=eth0



#列出所有预定义和自定义服务
firewall-cmd --get-service

#列出某区域已允许的服务
firewall-cmd --permanen --zone=public --list-services

#查询某区域是否启用了某服务
firewall-cmd --permanen --zone=public --query-service=ssh

#为某个区域启用某种服务
firewall-cmd --permanen --zone=public --add-service=ssh

#禁用某区域的某服务
firewall-cmd --permanen --zone=public --remove-service=ssh



#列出某区域的所有端口,定义在服务中的端口不会显示在这
firewall-cmd --permanen --zone=public --list-ports

#为某区域启用端口和协议组合
firewall-cmd --permanen --zone=public --add-port=8080/tcp

#为某区域启用端口范围和协议组合
firewall-cmd --permanen --zone=public --add-port=5060-5061/udp

#为某区域移除某端口
firewall-cmd --permanen --zone=public --remove-port=8080/tcp



#配置伪装 IP 地址
#查询是否支持伪装
firewall-cmd --permanen --zone=external --query-masquerade

#允许ip伪装
firewall-cmd --permanen --zone=external --add-masquerade

#禁用ip伪装
firewall-cmd --permanen -zone=external --remove-masquerade



#配置端口转发, 首先用上面的命令启用ip伪装
#本来要送到 22 端口的程序包现在被转发到 3753 端口。
#源目的端口用 port 选项指定。这个选项可以是一个端口,或者一组端口范围并加上协议。如果指定协议的话,这个协议必须是 tcp 或 udp。
#这个新的本地端口,即流量被转发过去的端口或者端口范围,需用 toport 选项指定。
firewall-cmd --permanen --zone=external --add-forward-port=port=22:proto=tcp:toport=3753

#不改变目的端口将程序包转发到另一个通常是内部地址的 IPv4 地址
#原本发往22端口的程序包现在被转发到相同的端口,地址则由 toaddr 提供。
#源目的地端口用 port 指定。这个选项可能是一个端口,或者一组端口范围并加上协议。如果被指定,协议必须是 tcp 或 udp 中的一个。
firewall-cmd --permanen --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.0.2.55

#改变目的端口和地址
firewall-cmd --permanen --zone=external --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.0.2.55



#复杂防火墙规则配置 “Rich Language" 语法
#列出某区域已添加的规则
firewall-cmd --permanen --zone=public --list-rich-rule

#检查一项规则是否存在
firewall-cmd --permanen --zone=public --query-rich-rule='rule'

#为 zone 分区增加一项多语言规则 rule 。这个选项可以多次指定。如果分区被省略,将使用默认分区。如果出现超时,规则将在指定的秒数内被激活,并在之后被自动移除。
firewall-cmd --permanen --zone=public --add-rich-rule='rule' [--timeout 9=seconds]

#为 zone 分区移除一项多语言规则 (rule) 。这个选项可以多次指定。如果分区被省略,将使用默认分区。
firewall-cmd --permanen --zone=public --remove-rich-rule='rule'



#重启防火墙
firewall-cmd --reload

复杂防火墙规则配置 “Rich Language” 语法
RichLanguage 官方文档

#添加规则
firewall-cmd --permanen [--zone=zone] --add-rich-rule='rule'

#多规则命令的格式或结构如下所示
rule [family="<rule family>"]
    [ source address="<address>" [invert="True"] ]
    [ destination address="<address>" [invert="True"] ]
    [ <element> ]
    [ log [prefix="<prefix text>"] [level="<log level>"] [limit value="rate/duration"] ]
    [ audit ]
    [ accept|reject|drop ]


family : ipv4 或 ipv6
source address : ipv4或ipv6格式的地址, 可以带子网掩码. invert 表示将规则反义
destination address : 同上
<element> 可以是 service name=, port port=, protocol value=, icmp-block name=, masquerade, forward-port port=
accept|reject|drop : 执行的动作

一个规则是关联某个特定区域的,一个区域可以有几个规则。
如果几个规则互相影响或者冲突,则执行和数据包相匹配的第一个规则。
如果提供了规则系列,它可以是 ipv4 或者 ipv6 。规则系列把规则限定在 IPv4 或 IPv6 。
如果没有提供规则系列, 将为 IPv4 和 IPv6 增加规则。
如果源地址或者目标地址在一个规则中被使用,那么必须提供规则系列。
端口转发也存在这种情况。

通过 firewall-cmd –zone=dmz –add-interface=eth0 命令添加的接口, 在重启 firewalld 服务后将会添加到默认区域(public) 中. 如果想保持原来的设定.则编辑接口文件

#centos 中的位置
nano /etc/sysconfig/network-scripts/ifcfg-eth0

#在末尾加入
ZONE=dmz

#重启服务
systemctl restart network
systemctl restart firewalld

通过编辑 XML 文件配置防火墙
/etc/firewalld/目录下有三个子目录

#存放了 ICMP 过滤的 XML 配置文件
/etc/firewalld/icmptype

#存放了 firewalld service 的 XML 配置文件
/etc/firewalld/service

#存放了配置 firewalld 区域的 XML 配置文件
/etc/firewalld/zone

为一个区域增删服务

nano /etc/firewalld/zones/public.xml

#增加或删除 service 节
<service name="smtp"/>

增加自定义服务

nano /etc/firewalld/services/newservice.xml

#参考文档
http://linuxmanpages.net/manpages/fedora18/man5/firewalld.service.5.html
赞(0) 打赏
未经允许不得转载:DarkMoon's Home » CentOS 7 firewalld 动态防火墙介绍

吐槽 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

'); })();