CentOS上的FirewallD简介

FirewallD是防火墙用于实现持久化网络流量规则的前端控制器。它提供命令行和图形界面,可在大多数Linux发行版中使用。与直接控制iptables相比,使用FirewallD有两个主要区别:

  1. FirewallD使用 区域服务 而不是链和规则。
  2. 它动态管理规则表,允许不破坏现有会话和连接的时候更新规则表。

注意FirewallD是iptables之上的一层封装,可以更轻松地管理iptables规则 - 它不是 iptables的替代品。虽然FirewallD仍然可以使用iptables命令,但建议仅使用FirewallD的命令。

本指南将向您介绍FirewallD及其区域和服务的概念,并向您展示一些基本配置步骤。

安装和管理FirewallD

默认情况下,CentOS 7中已经包含FirewallD,但它处于非活动状态。控制它其实与其他系统单元相同。

1.要启动该服务并在启动时启用FirewallD:

sudo systemctl start firewalld 
sudo systemctl enable firewalld

要停止并禁用它:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

2.检查防火墙状态。输出应该是提示running或者not running

sudo firewall-cmd --state

3.要查看FirewallD守护程序的状态:

sudo systemctl status firewalld

输出示例:

firewalld.service - firewalld - dynamic firewall daemon
      Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
      Active: active (running) since Wed 2015-09-02 18:03:22 UTC; 1min 12s ago
    Main PID: 11954 (firewalld) 
      CGroup: /system.slice/firewalld.service
                    └─11954 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

4.重新加载FirewallD配置:

sudo firewall-cmd --reload

配置FirewallD

Firewalld使用XML文件配置。除了非常特殊的配置之外,应使用firewall-cmd而不是这些xml文件。

配置文件位于两个目录中:

  • /usr/lib/FirewallD默认配置,比如默认区域和公共服务。避免修改它们,因为每个firewalld包更新都会覆盖这些文件。
  • /etc/firewalld系统配置文件,这些文件将覆盖默认配置。

配置表

Firewalld使用两个配置表:Runtime(运行时表)和Permanent(持久化表)。重启系统或重新启动FirewallD服务不保留运行时的配置更改,而永久更改不会应用于正在运行的系统。

默认情况下,firewall-cmd命令适用于运行时配置,但使用--permanent标志将建立持久配置。要添加和激活永久规则,可以使用以下两种方法之一。

1.将规则同时添加到永久集和运行时集。

sudo firewall-cmd --zone=public --add-service=http --permanent 
sudo firewall-cmd --zone=public --add-service=http

2.将规则添加到永久集并重新加载FirewallD。

sudo firewall-cmd --zone=public --add-service=http --permanent 
sudo firewall-cmd --reload

注意reload命令将删除所有运行时配置并应用永久配置。因为firewalld动态管理规则集,所以它不会破坏现有的连接和会话。

防火墙区

区域是针对给定位置或场景(例如,家庭,公共,受信任等)可能具有的不同信任级别的预构建规则集。不同的区域允许不同的网络服务和传入的流量类型,同时拒绝其他一切。首次启用FirewallD,Public是默认区域。

区域也可以应用于不同的网络接口。例如内网和外网,您可以在内网使用DHCP,但在外网上只允许HTTP和SSH。未明确设置为特定区域的任何接口都将附加到默认区域。

要查看默认区域:

sudo firewall-cmd --get-default-zone

要更改默认区域:

sudo firewall-cmd --set-default-zone=internal

要查看网络接口使用的区域:

sudo firewall-cmd --get-active-zones

输出示例:

public
  interfaces: eth0

要获取特定区域的所有配置:

sudo firewall-cmd --zone=public --list-all

输出示例:

public (default, active)
  interfaces: ens160
  sources:
  services: dhcpv6-client http ssh
  ports: 12345/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

要获取所有区域的所有配置:

sudo firewall-cmd --list-all-zones

输出示例:

block
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

  ...

work
  interfaces:
  sources:
  services: dhcpv6-client ipp-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

使用服务

FirewallD基于配置规则对于特定网络服务过滤不同数据。可以创建自定义服务规则并将其添加到任何区域。默认支持的服务的配置文件位于/usr/lib/firewalld/services,用户创建的服务文件位于/etc/firewalld/services

要查看默认的可用服务:

sudo firewall-cmd --get-services

例如,要启用或禁用HTTP服务:

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --remove-service=http --permanent

允许或拒绝任意端口/协议

例如:在端口12345上允许或禁用TCP流量。

sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent

端口转发

以下示例规则将流量从80端口转发到同一服务器上的12345端口 。

sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345

要将端口转发到其他服务器

1.在所需区域中激活伪装。

sudo firewall-cmd --zone=public --add-masquerade

2.添加转发规则。此示例将流量从当前服务器80端口转发到IP是123.456.78.9的远程服务器的8080端口。

sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9

要删除规则,请替换--add--remove。例如:

sudo firewall-cmd --zone=public --remove-masquerade

用FirewallD构造规则表

例如,如果您运行的是Web服务器,以下是使用FirewallD为您的Linode分配基本规则的方法。

