【Linux】firewall-cmd之防火墙简介及命令详解+实例

在这里插入图片描述




【Linux】firewall-cmd之防火墙简介及命令详解+实例


本文简介

  在CentOS 7中,新引入了firewalld防火墙,取代了CentOS 6之前的iptables防火墙。

  iptables用于过滤数据包,属于网络层防火墙。iptables主要是基于接口,来设置规则,从而判断网络的安全性。

  firewalld能够允许哪些服务可用,哪些端口可用等等,属于更高一层的防火墙。firewalld提供了支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具。它支持IPv4、IPv6防火墙设置以及以太网桥(在某些高级服务可能会用到,比如云计算), 并且拥有两种配置模式:运行时(Runtime)模式、永久(Permanent)模式。

  firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规则功能,内部结构都指向netfilter网络过过滤子系统(属于内核态)来实现包过滤防火墙功能。
  firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。

  firewall-cmd是firewalld的字符界面管理工具,firewall-config是firewalld的图形用户界面管理工具。

  firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念。
  首先,将所有网络流量分为多个区域(zone),然后,根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域,同时,每个区域都定义了自己打开或者关闭的端口和服务列表。

firewalld与iptables相比的两大好处

firewalld与iptables相比的两大好处:

   1. firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
   2. firewalld在使用上要比iptables人性化很多,即使不明白“四表五链”,和对TCP/IP协议也不理解的,也可以实现大部分功能。



firewalld配置的防火墙策略

firewalld配置的防火墙策略,分为:运行时(Runtime)模式、永久(Permanent)模式两种;
   1. 默认的是运行时(Runtime)模式,配置的策略便会立即生效,但是,系统一旦重启就会失效。
   2. 永久生效(Permanent)模式,可以使firewalld配置永久生效,但是,此模式需要重启系统,或者手动执行firewall-cmd --reload命令,配置的策略才会立即生效。

firewall-cmd命令详解

CentOS 7中,默认预装了firewalld、firewall-config命令,如果没有可以通过yum手动安装或更新至最新版本。

[root@firewall-cmd ~]# yum list firewalld firewall-config
[root@firewall-cmd ~]# yum -y install firewalld firewall-config

语法格式

firewall-cmd [选项 ... ]

常用参数/选项

选项分类 参数/选项 解析
通用选项 -h,--help 显示帮助信息
-V,--version 显示版本信息
-q,--quiet 不打印状态消息
状态选项 --state 显示firewalld的状态
--permanent 设置永久的规则
--reload 不中断服务的重新加载
--complete-reload 中断所有连接的重新加载
--runtime-to-permanent 将当前防火墙的规则永久保存
--zone= 指定区域
--get-active-zone 查看区域信息
--get-zone-of-interface= 查看指定接口所属区域
--check-config 检查配置正确性
--panic-on 拒绝所有包
--panic-off 取消拒绝状态
--query-panic 查看是否拒绝
日志选项 --get-log-denied 获取记录被拒绝的日志
--set-log-denied=[value] 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个

实例

1、防火墙的常规操作

1.1、查看firewalld防火墙状态

systemctl status firewalld

firewall-cmd --state  

#running是开启状态

1.2、开启/关闭/重启firewalld防火墙

#开启防火墙服务 
systemctl start firewalld

#关闭防火墙服务 
systemctl stop firewalld

#重启防火墙服务
systemctl restart firewalld

1.3、设置防火墙开机自启/禁止开机自启

#设置防火墙开机自启
systemctl enable firewalld

#设置防火墙禁止开机自启
systemctl disable firewalld

1.4、查看防火墙是否开机自启

systemctl is-enabled firewalld

#disabled则是开机不启动的;

2、配置firewalld

2.1、查看firewalld防火墙的版本

firewall-cmd -V

firewall-cmd --version

2.2、查看服务当前状态

firewall-cmd --state

#running是开启状态

2.3、查看区域信息

firewall-cmd --get-active-zones

2.4、查看指定接口所属区域

firewall-cmd --get-zone-of-interface=eth0

2.5、拒绝所有包/取消拒绝状态/查看是否拒绝

# 拒绝所有包:慎用,因为拒绝所有的包的时候就连xshell都链接不上了
firewall-cmd --panic-on

# 取消拒绝状态
firewall-cmd --panic-off

# 查看是否拒绝
firewall-cmd --query-panic

2.6、更新防火墙规则

#不中断服务的重新加载
firewall-cmd --reload

#中断所有连接的重新加载
firewall-cmd --complete-reload

# 两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务

2.7、将接口添加到区域,默认接口都在public

