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

一、防火墙的介绍

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

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

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

 

二、firewalld介绍

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

 

三、firewalld和iptables的区别

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

  1. firewalld 和 iptables之间最本质的不同是:

    iptables service 在 /etc/sysconfig/iptables 中储存配置。

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

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

 

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

主机环境:rhel7.0

各主机信息

主机名IP
server172.25.254.1
desktop172.25.254.2
物理机(rhel7.3版本)172.25.254.7

 

五、firewalld的配置

 

安装配置

  1. "yum  install   firewalld"安装firewalld服务。
  2. "yum  insatll   firewall-config"安装firewall-config图形化管理工具。
  3. "systemctl   start  firewalld"开启firewalld服务。
  4. "systemctl   stop  firewalld"关闭firewalld服务。
  5. "systemctl   disable  firewalld"设置firewalld服务开机不自启动。
  6. "systemctl   enable  firewalld"设置firewalld服务开机自启动。
  7. "systemctl   status  firewalld"查看firewalld服务的当前状态。

系统提供了三种配置firewalld的方法:(1)图形化的配置工具 firewall-config ;(2)直接编辑xml文件;(3) 命令行工具 firewall-cmd;

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

 

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

 

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

 

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

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

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

 

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

 

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

 

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

 

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

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

 

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

 

1、

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

 

2、

  1. "firewall-cmd   --get-zones"。查看firewalld有哪些域
  2. "firewall-cmd   --get-active-zones"。查看firewalld当前生效的域
  3. "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、

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

 

6、

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

 

7、

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

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

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

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

 

8、

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

 

9、

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


 

10、

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

 

11、

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

 

12、

  1. "firewall-cmd    --add-source=172.25.254.83  --zone=trusted"。临时往trusted域添加一个源IP,添加是临时的,重新加载firewalld(或者重启firewalld服务)后又会消失
  2. "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、

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

 

14、

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

  2. firewall-cmd   --permanent   --remove-interface=eth0"。此语句有错误。

 

15、

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

  2. "firewall-cmd   --permanent   --add-interface=eth0"。往默认域public中添加端口eth0。注意:需要重新加载firewalld(或者重启firewalld服务),才能生效。

 

16、

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

  2. "firewall-cmd   --permanent   --change-interface=eth0  --zone=trusted"。注意:需要重新加载firewalld(或者重启firewalld服务),才能生效。

 

17、

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

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

 

  1. "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不通的,但是有回应。
  2. "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)

 

常见服务的端口介绍:

  1. httpd服务/nginx服务:80端口
  2. ssh服务:22端口
  3. https服务:443端口
  4. mariadb/mysql服务:3306端口
  5. php:9000端口
  6. squid服务:3128端口
  7. iscsi服务:3306端口
  8. 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服务之后,不会失效)之后,就会失效。

解释:

  1. filter:表示三张表中的filter表
  2. INPUT:表示五条链中的INPUT链
  3. 1:表示第一行
  4. -p:表示正在使用的协议
  5. tcp:表示tcp协议
  6. --dport:表示目的地端口
  7. 80:表示apache的端口
  8. -s:表示数据来源
  9. 172.25.254.7:表示数据来源是172.25.254.7
  10. -j:表示动作(该动作有三种状态:(1)REJECT——拒绝;(2)ACCEPT——接受;(3)DROP——丢弃。)
  11. 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状态

 

第一步:

  1. "firewall-cmd   --permanent   --add-service=ssh"
  2. "firewall-cmd   --reload"
  3. "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状态

 

第一步:

  1. "firewall-cmd   --permanent   --add-service=ssh"
  2. "firewall-cmd   --reload"
  3. "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虚拟机)上做如下设置;

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

 

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

 

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

 

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

  1. "cd   /etc/sysconfig/network-scripts"
  2. "vim  ifcfg-eth0"。编辑如下的内容
  3. "systemctl   restart   network"
  4. "ifconfig"
  5. "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),并打开地址转发功能。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值