Linux教程

Linux运维之防火墙之firewalld的管理

本文主要是介绍Linux运维之防火墙之firewalld的管理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

https://blog.csdn.net/qq_42303254/article/details/84981388

 

一、防火墙的介绍
防火墙是整个数据包进入主机前的第一道关卡。防火墙主要通过Netfilter与TCPwrappers两个机制来管理的。

(1)Netfilter:数据包过滤机制
(2)TCP Wrappers:程序管理机制

关于数据包过滤机制有两个软件:firewalld与iptables


二、firewalld介绍
动态防火墙后台程序 firewalld 提供了一个动态管理的防火墙,用以支持网络 “ zones” ,以分配对一个网络及其相关链接和界面一定程度的信任。它具备对 IP v4 和 IP v6 防火墙设置的支持。它支持以太网桥,并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口。

 

三、firewalld和iptables的区别
iptables和firewalld是防火墙中常用的两种程序,可以灵活运用。

firewalld 和 iptables之间最本质的不同是:
iptables service 在 /etc/sysconfig/iptables 中储存配置。

firewalld 将配置储存在 /usr/lib/firewalld/和/etc/firewalld/中的各种xml文件里。其中/usr/lib/firewalld/目录下的文件更全。services目录中是可以为firewalld添加的各种服务;zones目录中是firewalld的各种域的相关文件

iptables通过控制端口来控制服务,而firewalld则是通过控制协议来控制端口
我们这里先对firewalld做实验。Iptables和firewalld只能开一个。


四、实验环境(rhel7.0版本)
主机环境:rhel7.0

各主机信息

主机名 IP
server 172.25.254.1
desktop 172.25.254.2
物理机(rhel7.3版本) 172.25.254.7

五、firewalld的配置

安装配置

"yum install firewalld"安装firewalld服务。
"yum insatll firewall-config"安装firewall-config图形化管理工具。
"systemctl start firewalld"开启firewalld服务。
"systemctl stop firewalld"关闭firewalld服务。
"systemctl disable firewalld"设置firewalld服务开机不自启动。
"systemctl enable firewalld"设置firewalld服务开机自启动。
"systemctl status firewalld"查看firewalld服务的当前状态。
系统提供了三种配置firewalld的方法:(1)图形化的配置工具 firewall-config ;(2)直接编辑xml文件;(3) 命令行工具 firewall-cmd;

这里主要介绍命令行的方式配置firewalld。

 

1、配置firewalld之图形化的方式:firewall-config

"firewall-config"。打开firewalld的图形化界面


其中左下角为软件管理的域,有以下9种(public为firewalld的默认域)

 

block域(限制)和drop域(丢弃)的区别:

block有回应;
而drop没有回应。

Configuration有临时设定(Runtime)和永久(Permanent)设定两种,临时设定reload后会恢复原状态,而永久不会。
每个域后有管理的服务,端口等等

 

 

2、配置firewalld之直接编辑xml文件的方式

"cd /etc/firewalld/zones"。进入目录/etc/firewalld/zones
"vim public.html"。编辑public域的文件。删除第6行(http的设置)和第7行(ssh的设置),重新加载firewalld(或者重启firewalld服务)生效
"firewall-cmd --list-all"。可以看到刚刚删除的http服务和ssh服务消失。

 

 


"cd /usr/lib/firewalld./services"。进入目录/usr/lib/firewalld/services
"cp http.xml http8080.xml"。复制http.xml为http8080.xml
"vim http8080.xml"。编辑http8080.xml文件,将其中的80该为8080。保存退出。重新加载firewalld(或者重启firewalld服务)生效
"firewall-cmd --get-services"。可以看到新增了一个http8080服务。

 

 

 


此时就可以把http8080服务加入到firewalld里面了

 

 

3、配置firewalld之命令行工具:firewall-cmd

1、

"firewall-cmd --state"。查看firewalld的当前状态,查询状态还可以用"systemctl status firewalld"


2、

"firewall-cmd --get-zones"。查看firewalld有哪些域
"firewall-cmd --get-active-zones"。查看firewalld当前生效的域
"firewall-cmd --get-default-zone"。查看firewalld默认生效的域

 

 


3、

"firewall-cmd --get-services"。列出系统中用名称表示的服务,即firewalld可以允许的服务


4、

