【Linux命令每日一知】firewall-cmd--防火墙管理

2020-07-18 上海

firewalld服务

firewalld是Linux系列最新的网络防火墙管理服务,它包装了之前iptables,并非替换iptables,通过提供更加方便操作来提升服务质量。

firewalld中引入zoneservices的概念,而不是iptables中的chainrules
firewalld能够动态的改变规则集,同时不会影响已经建立起来的connection和session

安装和管理firewalld

sudo yum install firewalld # 安装firewalld服务
sudo systemctl start firewalld # 启动firewalld服务
sudo systemctl stop firewalld # 停用firewalld服务
sudo systemctl enable firewalld # 设置firewalld自启动
sudo systemctl status firewalld # 查看firewalld运行状态

firewalld服务管理

firewalld服务的相关设置通过命令firewall-cmd来完成。

比如:输出当前防火墙是否在运行

[root@localhost ~]# firewall-cmd --state
running

firewalld配置

firewalld的配置是通过XML文件的形式,当然我们的配置途径是通过firewall-cmd命令完成,避免直接去操作xml文件去配置,配置文件主要放置在如下两个目录:

  • /usr/lib/firewalld:这里保存着预定义默认的zone和通用serivce的配置,这里面的配置不要去修改,因为firewalld的包升级会更新里面的内容
  • /etc/firewalld:这里面保存着系统配置文件,这里面的配置内容优先覆盖上面目录的配置内容

firewalld的配置集(configuration sets)分为两类: RuntimePermanent.
Runtime:这类配置只能运用到当前的运行环境中,一旦重启机器或者重启firewalld服务,配置内容就丢失了
Permanent:这类配置持久化配置内容,在后续重启机器或者重启firewalld服务中会立即生效

两者的配置方式主要通过是否包含--permanent来区分,默认是Runtime,示例如下:

sudo firewall-cmd --zone=public --add-service=http --permanent # 当前配置为permanent规则
sudo firewall-cmd --zone=public --add-service=https            # 当前配置为Runtime规则
sudo firewall-cmd --reload # 重启firewalld服务,此时上面https服务配置丢失,http配置开始生效, 同时需要注意的时,如果已经使用之前Runtime规则建立起来的连接仍然有效,这一点由firewalld的特点决定的

zone概念

zone引入的主要作用是将应用不同场景的规则进行打包,提供更高程度的抽象,而不像iptables那种比较原始的哪些端口开通或者拒绝,通过zone的规则封装以及zone本身的语义化,可以更好的帮助理解和复用.

zone的配置可以作用在不同网络接口上,如果某网络接口没有指定zone,则默认使用默认的zone.

查看默认zone的命令如下:
sudo firewall-cmd --get-default-zone

当然,你也可以修改默认的zone:
sudo firewall-cmd --set-default-zone=zoneXXX

查看已经被网络接口应用的zone列表:
sudo firewall-cmd --get-active-zones

查看具体zone的详细信息:
sudo firewall-cmd --zone=zoneXXX --list-all

查看所有zone的详细信息:
sudo firewall-cmd --list-all-zones

示例:

[root@localhost firewalld]# firewall-cmd --get-default-zone
public
[root@localhost firewalld]# firewall-cmd --get-active-zones
public
  interfaces: ens33
[root@localhost firewalld]#
[root@localhost firewalld]# firewall-cmd --get-default-zone
public
[root@localhost firewalld]# firewall-cmd --get-active-zones
public
  interfaces: ens33
[root@localhost firewalld]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: ssh dhcpv6-client
  ports: 2181/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@localhost firewalld]# firewall-cmd --list-all-zones
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: ssh dhcpv6-client
  ports: 2181/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


trusted
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

...省略...

service概念

firewalld可以应用针对特定服务而预定义的规则集,当然用户可以自定义自己的服务,然后将其运营在任何的zone上.
默认支持的service定义放在目录: /usr/lib/firewalld/services.
用户自定义的service定义放在目录: /etc/firewalld/services.

查看默认可用的服务:
sudo firewall-cmd --get-services

应用service到zone上:

sudo firewall-cmd --zone=public --add-service=http --permanent # 配置service到zone
sudo firewall-cmd --zone=public --remove-service=http --permanent # 从zone中删除指定的service

通过查看预定义的service配置文件,我们可以自定义自己的service,写法也比较简单,需要注意的是,文件放到/etc/firewalld/serivces目录下:


<service>
  <short>Jiangjian Demo Serviceshort>
  <description>just testdescription>
  <port protocol="udp" port="8081"/>
service>

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

通过如下命令完成:

sudo firewall-cmd --zone=pubic --add-port=1234/tcp --permanent # 允许TCP端口1234
sudo firewall-cmd --zone=public --remove-port=1234/tcp --permanent # 拒绝TCP端口1234

Forwarding(转发)

  1. 相同主机内不同端口间转发.
    命令格式: sudo firewall-cmd --zone=public --add-forward-port=port=80:prto=tcp:toport=1234 # 将80端口的请求转发给端口1234

  2. 不同主机间的转发.

  • 激活zone的masquerade,命令格式为: sudo firewall-cmd --zone=public --add-masquerade
  • 设置转发,命令格式为: sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=198.1.1.2
  • 如果需要删除不同主机间的转发配置,命令格式为:sudo firewall-cmd --zone=public --remove-masquerade

网络接口添加/删除zone

sudo firewall-cmd --zone=dmz --add-interface=ens33    # 将dmz zone配置应用到网络接口ens33
sudo firewall-cmd --zone=dmz --remove-interface=ens33 # 将dmz zone配置从网络接口ens33删除

Rich rules

firewalld定义了一套DSL,具体的语言细节参考: https://jpopelka.fedorapeople.org/firewalld/doc/firewalld.richlanguage.html
我们通过--add-rich-rule, --list-rich-rules--remove-rich-rule去管理rich rule.

示例:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.0.2.0 accept' # 允许所有来着192.0.2.0的ipv4流量
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.0.2.0" port port=22 protocol=tcp reject' # 拒绝来着192.0.2.0的tcp 流量到端口22
sudo firewall-cmd --zone=public --list-rich-rules # 查看zone public所有的rich rule

Iptables操作

firewalld提供操作直接操作iptables的入口

firewall-cmd --direct --get-all-chains # 获取iptables配置的chains
firewall-cmd --direct --get-all-rules  # 获取iptables配置的rules

你可能感兴趣的:(Linux命令每日一知)