Linux下如何设置防火墙,你知道吗?名字叫firewalld,可以定义一套规则来控制外部进入系统中的网络流量,规则允许的流量可以进入系统,规则禁止的流量会被阻断介绍firewalld提供了一种方式来动态自定义规则,我们可以实时创建、更改和删除规则firewalld使用区域和服务的概念来简化流量管理。区域是一组预定义的规则,网络接口可以分配给这些规则。流量是否可以进入主机取决于计算机所连接的网络以及为网络设置的安全级别。所有预定义的规则都有一些针对每个服务的传入流量的必要设置。服务通过端口与外部应用程序通信,防火墙根据端口过滤流量。Linux防火墙默认关闭所有端口。如果要允许该服务与外部应用程序通信,则必须开放该服务的端口,但在某些区域(例如:可信区域),默认是允许所有流量通过该区域。防火墙可以根据用户设置的信任级别将网络划分为多个区域。一个网络连接只能属于一个zone,一个zone可以容纳多个网络连接Area默认配置块:对于外部主动和主动连接,主机会返回一个icmp包拒绝,但是主机可以主动发起外部连接dmz:隔离区内的计算机可以公开访问,但对于内部网络,只指定Connectiondrop:对于传入的网络数据包,主机直接拒绝,不返回任何消息包,只允许从主机传出的数据包。external:用于伪装外部网络,尤其是路由器,防止其他计算机受到攻击,只接受指定的传入连接specifiedincomingconnectioninternal:用于内部网络,此时,对于网络中的计算机,大部分是可信的,只接受指定的传入连接public:用于公共区域,此时,网络中的计算机不能被信任,只接受指定的传入连接Trusted:接受所有网络连接work:在工作区使用。此时,网络中的大多数计算机都是可信的,但只接受指定的传入连接。上述区域中,public是安装防火墙时的默认区域。当网络连接到达时,它会将其分配到默认区域并安装Linux的通用发行版。防火墙已预先安装。如果没有安装,可以使用以下命令安装yuminstallfirewalld-y来启动和关闭防火墙。systemctlstartfirewalld#启动防火墙服务systemctlstopfirewalld#关闭防火墙服务设置开机启动,禁止开机启动有很多,下表列出了常用的参数及其作用,更多的参数可以通过man命令查看。选项描述--state防火墙启用状态--reload重新加载防火墙规则--get-default-zone获取默认区域--set-default-zone=xxx设置默认区域为xxx--list-all--zone=xxxlistxxx区域中所有允许的子项--list-all-zones列出所有区域中所有允许的子项--permanent--new-zone=xxx添加永久性新区域--permanent--delete-zone=xxx删除现有的永久性区域zone--list-ports--zone=xxx列出xxxzone中添加的端口Port--add-port=x--zone=xxxxxxzoneaddxport--remove-port=x--zone=xxxxxxzoneremovexport--query-port=x--zone=xxx查询xxx区域是否添加了x端口--list-services=x--zone=xxx列出xxx区域所有允许的服务器--query-service=x--zone=xxx查询是否允许xxx区域x服务的流量--add-service=x--zone=xxx--timeout=t允许xxx区x服务的流量,超时时间t--remove-service=x--zone=xxx将x服务从xxx区移除通用操作runtime和永久防火墙规则的修改有两种模式:运行时和永久。运行模式也称为当前有效模式。这是默认模式。重新加载防火墙服务,重启,重启系统都会失败。--permanent是永久选项。设置后不会立即生效。需要重启服务,重新加载防火墙服务或重启系统才能生效。没有--permanent选项,只修改运行时的配置。此外,--permanent选项并非对所有选项都有效。如果要在运行时和永久都生效,需要分别设置运行时和永久,即不带--permanent运行,永久时加上这个选项例如:现在设置公共区域允许80端口TCP流量通过,并且runtime和permanent都有效,具体设置如下[root@cghost23~]#firewall-cmd--zone=public--list-port--permanent[root@cghost23~]#firewall-cmd--zone=public--list-port[root@cghost23~]#firewall-cmd--zone=public--add-port=80/tcpsuccess[root@cghost23~]#firewall-cmd--zone=public--add-port=80/tcp--permanentsuccess[root@cghost23~]#firewall-cmd--zone=public--list-port--permanent80/tcp[root@cghost23~]#firewall-cmd--zone=public--list-port80/tcp设置前,80端口的流量在运行期间和永久禁止通过。设置后,允许通过。--add-port=80/tcp设置为运行,--add-port=80/tcp--permanent设置为永久查看Firewall状态防火墙未启用[root@cghost23~]#firewall-cmd--statenotrunningfirewallisenabled[root@cghost23~]#firewall-cmd--staterunningReload--reload选项是重新加载防火墙规则,保持活动连接[root@cghost23~]#firewall-cmd--reloadsuccess需要注意的是重新加载会导致添加的运行时规则丢失[root@cghost23~]#firewall-cmd--zone=public--add-port80/tcpsuccess[root@cghost23~]#firewall-cmd--zone=public--list-port80/tcp[root@cghost23~]#firewall-cmd--reloadsuccess[root@cghost23~]#firewall-cmd--zone=public--list-port[root@cghost23~]#在上面的例子中,首先设置publiczone通过TCP协议允许80端口流量,通过--zone=public--list-port选项的结果确认设置成功重新加载防火墙规则,然后查询所有允许流量的端口号再次通过公共区域名词从上面的结果我们可以知道之前的设置丢失了。如果重装后配置仍然生效,需要添加永久选项--permanent[root@cghost23~]#firewall-cmd--zone=public--add-port80/tcp--permanentsuccess[root@cghost23~]#firewall-cmd--zone=public--list-port--permanent80/tcp[root@cghost23~]#firewall-cmd--reloadsuccess[root@cghost23~]#firewall-cmd--zone=public--list-port--permanent80/tcp[root@cghost23~]#firewall-cmd--zone=public--list-port80/tcp可以看到添加--permanent选项后,重新加载防火墙规则,之前设置仍然有效。因此,如果要永久添加规则,需要添加--permanent选项。当前默认区域新建的网络连接默认分配到防火墙的公共区域。这个默认区域可以通过下面的命令get[root@cghost23~]#firewall-cmd--get-default-zonepublic下面的命令是设置默认区域为public。由于当前默认区域已经是public,所以会提示当前默认区域已经是public[root@cghost23~]#firewall-cmd--set-default-zone=publicWarning:ZONE_ALREADY_SET:publiclistallavailablezone[root@cghost23~]#firewall-cmd--get-zonesblockdmzdropexternalhomeinternalpublictrustedworkaddanddeletenewzonesaddanewpermanentzonemyzone,添加--permanent选项添加新区域,然后reload生效[root@cghost23~]#firewall-cmd--new-zone=myzone--permanentsuccess[root@cghost23~]#firewall-cmd--reloadsuccess[root@cghost23~]#firewall-cmd--zone=myzone--list-allmyzoneinterfaces:sources:services:ports:化装舞会:noforward-ports:icmp-blocks:richrules:removezonemyzone,同理,removeanexistingzone也需要添加--permanent选项,需要reload才能生效[root@cghost23~]#firewall-cmd--delete-zone=myzone--permanentsuccess[root@cghost23~]#firewall-cmd--reloadsuccess[root@cghost23~]#firewall-cmd--zone=myzone--list-allError:INVALID_ZONE:myzonequeryzoneisallowed使用--list-all选项查询默认区域允许的服务和端口。在下面的结果中,services和ports分别代表允许的服务和端口。[root@cghost23~]#firewall-cmd--list-allpublic(default,active)interfaces:ens33sources:services:dhcpv6-clientsamba-clientsshports:80/tcpmasquerade:noforward-ports:icmp-blocks:richrules:如果你需要查询指定区域所有允许的服务和端口,可以加上--zone=xxx选项,xxx表示指定区域,例如:下面的命令是查询信任区域允许的服务和端口[root@cghost23~]#firewall-cmd--zone=trusted--list-alltrustedinterfaces:sources:services:ports:masquerade:noforward-ports:icmp-blocks:richrules:检查是否允许指定服务的流量通过未指定区域,默认区域是public,下面是查看默认区域是否允许SSH和HTTPS流量[root@cghost23~]#firewall-cmd--query-service=sshyes[root@cghost23~]#firewall-cmd--query-service=httpsno如果查看其他区域,需要指定特定区域[root@cghost23~]#firewall-cmd--zone=public--query-service=sshyes[root@cghost23~]#firewall-cmd--zone=trusted--query-service=sshnoallow并禁止指定服务的流量通过public区,允许samba-client服务的流量通过[root@cghost23~]#firewall-cmd--add-service=samba-client--zone=publicsuccess[root@cghost23~]#firewall-cmd--query-service=samba-client--zone=publicyespubliczone禁止samba-client服务的流量[root@cghost23~]#firewall-cmd--remove-service=samba-client--zone=publicsuccess[root@cghost23~]#firewall-cmd--query-service=samba-client--zone=publicno查看public中所有允许的端口是否允许指定端口的流量area[root@cghost23~]#firewall-cmd--list-port--zone=public80/tcp6379/tcp6000-6010/tcp查看publiczone是否允许6379端口的TCP流量通过[root@cghost23~]#firewall-cmd--list-port--zone=public80/tcp6379/tcp6000-6010/tcp允许和禁止指定端口的流量通过公共区域。允许8080端口的TCP流量通过,也可以理解为对外开放8080端口[root@cghost23~]#firewall-cmd--add-port=8080/tcp--zone=publicsuccess[root@cghost23~]#firewall-cmd--list-port--zone=public80/tcp6379/tcp8080/tcp6000-6010/tcppublic区域禁止8080端口的TCP流量[root@cghost23~]#firewall-cmd--remove-port=8080/tcp--zone=publicsuccess[root@cghost23~]#firewall-cmd--list-port--zone=public80/tcp6379/tcp6000-6010/tcp总结本文介绍Linux中防火墙服务firewalld的一些常用操作。防火墙作为公网和内网之间的流量屏障,对系统来说非常重要。因此,掌握防火墙知识必不可少