#将接口添加到区域,默认接口都在public
firewall-cmd --zone=public --add-interface=eth0

# 永久生效再加上 --permanent 然后reload防火墙
firewall-cmd --permanent --zone=public --add-interface=eth0
firewall-cmd --reload

2.8、设置默认接口区域,立即生效无需重启

#设置默认接口区域
firewall-cmd --set-default-zone=public

#立即生效无需重启
firewall-cmd --reload

2.9、新加一个端口到区域,使其永久生效

#新加一个端口,使其永久生效
firewall-cmd --permanent --zone=public --add-port=8088/tcp

#立即生效
firewall-cmd --reload

2.10、查看所有打开的端口

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

firewall-cmd --list-ports

2.11、删除一个不需要的已打开的端口

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

2.12、打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹

firewall-cmd --zone=work --add-service=smtp

2.13、移除服务

firewall-cmd --zone=work --remove-service=smtp

2.14、显示支持的区域列表

firewall-cmd --get-zones

2.15、设置为家庭区域

firewall-cmd --set-default-zone=home

2.16、查看当前区域

firewall-cmd --get-active-zones

2.17、设置当前区域的接口

firewall-cmd --get-zone-of-interface=ens33

2.18、显示所有公共区域(public)

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

2.19、临时修改网络接口(ens33)为内部区域(internal)

firewall-cmd --zone=internal --change-interface=ens33

2.20、永久修改网络接口ens33为内部区域(internal)

firewall-cmd --permanent --zone=internal --change-interface=ens33

这里主要有五个相关命令(参数)

firewall-cmd [--permanent] [--zone=zone] --list-sources
firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask]
firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask]
firewall-cmd [--zone=zone] --change-source=source[/mask]
firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask]
  • –list-sources:用于列出指定zone的所有绑定的source地址

  • –query-source:用于查询指定zone是否跟指定source地址进行了绑定

  • –add-source:用于将一个source地址绑定到指定的zone(只可绑定一次,第二次绑定到不同的zone会报错)

  • –change-source:用于改变source地址所绑定的zone,如果原来没有绑定则进行绑定,这样就跟–add-source的作用一样了

  • –remove-source:用于删除source地址跟zone的绑定

3、服务管理

3.1、显示服务列表

Amanda,FTP,Samba和TFTP等最重要的服务已经被FirewallD提供相应的服务,可以使用如下命令查看:

firewall-cmd --get-services

3.2、允许SSH服务通过

firewall-cmd --new-service=ssh

3.3、禁止SSH服务通过

firewall-cmd --delete-service=ssh

3.4、打开TCP的8080端口

firewall-cmd --enable ports=8080/tcp

3.5、临时允许Samba服务通过600秒

firewall-cmd --enable service=samba --timeout=600

3.6、显示当前服务

firewall-cmd --list-services

3.7、添加HTTP服务到内部区域(internal)

firewall-cmd --permanent --zone=internal --add-service=http

# 在不改变状态的条件下重新加载防火墙
firewall-cmd --reload     

4、端口管理

永久打开端口需要firewall-cmd --reload重新加载一下;
临时打开就不需要了;
如果设置永久打开端口用了firewall-cmd --reload命令,临时打开的端口就会失效;

4.1、打开443/TCP端口

#打开443/TCP端口,默认就有--zone=public,所以不加也可以;
firewall-cmd --add-port=443/tcp

#查看已开放的端口
firewall-cmd --list-ports

4.2、永久打开3306/TCP端口

#永久打开3306/TCP端口,默认就有--zone=public,所以不加也可以;
firewall-cmd --permanent --add-port=3306/tcp

#在不断开的情况下重新加载
firewall-cmd --reload

#查看已开放的端口
firewall-cmd --list-ports

4.3、查看已开放的端口(两种方式)

两种区别就在:

  • 【–list-all】可以看的比较全面,还可以看到除了ports之外的sources、services、interfaces信息;
  • 【–list-ports】只能看到所有开放的端口
firewall-cmd --list-all

firewall-cmd --list-ports

在这里插入图片描述

4.4、删除已开放的某个不需要的端口

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

5、直接模式

  firewalld中包含一种直接模式,使用它可以完成一些工作,工作原理是和iptables一样的,需要用到四表五连,不过,不建议大家使用,会有点绕;

需要看四表五链的可参考:【Linux】iptables之防火墙概述及规则匹配+实例(1)

5.1、打开TCP协议的8888端口

firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 8888 -j ACCEPT

firewall-cmd --reload

6、自定义服务管理

6.1、选项

