Skip to content

firewalld防火墙

1. 防火墙常用操作

1.1 查看防火墙状态

systemctl status firewalldfirewall-cmd --state 都可以查看防火墙状态

shell
[root@localhost ~]# systemctl status firewalld
 firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-08-06 13:56:52 CST; 15min ago
       Docs: man:firewalld(1)
   Main PID: 1064 (firewalld)
      Tasks: 3 (limit: 47155)
     Memory: 45.9M
     CGroup: /system.slice/firewalld.service
             └─ 1064 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

Aug 06 13:56:52 localhost systemd[1]: Starting firewalld - dynamic firewall daemon...
Aug 06 13:56:52 localhost systemd[1]: Started firewalld - dynamic firewall daemon.
[root@localhost ~]#
shell
[root@localhost ~]# firewall-cmd --state
running
[root@localhost ~]#

1.2 查看开放的端口和服务

查看所有开放的端口和服务 firewall-cmd --list-all

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

查询指定端口是否开放 firewall-cmd --query-port=22/tcp

shell
[root@localhost ~]# firewall-cmd --query-port=22/tcp
no
[root@localhost ~]#

查询指定服务是否开放 firewall-cmd --query-service=ssh

shell
[root@localhost ~]# firewall-cmd --query-service=ssh
yes
[root@localhost ~]#

注意

注意查询的服务必须先定义好

系统内置定义的服务路径为:/usr/lib/firewalld/services/

用户自己定义的服务路径为:/etc/firewalld/services/

如需修改内置服务端口,可将/usr/lib/firewalld/services/对应服务文件拷贝到/etc/firewalld/services/ 并修改端口

查看服务详情 firewall-cmd --info-service=ssh

shell
[root@localhost ~]# firewall-cmd --info-service=ssh
ssh
  ports: 22/tcp
  protocols: 
  source-ports: 
  modules: 
  destination: 
  includes: 
  helpers: 
[root@localhost ~]#

1.3 添加端口/服务操作

注意

要说明的是 --permanent 选项表示永久操作,策略不会立即生效,需要重新加载策略或重启生效

不加此选项策略会立即生效,但是关机重启或重新加载策略,策略失效

重新加载防火墙策略 firewall-cmd --reload

shell
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]#

新增一个服务/端口 ,执行结果如下,可以发现重载后,临时策略将失效,永久策略必须重载生效

firewall-cmd --add-port=3306/tcp

firewall-cmd --add-service=ssh

firewall-cmd --permanent --add-port=3306/tcp

firewall-cmd --permanent --add-service=ssh

shell
# 临时开放端口
[root@localhost ~]# firewall-cmd --add-port=3306/tcp
success
[root@localhost ~]# firewall-cmd --list-port
3306/tcp
[root@localhost ~]# 
# 永久开放端口
[root@localhost ~]# firewall-cmd --permanent --add-port=80/tcp
success
[root@localhost ~]# 
[root@localhost ~]# firewall-cmd --list-port
3306/tcp
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-port
80/tcp
[root@localhost ~]#

移除一个服务/端口,注意自己的需求,是仅临时移除,还是需要永久移除

firewall-cmd --remove-port=3306/tcp

firewall-cmd --remove-service=ssh

firewall-cmd --permanent --remove-port=3306/tcp

firewall-cmd --permanent --remove-service=ssh

shell
[root@localhost ~]# firewall-cmd --add-port=3306/tcp
success
[root@localhost ~]# firewall-cmd --list-port
80/tcp 3306/tcp
[root@localhost ~]# firewall-cmd --remove-port=3306/tcp
success
[root@localhost ~]# firewall-cmd --list-port
80/tcp
[root@localhost ~]# firewall-cmd --remove-port=80/tcp
success
[root@localhost ~]# firewall-cmd --list-port

[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-port
80/tcp
[root@localhost ~]# firewall-cmd --permanent --remove-port=80/tcp
success
[root@localhost ~]# firewall-cmd --list-port
80/tcp
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-port

[root@localhost ~]#

1.4 命令小结

shell
# 查看防火墙状态
systemctl status firewalld
# 查看防火墙状态
firewall-cmd --state
# 查看所有开放的端口和服务
firewall-cmd --list-all 
# 查询指定端口是否开放
firewall-cmd --query-port=3306/tcp
# 查询指定服务是否开放
# 注意查询的服务必须先定义好 
# 系统内置定义的服务路径为:/usr/lib/firewalld/services/
# 用户自己定义的服务路径为:/etc/firewalld/services/   优先级高于上面的
# 如需修改内置服务端口,可将/usr/lib/firewalld/services/拷贝到/etc/firewalld/services/ 并修改端口
firewall-cmd --query-service=ssh
# 查看服务详情
firewall-cmd --info-service=ssh
# 新增一个服务/端口 --permanent表示永久操作,关机重启也会生效,否则关机重启策略失效
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-service=ssh
# 移除服务/端口
firewall-cmd --permanent --remove-port=3306/tcp
firewall-cmd --permanent --remove-service=ssh
#  --permanent参数会使策略不会立即生效 --reload重新加载策略生效
firewall-cmd --reload
# 这个 timeout 选项是一个以秒(s)、分(m)或小时(h)为单位的时间值
# 指示防火墙在一个指定的时间之后恢复修改
firewall-cmd --zone=public --add-service=ssh --timeout=5m

精细化操作会被区域操作覆盖

添加允许指定ip访问指定端口,如果需要永久生效,添加 --permanent 参数即可

注意 添加 --permanent 时,规则不会立刻生效,需要执行 firewall-cmd --reload 生效

sh
# 添加允许指定ip访问指定端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.177.1" port protocol="tcp" port="5822" accept'
# 添加禁止指定ip访问指定端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.177.1" port protocol="tcp" port="5822" reject'

# 删除规则
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.177.1" port protocol="tcp" port="5822" accept'
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.177.1" port protocol="tcp" port="5822" reject'

# 查看规则
firewall-cmd --zone=public --list-rich-rules

2 区域的简单了解

  1. 阻塞区域(block):任何传入的网络数据包都将被阻止。
  2. 工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
  3. 家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
  4. 公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
  5. 隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
  6. 信任区域(trusted):所有的网络连接都可以接受。
  7. 丢弃区域(drop):任何传入的网络连接都被拒绝。
  8. 内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
  9. 外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接

提示

  1. 注:firewalld的默认区域是public
  2. firewalld默认提供了九个zone配置文件:block.xmldmz.xmldrop.xmlexternal.xmlhome.xmlinternal.xmlpublic.xmltrusted.xmlwork.xml,他们都保存在/usr/lib /firewalld/zones/目录下。

常用区域选项

--get-default-zone:打印当前连接的默认区域

shell
[root@more ~]# firewall-cmd --get-default-zone
public
[root@more ~]#

--set-default-zone=<区域名称> :设置默认的区域

shell
[root@more ~]# firewall-cmd --get-default-zone
public
[root@more ~]# firewall-cmd --set-default-zone=home
success
[root@more ~]# firewall-cmd --get-default-zone
home
[root@more ~]#

此时想要查询开放的端口/服务默认查询的是home区域的,已经无法查询到开放的端口了

shell
[root@more ~]# firewall-cmd --list-port

[root@more ~]# firewall-cmd --zone=public --list-port
80/tcp 443/tcp 822/tcp
[root@more ~]#