gutunan

CentOS如何设置防火墙?用firewalld命令

0
阅读(1759)

CentOS 7 版本之后的版本会使用 firewalld 这个服务来管理防火墙,而防火墙设定在Linux的世界里也算是常会遇到的课题,因此,本文将以CentOS 7做为测试平台,来示范如何管理或者查询防火墙的相关资讯,适合一般新手阅读。

CentOS如何设置防火墙?用firewalld命令

防火墙区域简介
firewalld是用区域(zone)的概念来管理防火墙,我们可以针对每个区域进行不同的设定或规则,各区域的预设作用在此不多做介绍,但一般我们比较常接触到的区域是「public」,完整的区域介绍可以参考此文章的说明。
注:在使用firewalld指令进行操作时,若想要针对某个区域做查询,可加上–zone=区域名称来限定范围,如设定有变更,建议要养成重新载入设定的习惯:sudo firewall-cmd –reload

firewalld 指令教学
以下就列出几个比较常见的firewalld的相关指令以及范例供大家参考:

查看防火墙的运作状况

查看防火墙是否有开启,或者它的运作情况,如果「Active」的值是inactive就是没有在运作,active即是正常运作中。

指令:systemctl status firewalld 或 firewall-cmd --state
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2018-08-01 13:34:09 CST; 10s ago
Docs: man:firewalld(1)
Main PID: 861 (firewalld)
CGroup: /system.slice/firewalld.service
└─861 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

PS1:如果是用「firewall-cmd –state」来查询的话,防火墙有运行时会显示「running」,没有运行时则显示「not running」,利用此方法查询需要足够权限

启动、停止、重启firewalld服务
firewalld会以service的方式运行,所以要启动、停止、动启防火墙的服务,一样直接用「systemctl」来管理即可:

启动:sudo systemctl start firewalld
停止:sudo systemctl stop firewalld
重启:sudo systemctl restart firewalld
查询以及设定预设的区域
查询预设区域:firewall-cmd --get-default-zone
设定预设区域:sudo firewall-cmd --set-default-zone=work
查看已知(支援)的服务
firewall-cmd --get-services
查看有开Port的服务
和「–get-service」不太相同,这是列出目前区域中有开Port的服务

sudo firewall-cmd --list-services
列出运行中的区域
这个指令个人觉得还蛮实用的,可以同时查网路介面的代号,或者用–list-all指令也可以

firewall-cmd --get-active-zones
public
interfaces: ens33 (网路介面)
sources: 11.22.33.44/24

开启连接埠
如果我们有特别的Port想要开启,那么可以利用以下指令来达成
.–zone:指定区域
.–add-port:加入欲开启的连接埠,并指定通讯协定
.–remove-port:移除开启的连接埠,并指定通讯协定

sudo firewall-cmd --zone=public --add-port=6666/tcp
上面的指令是暂时性开启,重开系统就会失效,如果想要永久生效,那么需要再指令后面多加–permanent

sudo firewall-cmd --zone=public --add-port=6666/tcp --permanent
而开Port时,也可以一次开启多个,例如以下的例子就会同时开启6666 ~ 6670等5个Port

sudo firewall-cmd --zone=public --add-port=6666-6670/tcp
查询已开启的连接埠
承上,如果在开启连接埠之后,可以利用–list-ports来查询连接埠的开启状况,以确保有开启成功

sudo firewall-cmd --list-ports
想移除已开启的Port,则利用–remove-port来达成:

sudo firewall-cmd --zone=public --remove-port=6666/tcp --permanent
新增、移除服务
在前面有提到「–get-service」是列出已知的服务,因此,我们可以借由这些服务名称,直接透过–add-service的方式来开放此服务,例如:

sudo firewall-cmd --zone=public --add-service=mysql --permanent
要将加入的服务移除的话,则使用–remove-service

sudo firewall-cmd --zone=public --remove-service=mysql --permanent
列出区域的详细设定
可以指定区域来查询,该指令会列出此区域中设定的相关细节

sudo firewall-cmd --zone=public --list-all
重新载入防火墙设定
sudo firewall-cmd --reload
Port Forwarding 连接埠转发
利用–add-forward-port参数,可以将来自连接埠A的资料转发至连接埠B,如以下的例子就是将来自Port=22的讯息转发至Port=2233

sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2233
承上,以下的例子没有用到toport,而是用了toaddr,这样表示要把资讯转发到位址192.168.10.1的相同连接埠,也就是22

sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toaddr=192.168.10.1
那如果同时指定toport和toaddr呢?也是可以的,例如以下范例是把来自本机22连接埠的资料转发至192.168.10.1主机上是2233连接埠

sudo firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2233:toaddr=192.168.10.1
注:连接埠转发如果是不同主机的话,那么要先利用–add-masquerade来开启防火墙伪装,移除的话则使用–remove-masquerade:

sudo firewall-cmd --zone=public --add-masquerade

白名单
利用–add-source将IP加入白名单内,移除则用–remove-source

firewall-cmd --zone=public --add-source=192.168.100.0/24 --permanent
Rich rules
Rich rules在官方文件中有详细的用法说明,主要会用–add-rich-rule与–remove-rich-rule来管理操作一些比较复杂的状况,以下就举几个平常比较有机会遇到的实务案例供大家参考:

IP白名单:允IP存取
允许来自指定IP的存取请求,即加入该IP进白名单,范例如下:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.10.10 accept'
在还没使用「–add-rich-rule」之前,如果利用–list-rich-rules来查询已加入的rich rules,加到的结果会是空的(预设值),而当我们执行过上述的指令,再一次进行rich rules的查询,就可以看到刚刚已加入的条件了:

sudo firewall-cmd --list-rich-rules
执行结果:rule family="ipv4" source address="192.168.10.1" accept
IP黑名单:拒绝IP存取
承上,有允许IP进入当然就有拒绝的设定,要拒绝某个IP的请求,只要把上述指令中的accept改成reject就行了,在这边我们做一点小变化,加入一些其他的条件,例如下面的例子是拒绝来自192.168.1.10且Port=22的存取请求

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.10.10" port port=22 protocol=tcp reject'
Port Forwarding 连接埠转发
我们也可以利用rich rules来设定连接埠转发,例如下面范例就是将主机192.168.19.1、连接埠80上的流量导到8080连接埠上

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=192.168.10.1 forward-port port=80 protocol=tcp to-port=8080'
而下面的范例则是将连接埠80的资料导到主机192.168.10.2的8080连接埠上(如果转发至不同主机的话,masquerade要开启)

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.10.2'

原文出处:http://www.gutunan.com/archives/2703