FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。
更全面的内容可以查看 FirewallD 官网文档
firewalld 最重要的是 zone 区域的概念
什么是区域?
网络区域定义了网络连接的可信等级。这是一个一对多的关系,这意味着一次连接可以仅仅是一个区域的一部分,而一个区域可以用于很多连接。
预定义的区域列表如下, 每个区域都是一个 xml 文件, 保存在 /usr/lib/firewalld/zones/ 中, 不要编辑这里的文件
自定义区域则保存在 /etc/firewalld/zones/ 中, 可以编辑这里的文件, 这里的设置将覆盖 /usr/lib/firewalld/zones/ 中的设置
区域列表, public 是默认区域, 由 firewalld 提供的区域按照从不信任到信任的顺序排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 防火墙, 如果没有启用. 先启用.
1 2 |
systemctl enable firewalld systemctl start firewalld |
配置防火墙
有两种工具可以配置
firewall-config ,图形界面工具, 需要安装图形界面相关的依赖, 这里就不多介绍了.
firewall-cmd , 命令行工具, 主要使用它来配置防火墙.
在设置命令后加 –permanent 参数才会永久保存, 否则在重新加载配置后会丢失设置.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
#查看版本 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” 语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#添加规则 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) 中. 如果想保持原来的设定.则编辑接口文件
1 2 3 4 5 6 7 8 9 |
#centos 中的位置 nano /etc/sysconfig/network-scripts/ifcfg-eth0 #在末尾加入 ZONE=dmz #重启服务 systemctl restart network systemctl restart firewalld |
通过编辑 XML 文件配置防火墙
/etc/firewalld/目录下有三个子目录
1 2 3 4 5 6 7 8 |
#存放了 ICMP 过滤的 XML 配置文件 /etc/firewalld/icmptype #存放了 firewalld service 的 XML 配置文件 /etc/firewalld/service #存放了配置 firewalld 区域的 XML 配置文件 /etc/firewalld/zone |
为一个区域增删服务
1 2 3 4 |
nano /etc/firewalld/zones/public.xml #增加或删除 service 节 <service name="smtp"/> |
增加自定义服务
1 2 3 4 |
nano /etc/firewalld/services/newservice.xml #参考文档 http://linuxmanpages.net/manpages/fedora18/man5/firewalld.service.5.html |