1.将dmz区域指定为eth0网卡的默认区域。在提供的默认区域中,dmz是最适合此应用程序的区域,因为它只允许SSH和ICMP。

sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0

2.将HTTP和HTTPS的永久服务规则添加到dmz区域:

sudo firewall-cmd --zone=dmz --add-service=http --permanent
sudo firewall-cmd --zone=dmz --add-service=https --permanent

3.重新加载FirewallD,以便规则立即生效:

sudo firewall-cmd --reload

如果你现在运行firewall-cmd --zone=dmz --list-all,这应该是输出:

dmz (default) 
  interfaces: eth0
  sources:   
  services: http https ssh
  ports:   
  masquerade: no   
  forward-ports:   
  icmp-blocks:   
  rich rules:

上面配置的意思是:dmz区域是我们的默认区域,适用于eth0接口的所有网络数据和端口。允许传入HTTP(端口80),HTTPS(端口443)和SSH(端口22)流量,因为对IP版本没有限制,这将适用于IPv4和IPv6,不允许伪装端口转发。我们没有限制ICMP包,因此完全允许ICMP流量,并且没有富规则。允许所有传出流量。

高级配置

服务和端口适用于基本配置,但对于高级方案可能限制太多。Rich Rules和Direct Interface允许完全自由的为任何端口、协议、地址和操作添加自定义规则到任何区域。

富规则

富规则语法很广泛,但在firewalld.richlanguage(5)手册页(或man firewalld.richlanguage在终端中查看)中有详细说明。使用firewall-cmd 和参数--add-rich-rule--list-rich-rules以及--remove-rich-rule来管理富规则。

以下是一些常见示例:

允许来自主机192.168.0.14的所有IPv4流量。

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept'

拒绝从主机192.168.1.10到端口22的IPv4 TCP流量。

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject'

允许从主机10.1.0.3到端口80的IPv4 TCP流量,并将其本地转发到本地6532端口。

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532'

将端口80上的所有IPv4流量转发到主机172.31.4.2上的端口8080(伪装应在区域上处于活动状态)。

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'

列出您当前的富规则:

sudo firewall-cmd --list-rich-rules

iptables直接接口

对于最高级的用法,或者对于iptables专家,FirewallD提供了一个直接接口,允许使用原始iptables命令。除非加上参数--permanent,否则规则是运行时的。

要查看添加到FirewallD的所有自定义链或规则:

firewall-cmd --direct --get-all-chains
firewall-cmd --direct --get-all-rules

讨论iptables语法细节超出了本指南的范围。如果您想了解更多信息,可以查看我们的iptables指南

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

本文的版权归 Noel 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏magicsoar

mysql复制

一、复制的意义 mysql的复制功能是构建基于MySql大规模,高性能应用的基础,我们可以通过为服务器配置一个或多个备库来进行数据同步;复制功能不仅有利于构建高...

2537
来自专栏linux驱动个人学习

高通GPIO驱动(DTS方式)

gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态; ...

5384
来自专栏空帆船w

如何快速上传开源项目至 Jcenter

前几天上传了个项目至 Jcenter,看了网上很多教程,基本都是以 gradle-bintray-plugin 这个插件做上传,教程看着都好费劲,对于新手来说真...

1672
来自专栏XAI

Nginx+Tomcat+Redis负载均衡Session共享实现超级简单(CentOS6.9系统 Java版本)

第一步Nginx+Tomcat 实现负载均衡的测试  相关软件环境 软件名称 版本号 版本说明 Java 1.7 linux版本 Tomcat 8...

49511
来自专栏xingoo, 一个梦想做发明家的程序员

Maven日常 —— 你应该知道的一二三

以前在日常工作中,使用Maven只是机械的执行Maven clean、Maven install,对其中的原理与过程并无了解,近期阅读了《Maven实战》,对...

1988
来自专栏hrscy

记录网站诞生过程-使用hexo+github pages

此博客记录了搭建网站的详细过程,以及建站过程中遇到的一些坑。博客介绍了安装homebrew,nodejs,hexo,域名注册,github设置,DNS解析等过程...

1073
来自专栏静下来

ECSHOP整合百度ueditor编辑器方法 支持远程图片本地化

image.png ECSHOP商城自带的编辑器实在是不能忍,太难用了。 就换成了百度的ueditor编辑器,本来最近修改了几个商城的,索性自己也记录一次吧。 ...

3616
来自专栏猿人谷

CentOS7安装GitLab、汉化、邮箱配置及使用

一.GitLab简介 GitLab是利用Ruby On Rails开发的一个开源版本管理系统,实现了一个自托管的Git项目仓库,是集代码托管,测试,部署...

2787
来自专栏软件测试经验与教训

如何手写LR脚本?

教学网址:http://computer-database.gatling.io/computers

1102
来自专栏Python自动化测试

python接口测试之urllib2的应用(十五)

在接口测试中或者说在网络爬虫中,urllib2库是必须要掌握的一个库,当然还有优秀的requests库,今天重点来说urllib2库在接口测试中...

1463

扫码关注云+社区

领取腾讯云代金券