hello云胜

技术与生活

0%

firewall-cmd

在 centos7 里有几种防火墙共存,firewalld、iptables,默认是使用 firewalld 来管理 netfilter 子系统,不过底层调用的命令仍然是 iptables 等。

firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现,也就是说 firewalld 和 iptables 一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。firewalld是iptables的一个封装,可以让你更容易地管理iptables规则。它并不是iptables的替代品,虽然iptables命令仍可用于firewalld,但建议firewalld时仅使用firewalld命令。

firewalld 和 iptables service 之间一个极大的不同在于:

使用 iptables service 每一个单独更改都意味着清除所有旧有的规则和从/etc/sysconfig/iptables 里读取所有新的规则,换句话说,每次修改都要求防火墙完全重启。这就会影响到现有的连接。

然而使用 firewalld 却不会再创建任何新的规则,仅仅运行规则中的不同之处,因此firewalld 可以在运行时间内改变设置而不丢失现行连接。

这种不同的原因在于iptables service 在 /etc/sysconfig/iptables 这一个文件中储存,而 firewalld 将配置储存在 /usr/lib/firewalld/(系统配置文件,预定义配置文件)和 /etc/firewalld/(用户配置文件) 中的多个XML文件里。

firewalld 跟 iptables 的区别:
(1)firewalld可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接,而iptables,在修改了规则后必须得全部刷新才可以生效。

(2)firewalld使用区域和服务而不是链式规则。

(3)进站:firewalld默认是拒绝的(ping和ssh不拒绝),需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制。

​ 出站:firewalld、iptables 不限制。

(5)firewalld 默认每个服务是拒绝,每个服务都需要去设置才能放行;iptables 默认是每个服务是允许,需要拒绝的才去限制。

firewalld的基本概念

在CentOS7之后,当你使用firewalld时,有两个基本概念

  • 服务(service)
  • 区域(zone)

什么叫service?

简单说,就是应用协议
例如,上网经常用到tcp协议的80端口和443端口,还有域名解析要用到udp协议的35端口,访问共享文件夹需要用到udp端口的137和138端口, ssh登录的22端口

这些常用的应用,firewalld都已经内置了。因此在防火墙的配置和管理会变得简单以及人性化。

什么是zone?

而理解区域就更简单了,就是对各种内置服务预分组的集合。

在目录/usr/lib/firewalld/zones下预定义了所有的zone

image-20230815153659848

当然,也可以通过firewall命令进行查看

1
2
3
[root@procketmq1 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

各个zone的含义如下。按信任等级排序

  • trusted–接受所有网络连接。我不建议将该区域用于连接到WAN的专用服务器或VM。

  • home –适用于您信任其他计算机的局域网内的家用计算机,例如笔记本电脑和台式机。仅允许选择的TCP / IP端口。

  • internal–当您主要信任LAN上的其他服务器或计算机时,用于内部网络。

  • work–在信任同事和其他服务器的工作场所中使用。以上都支持接受ssh

  • public–默认区域。不接受ssh。需要单独配置开通指定机器的ssh访问。

  • external-对于路由器连接类型很有用。您还需要LAN和WAN接口,以使伪装(NAT)正常工作。

  • dmz –仅接受SSH服务连接

  • block–拒绝所有传入的网络连接。仅从系统内部启动的网络连接是可能的。

  • drop –丢弃所有传入网络连接,没有任何回复。仅允许传出网络连接。

简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),

用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

查看默认zone

1
2
[root@procketmq1 ~]# firewall-cmd --get-default-zone
public

默认使用的zone是public

查看当前使用的zone

1
2
3
[root@procketmq1 ~]# firewall-cmd --get-active-zones
public
interfaces: eth0

当前活跃的zone是public。并且分配的接口是eth0

确定使用的区域

默认区是public,但是不是说此时所有的连接就是使用public区域的配置

对于一个接收到的请求具体使用哪个 zone,firewalld 是通过下面三种方式来判断的:

source:来源地址。

Interface:接收请求的网卡。

firewalld:配置的默认区域(zone)。