"firewall-cmd --set-default-zone=trusted"。修改firewalld的默认域,将其修改为trusted
注意:此修改是永久生效,不需要加参数permanent。而且不用重新加载firewalld。
如果将firewalld的默认域修改为trusted,那么相当于所有的都能通过。此时,即使firewalld里面没有添加http,也是可以访问apache的。

 

 

 

 

 

5、

"firewall-cmd --list-all"。列出firewalld当前域的规则
"firewall-cmd --list-all-zones"。列出firewalld所有域的状态

 


6、

"firewall-cmd --zone=trusted --list-all"。列出firewalld的trusted域的规则


7、

"firewall-cmd --reload"。重新加载firewalld配置
"firewall-cmd --complete-reload"。重新加载firewalld配置
--complete-reload与--reload的区别在于:--complete-reload断开连接,而--reload不断开连接


此时别的主机,已经通过ssh远程连接

 

删除ssh服务,通过--reload重新加载,发现客户端仍然可以操作

 

 

删除ssh服务,通过--complete-reload重新加载,发现客户端已经不能继续操作了

 

 

 

8、

"firewall-cmd --add-service=xxxx"。临时添加一个服务,例如添加http,使得这个服务的数据可以通过,但是这个添加是临时的,重新加载firewalld(或者重启firewalld服务)后就会消失
"firewall-cmd --permanent --add-service=xxxx"。永久添加一个服务,重新加载firewalld(或者重启firewalld服务)生效

 

 


9、

"firewall-cmd --remove-service=xxxx"。临时删除一个服务,重新加载firewalld(或者重启firewalld服务)后又会出现
"firewall-cmd --permanent --remove-service=xxxx"。永久删除一个服务,重新加载firewalld(或者重启firewalld服务)生效

 

 

 

 

10、

"firewall-cmd --add-port=xxxx/tcp"。临时添加一个端口,添加是临时的,重新加载firewalld(或者重启firewalld服务)后就会消失
"firewall-cmd --permanent --add-port=xxxx/tcp"。使某个端口的数据可以通过。例如在Apache配置文件中将端口改为8080,则即使firewall中添加 了htpp也无法访问,因为其设置的可以通过的端口是80。此时需要用上述命令,添加8080端口,完成后,即可使用Apache访问。重新加载firewalld(或者重启firewalld服务)生效

 

 


11、

"firewall-cmd --remove-port=xxxx/tcp"。临时删除一个端口,重新加载firewalld(或者重启firewalld服务)后又会出现
"firewall-cmd --permanent --remove-port=xxxx/tcp"。永久删除某tcp端口,重新加载firewalld(或者重启firewalld服务)生效

 

 


12、

"firewall-cmd --add-source=172.25.254.83 --zone=trusted"。临时往trusted域添加一个源IP,添加是临时的,重新加载firewalld(或者重启firewalld服务)后又会消失
"firewall-cmd --permanent --add-source=172.25.254.7 --zone=trusted"。永久往trusted域添加一个源IP。表示来自"172.25.254.7"的数据全部通过。如果开启,firewalld不添加http,且改为8080 端口后不添加到firewalld,"172.25.254.7 "主机也可以访问Apache,重新加载firewalld(或者重启firewalld服务)生效


此时172.25.254.83可以访问172.25.254.1的apache

 

而172.25.254.2不可以访问172.25.254.1的apache

 

 

 

 

 

13、

"firewall-cmd --remove-source=172.25.254.7 --zone=trusted"。临时删除trusted域的一个源IP。重新加载firewalld(或者重启firewalld服务)后又会出现
"firewall-cmd --permanent --remove-source=172.25.254.83 --zone=trusted"。永久删除trusted域的一个源IP。重新加载firewalld(或者重启firewalld服务)生效

 

 


14、

firewall-cmd --remove-interface=eth0"。删除默认域public中的端口eth0。注意:不需要添加参数"--permanent",也不需要重新加载firewalld(或者重启firewalld服务),立即生效。重载firewalld服务之后,不会失效,但是重启firewalld服务之后,就是失效。
firewall-cmd --permanent --remove-interface=eth0"。此语句有错误。

 

 


15、

"firewall-cmd --add-interface=eth0"。往默认域public中添加端口eth0。注意:不需要添加参数"--permanent",也不需要重新加载firewalld(或者重启firewalld服务),立即生效。重载firewalld(或是重启firewalld)服务之后,也不会失效。
"firewall-cmd --permanent --add-interface=eth0"。往默认域public中添加端口eth0。注意:需要重新加载firewalld(或者重启firewalld服务),才能生效。

 

 


16、