(末尾带有 [P only] 的话表示该选项除了与(--permanent)之外,不能与其他选项一同使用!)
--new-service=<服务名> 新建一个自定义服务 [P only]
--new-service-from-file=<文件名> [--name=<服务名>]
                      从文件中读取配置用以新建一个自定义服务 [P only]
--delete-service=<服务名>
                      删除一个已存在的服务 [P only]
--load-service-defaults=<服务名>
                      Load icmptype default settings [P only]
--info-service=<服务名>
                      显示该服务的相关信息
--path-service=<服务名>
                      显示该服务的文件的相关路径 [P only]
--service=<服务名> --set-description=<描述>
                      给该服务设置描述信息 [P only]
--service=<服务名> --get-description
                      显示该服务的描述信息 [P only]
--service=<服务名> --set-short=<描述>
                      给该服务设置一个简短的描述 [P only]
--service=<服务名> --get-short
                      显示该服务的简短描述 [P only]
                      
--service=<服务名> --add-port=<端口号>[-<端口号>]/<protocol>
                      给该服务添加一个新的端口(端口段) [P only]
                      
--service=<服务名> --remove-port=<端口号>[-<端口号>]/<protocol>
                      从该服务上移除一个端口(端口段) [P only]
                      
--service=<服务名> --query-port=<端口号>[-<端口号>]/<protocol>
                      查询该服务是否添加了某个端口(端口段) [P only]
                      
--service=<服务名> --get-ports
                      显示该服务添加的所有端口 [P only]
                      
--service=<服务名> --add-protocol=<protocol>
                      为该服务添加一个协议 [P only]
                      
--service=<服务名> --remove-protocol=<protocol>
                      从该服务上移除一个协议 [P only]
                      
--service=<服务名> --query-protocol=<protocol>
                      查询该服务是否添加了某个协议 [P only]
                      
--service=<服务名> --get-protocols
                      显示该服务添加的所有协议 [P only]
                      
--service=<服务名> --add-source-port=<端口号>[-<端口号>]/<protocol>
                      添加新的源端口(端口段)到该服务 [P only]
                      
--service=<服务名> --remove-source-port=<端口号>[-<端口号>]/<protocol>
                      从该服务中删除源端口(端口段) [P only]
                      
--service=<服务名> --query-source-port=<端口号>[-<端口号>]/<protocol>
                      查询该服务是否添加了某个源端口(端口段) [P only]
                      
--service=<服务名> --get-source-ports
                      显示该服务所有源端口 [P only]
                      
--service=<服务名> --add-module=<module>
                      为该服务添加一个模块 [P only]
--service=<服务名> --remove-module=<module>
                      为该服务移除一个模块 [P only]
--service=<服务名> --query-module=<module>
                      查询该服务是否添加了某个模块 [P only]
--service=<服务名> --get-modules
                      显示该服务添加的所有模块 [P only]
--service=<服务名> --set-destination=<ipv>:<address>[/<mask>]
                      Set destination for ipv to address in service [P only]
--service=<服务名> --remove-destination=<ipv>
                      Disable destination for ipv i service [P only]
--service=<服务名> --query-destination=<ipv>:<address>[/<mask>]
                      Return whether destination ipv is set for service [P only]
--service=<服务名> --get-destinations
                      List destinations in service [P only]

7、控制端口 / 服务

  可以通过两种方式控制端口的开放,一种是指定端口号另一种是指定服务名。虽然开放 http 服务就是开放了 80 端口,但是还是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。还有一个要注意的就是指定端口的时候一定要指定是什么协议,tcp 还是 udp。知道这个之后以后就不用每次先关防火墙了,可以让防火墙真正的生效。

firewall-cmd --permanent --add-service=mysql	# 设置永久开放mysql服务
firewall-cmd --add-service=mysql        # 开放mysql服务
firewall-cmd --remove-service=mysql     # 阻止mysql服务(删除)
firewall-cmd --list-services            # 查看开放的服务
firewall-cmd --list-all					# 查看开放的服务(services)

firewall-cmd --permanent --add-port=8089	# 设置永久开放8089端口
firewall-cmd --add-port=3306/tcp        # 开放通过tcp访问3306
firewall-cmd --remove-port=8090/tcp     # 阻止通过tcp访问8090(删除)
firewall-cmd --add-port=1080/udp        # 开放通过udp访问1080
firewall-cmd --list-ports               # 查看开放的端口
firewall-cmd --list-all					# 查看开放的端口(ports)

7.1、伪装 IP