这三个方式的优先级按顺序依次降低,也就是说如果按照 source 可以找到就不会再按 interface 去找,如果前两个都找不到才会使用第三个默认区域。

常用命令清单

image-20230816093718528

补充说明

  1. 使用firewall-cmd配置的命令是立即生效的,但是不是永久的。重启会失效。如果想一直有效,需要使用永久(Permanent)模式,即在firewall-cmd的命令后加–permanent参数
  2. 但是永久模式的配置不是立即生效的,在系统重启后才会生效。要想立即生效,手动执行 firewall-cmd –reload 重载命令。
  3. remove 掉 ssh 服务或者 ssh 端口,当前远程登陆会话不会断开,退出后就无法远程连接了。
  4. 添加常用端口,默认会添加到默认的区域(如果没有修改默认区域,默认区域为 public)。

查看当前防火墙启用的规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@procketmq1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client
ports: 3181/tcp 4118/tcp 19100/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="x.x.x.x/32" port port="22" protocol="tcp" accept

因为默认的就是public区域

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

所以 ,这俩个命令是一样的效果。

对结果的一些解释

  • public(active)说明目前该zone是active状态。你–zone=internal就会发现internal后面就没有active

  • target: default

    target就是对数据包的处理动作。有以下几种选项

    • default:不做任何事情
    • ACCEPT:除了被明确写好的规则,会接受所有流入的数据包
    • REJECT 除了被明确写好允许的规则,会拒绝所有流入的数据包, 会给发起连接的机器回复被拒绝的消息。
    • DROP:除了被明确写好允许的规则,会拒绝所有流入的数据包, 不会给发起连接的机器回复任何消息。

​ 要修改target,命令如下

1
firewall-cmd --zone=public --set-target=DROP 
  • icmp-block-inversion: no

ICMP协议类型黑白名单开关,默认是no。即黑名单模式:默认放行,允许处理所有的icmp type。只有添加到黑名单的icmp type被禁止响应。

  • interfaces: eth0

    关联的网卡

  • sources

    来源,可以是IP地址,也可以是mac地址

  • services

    允许的服务。public域默认不允许ssh

  • ports:

    允许的目标端口,即本地开放的端口,这里添加的是公开端口,所有的IP地址都能访问。

  • protocols:

    允许通过的协议

  • masquerade: no

    是否允许伪装(yes/no),可改写来源IP地址及mac地址

  • forward-ports:

    允许转发的端口

  • source-ports:

    允许的来源端口

  • icmp-blocks:

    可添加ICMP类型,当icmp-block-inversion为no时(黑名单),这些ICMP类型被拒绝;当icmp-block-inversion为yes时(白名单), 这些ICMP类型被允许。

  • rich rules:
    富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。

查询、列出、添加、删除开放的端口:

应该是最常用的功能了

1
2
3
4
5
6
7
firewall-cmd --zone=public --query-port=8080/tcp  //返回该端口是否开放

firewall-cmd --zone=public --list-ports

firewall-cmd --permanent --zone=public --add-port=8080/tcp

firewall-cmd --permanent --zone=public --remove-port=8080/tcp

端口既可以是一个独立端口数字,又或者端口范围,例如,5060-5070。

协议可以指定为 tcp 或 udp。

rich rules

rich rule里可以写的内容:

  1. rule :规则。

  2. family:’ipv4’:指定ipv4的地址。

  3. source address=’10.0.10.1’:要拒绝或接受的IP,可以是IP或者是IP段。

  4. service name=’ssh’:指定的是ssh服务。

  5. port 指定端口

  6. protocol:指定协议

  7. target操作:drop:此条规则的执行方法是丢弃。reject:此条规则的执行方法是拒绝。accept:此条规则的执行方法是接受。

举例:

允许某个ip进行ssh登录

1
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='x.x.x.x' service name='ssh' accept"

这是通过实行service的方式或者指定port 22端口

1
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='x.x.x.x' port protocol='tcp' port='22' accept"

最后别忘了 firewall-cmd –reload