"firewall-cmd --change-interface=eth0 --zone=trusted"。改变端口eth0所在的域,将域改为trusted域。注意:不需要添加参数"--permanent",也不需要重新加载firewalld(或者重启firewalld服务),立即生效。重载firewalld服务之后,不会失效。但是重启firewalld服务之后,就会失效。
"firewall-cmd --permanent --change-interface=eth0 --zone=trusted"。注意:需要重新加载firewalld(或者重启firewalld服务),才能生效。

 

 

 

 


17、

block域(限制)和drop域(丢弃)的区别:

block有回应;
而drop没有回应。

"firewall-cmd --zone=block --add-source=172.25.254.7 "。将172.25.254.7这个IP加入block域。此操作在IP为172.25.254.1的主机上操作。此时在IP为172.25.254.7的主机上ping172.25.254.1,是ping不通的,但是有回应。
"firewall-cmd --zone=drop --add-source=172.25.254.7 "。将172.25.254.7这个IP加入drop域。此操作在IP为172.25.254.1的主机上操作。此时在IP为172.25.254.7的主机上ping172.25.254.1,是ping不通的,但是有没有回应的。

 

 

 


六、firewalld设置访问权限(Direct Rules)

常见服务的端口介绍:

httpd服务/nginx服务:80端口
ssh服务:22端口
https服务:443端口
mariadb/mysql服务:3306端口
php:9000端口
squid服务:3128端口
iscsi服务:3306端口
memcache服务:11211端口

1、假设现在我们需要设置:只允许172.25.254.7这台主机可以访问apache。
注意:不能将此IP加入trusted域,因为这样的话,IP为172.25.254.7可以访问任何东西。

此时需要做两件事:1、firewalld允许通过的服务中不能有http服务;2、设置Direct Rules只允许172.25.254.7可以访问。

 

ACCEPT状态

第一步:

fireward允许通过的服务中默认没有httpsd服务,所以不用做修改

 

 

第二步:

"firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.7 -j ACCEPT" #这条命令是临时的,在重启firewalld服务(重载firewalld服务之后,不会失效)之后,就会失效。
解释:

filter:表示三张表中的filter表
INPUT:表示五条链中的INPUT链
1:表示第一行
-p:表示正在使用的协议
tcp:表示tcp协议
--dport:表示目的地端口
80:表示apache的端口
-s:表示数据来源
172.25.254.7:表示数据来源是172.25.254.7
-j:表示动作(该动作有三种状态:(1)REJECT——拒绝;(2)ACCEPT——接受;(3)DROP——丢弃。)
ACCEPT:表示状态是ACCEPT
**注意**:对于动作DROP和REJECT两者的区别要明确;
REJECT动作相当于是客户端对服务器发送访问请求,服务端产生回应,并拒绝当前的客户端进行访问;而,DROP动作是客户端对服务器发送请求,但是服务器是不会给予回应的,相当于丢弃;


第三步:

"firewall-cmd --direct --get-all-rules"。查看Direct Rules中的规则


第四步:

测试:

1、首先在172.25.254.7这台主机的浏览器进行测试(成功说明不了问题,还需要在其他主机进行测试)

2、在172.25.254.2这台主机的浏览器进行测试

 

 

第五步:(可做可不做)

"firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.83 -j ACCEPT"。删除Direct Rules域中的此规则


2、假设现在我们需要设置:只是不允许172.25.254.7这台主机可以通过ssh连接。
此时需要做两件事:1、firewalld允许通过的服务中必须有ssh服务;2、设置Direct Rules不允许172.25.254.7可以访问。此时有两种状态可以设置:一种是REJECT;另外一种是DROP。

 

REJECT状态

第一步:

"firewall-cmd --permanent --add-service=ssh"
"firewall-cmd --reload"
"firewall-cmd --list-all"


第二步:

"firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.7 -j REJECT" #这条命令是临时的,在重启firewalld服务(重载firewalld服务之后,不会失效)之后,就会失效。


第三步:

"firewall-cmd --direct --get-all-rules"。查看Direct Rules中的规则


第四步:

测试:

1、首先对172.25.254.7这台主机进行测试:此时被拒绝有回应(成功说明不了问题,还需要在其他主机进行测试)

 

2、对172.25.254.2这台主机的浏览器进行测试

 

 

第五步:(可做可不做)

"firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.7 -j REJECT"。删除Direct Rules中的规则


DROP状态

第一步:

"firewall-cmd --permanent --add-service=ssh"
"firewall-cmd --reload"
"firewall-cmd --list-all"


第二步:

"firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.7 -j DROP" #这条命令是临时的,在重启firewalld服务(重载firewalld服务之后,不会失效)之后,就会失效。


第三步:

"firewall-cmd --direct --get-all-rules"。查看Direct Rules中的规则


第四步:

测试:

1、首先对172.25.254.7这台主机进行测试:此时被拒绝没有回应(成功说明不了问题,还需要在其他主机进行测试)

 

2、对172.25.254.2这台主机进行测试

 

 

第五步:(可做可不做)

"firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.7 -j DROP"。删除Direct Rules中的规则

 

七、firewalld设置调转端口
要实现调转端口必须打开firewalld的地址伪装功能!!!!!!!!!!

调转的目的端口必须使得firewalld可以通过ssh服务!!!!!!!!!

 

第一步:

"firewall-cmd --permanent --add-masquerade"。打开firewalld的地址伪装功能,重新加载firewalld(或者重启firewalld服务)生效


第二步:

"firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.2"。设置通过ssh连接172.25.254.1时,自动调转到172.25.254.2。 #这条命令是临时的,在重启firewalld服务(或重载firewalld服务)之后,就会失效。


第三步:

需要注意的是:172.25.254.2这台主机的firewalld必须允许ssh服务通过


第四步:

测试:通过ssh远程连接172.25.254.1这台主机时,自动调转到172.25.254.2(此时输入的密码是:IP为172.25.254.2主机的密码)


注意:此时通过"w -i"命令看到的IP不是真正连接的IP(172.25.254.7),而是要实现调转端口的IP(172.25.254.1)


注意:出现下面的错误时的解决方法

 


第五步:(可做可不做)

"firewall-cmd --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.2"。删除上面实现自动调转的设置。

 

八、firewalld设置地址伪装
要实现地址伪装,有两个网卡的虚拟机必须打开firewalld的地址伪装功能!!!!!!!!!!

有两个网卡的虚拟机必须打开地址转发功能!!!!!!!!!!

要通过ssh远程连接的目的主机必须使得firewalld能够通过ssh服务!!!!!!!!!

 

第一步:在这台虚拟机(server)添加第二块网卡eth1;

 

 

 

第二步:在含有两块网卡的主机(server虚拟机)上做如下设置;

"cd /etc/sysconfig/network-scripts"
"cp ifcfg-eth0 ifcfg-eth1"
"vim ifcfg-eth1"。编辑如下的内容
"systemctl restart network"
"ifconfig"

 

 


第三步:在含有两块网卡的主机(server虚拟机)上打开地址伪装功能;

 

 

第四步:在含有两块网卡的主机(server虚拟机)上打开地址转发功能

 

 

第五步:在含有一块网卡(desktop虚拟机)的主机上做如下设置;

"cd /etc/sysconfig/network-scripts"
"vim ifcfg-eth0"。编辑如下的内容
"systemctl restart network"
"ifconfig"
"route -n"。查看网关

 

 

 


第六步:在要远程连接的目的主机上使得firewalld能够通过ssh服务

 

 

第七步:在单网卡虚拟机(desktop虚拟机)上测试

 

 

1.1.1.2和172.25.254.7因为不在一个网段里,网络是不能连通,这里为什么可以利用ssh服务可以连接呢?实际上是172.25.254.1登陆172.25.254.7,而不是1.1.1.2登陆172.25.254.7;这里也就完成了地址伪装。
当然,我们可以利用"w -i"查询看到的是真正登陆的ip(172.25.254.1)。

1.1.1.1是可以和172.25.254.1通信的。(这是因为1.1.1.1和172.25.254.1这两个IP是同一台主机的两个网卡的IP)。1.1.1.2是可以和1.1.1.1通信的。(这是因为1.1.1.1和1.1.1.2处于同一个网络段)

那么要使得1.1.1.2和172.25.254.1通信,就需要1.1.1.1作为中间人,也就是我们所说的网关。

网关设定好之后,1.1.1.2是可以和172.25.254.1通信的。但是不可以和172.25.254.7通信。(这是因为1.1.1.1不可以和172.25.254.7通信)。那么要使1.1.1.2可以和172.25.254.7通信,就需要在172.25.254.1的主机上打开地址伪装功能(即添加masquerade),并打开地址转发功能。

这篇关于Linux运维之防火墙之firewalld的管理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!