firewall-cmd --query-masquerade 	# 检查是否允许伪装IP
firewall-cmd --add-masquerade   	# 允许防火墙伪装IP
firewall-cmd --remove-masquerade	# 禁止防火墙伪装IP

8、端口转发

  端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目标如果不指定 ip 的话就,默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。

如果配置好端口转发之后不能用,可以检查下面两个问题:

  1. 比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了
  2. 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP
# 将80端口的流量转发至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080

# 将80端口的流量转发至192.168.1.12
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.12

# 将80端口的流量转发至192.168.1.12的8080端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.12:toport=8080

端口转发补充:

  • 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。
  • 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。

在这里插入图片描述

相关文章

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。管道用于具有亲缘关系的进程间通信,有名管道的每个管道具有名字,使没有亲缘关系的进程间也可以通信。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息。&#xD;&#xA;&#xD;&#xA;按实现原理分,可分为基于计数器和跟踪以及剖析。含义如下:&#xD;&#xA;&#xD;&#xA;计数器:内核维护的统计数据,通常为无符号整型,用于对发生的事件计数,比如,网络包接收计数器,磁
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书验证,详细追踪整个交互过程,可用于调用网络后端接口,诊断http和https网络服务故障。
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满、fd泄漏等问题。命令包括ping、fping、tcpdump、lsof、netstat、/proc/$pid/fd、du、grep、traceroute、dig。
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的进程数目,用uptime查看到负载很高,既有可能是CPU利用率高,也可能是大量在等待io的进程导致,用mpstat查看每个CPU的使用情况,查看CPU的使用率或者CPU花在等待io的时间,接着用pidstat定位具体的进程
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线程切换及中断切换,进程切换的开销较大,除了需要保存寄存器和程序计数器中的值还需保存全局变量、栈等到内存中,以便下次运行恢复,而同一进程中的线程切换开销会小很多,只需更新寄存器和线程独有的栈,共享资源如打开的文件、全局变量等无需切换,当硬件中
1.top命令 作用:该命令可以按CPU使用.内存使用和执行时间对任务进行排序,常用来监控系统中占用CPU或内存较高的程序及CPU和内存的负载。 默认视图: 当想看系统负载时,可观察汇总的%CPU中的us用户进程和sy系统进程是否占用CPU很高,相加接近100%就说明占用很高了,有些程序可能得不到及
文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限!!!粘滞位!!!超详解!!!
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Windows、Linux、MacBook_mack book 安装qt
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Linux——了解操作系统的发展历史以及初次体验Linux编程环境
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,个人学习时很认真的记录的,觉得好的麻烦点个赞。
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.5p1(亲测无问题,建议收藏)_openssh_9.5p1
文章浏览阅读3.5k次,点赞93次,收藏78次。初识Linux中的线程,理解线程的各种概念,理解进程地址空间中的页表转换,介绍pthread线程库并理解线程库!
文章浏览阅读863次。出现此问题为Linux文件权限问题,解决方案为回到引擎目录执行命令。输入用户密码后运行./UnrealEditor。_increasing per-process limit of core file size to infinity.
文章浏览阅读2.9k次。使用文本编辑器:打开CSV文件,并使用文本编辑器(如Notepad++、Sublime Text、Visual Studio Code等)来查看文件的字符编码格式。通常在编辑器的底部状态栏或设置中可以找到当前编码的显示。请注意,上述方法并非绝对准确,特别是当文件没有明确的编码标识时。因此,如果你发现CSV文件在不同的工具或方法中显示不同的编码格式,可能需要进行进一步的分析和判断,或者尝试使用不同的编码转换方法。该命令将输出文件的MIME类型和编码信息。使用命令行工具:在命令行中,你可以使用。_shell读取csv文件逐行处理
本文介绍了如何在Linux系统中升级gcc版本,以便更好地支持C++11及以上版本的新特性。通过升级gcc,可以提升编译器的功能和性能,获得更好的开发体验。详细的步骤和方法请参考原文链接。
文章浏览阅读4.4k次,点赞6次,收藏19次。Mosquitto是一个开源的MQTT消息代理服务器。MQTT是一个轻量级的、基于发布/订阅模式的消息传输协议。 mosquitto的安装使用比较简单,可以方便的来进行一些测试。_linux mosquitto
文章浏览阅读7.2k次,点赞2次,收藏12次。Linux中,用于根目录下有一个.ssh目录,保存了ssh相关的key和一些记录文件。_~/.ssh/
文章浏览阅读4.5k次,点赞5次,收藏18次。首先需要安装 snmp ,使用下面的命令进行安装安装完毕之后,使用下面的命令查看是否安装成功当命令行显示如图即为安装成功。_snmp工具