天涯共此良辰时

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、防火墙简介

  Centos7和Centos6防火墙的区别:

  Centos6 使用iptables工具,主要用于过滤数据包,属于网络层防火墙

  Centos7 使用firewall工具,能够允许哪些服务可用,哪些端口可用,属于更高一层的防火墙

 

二、工作模式

  Centos7中firewalld默认有九种(zones)工作模式:

  [root@centos02 22:51:55 zones]# ls
  block.xml dmz.xml drop.xml external.xml home.xml internal.xml public.xml trusted.xml work.xml   # 9种不同的区域配置

  block(限制):任何接受的网络连接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒绝。

  dmz(非军事区):用于你的非军事区内的电脑,此区域可公开访问,可以有限的进入你的内部网络,仅仅接收经过选择的连接。

  drop(丢弃):任何接收的网络数据包都被丢弃,没有任何恢复,仅能有发送出去的网络连接(不能进来,但是可以出去)

  external(外部):特别是为路由器启动了伪装功能的外部网,你不能信任来自网络的其他计算机,不能相信他们不会对你造成伤害,只能接收经过选择的连接。

  home(家庭):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接

  internal(内部):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收金国选择的连接

  public(公共):默认的模式,在公共区域内使用,不能相信网络内其他计算机不会对你造成危害,只能接收经过选取的连接

  trusted(信任):可接收所有的网络连接

  work(工作):用于工作区,你可以基本信任网络的其他电脑不会对你造成危害,仅仅接收经过选择的连接

  

  问题:对于一个具体的请求应该哪个zone来处理呢?通过firewalld.conf配置文件进行处理

[root@centos02 23:19:31 ~]# cat /etc/firewalld/firewalld.conf
# firewalld config file

# default zone
# The default zone used if an empty zone string is used.
# Default: public
DefaultZone=public

 

 

三、相关文件   

  The configuration for firewalld is stored in various XML files in /usr/lib/firewalld and /etc/firewalld

  1. 系统配置目录(主要的作用:提供配置文件的模板信息)

   /usr/lib/firewalld/zones/*    # 目录中存放不同级别的区域配置信息

   /usr/lib/firewalld/services/*.xml     # 目录中存放定义好的网络服务以及端口参数,除非很熟悉,否在不建议修改

[root@centos01 ~]# ll /usr/lib/firewalld/services/*.xml
-rw-r--r--. 1 root root 412 Apr 11 2018 /usr/lib/firewalld/services/amanda-client.xml
-rw-r--r--. 1 root root 447 Apr 11 2018 /usr/lib/firewalld/services/amanda-k5-client.xml
-rw-r--r--. 1 root root 320 Apr 11 2018 /usr/lib/firewalld/services/bacula-client.xml
-rw-r--r--. 1 root root 346 Apr 11 2018 /usr/lib/firewalld/services/bacula.xml
-rw-r--r--. 1 root root 275 Apr 11 2018 /usr/lib/firewalld/services/bitcoin-rpc.xml
-rw-r--r--. 1 root root 307 Apr 11 2018 /usr/lib/firewalld/services/bitcoin-testnet-rpc.xml
-rw-r--r--. 1 root root 281 Apr 11 2018 /usr/lib/firewalld/services/bitcoin-testnet.xml
-rw-r--r--. 1 root root 244 Apr 11 2018 /usr/lib/firewalld/services/bitcoin.xml
-rw-r--r--. 1 root root 294 Apr 11 2018 /usr/lib/firewalld/services/ceph-mon.xml
-rw-r--r--. 1 root root 305 Apr 11 2018 /usr/lib/firewalld/services/ceph.xml
-rw-r--r--. 1 root root 168 Apr 11 2018 /usr/lib/firewalld/services/cfengine.xml

 

具体信息:

[root@centos01 ~]# cat /usr/lib/firewalld/services/telnet.xml
<?xml version="1.0" encoding="utf-8"?>
<service>  # 表示一个服务
<short>Telnet</short>  # 表示服务的名称
<description>Telnet is a protocol for logging into remote machines. It is unencrypted, and provides little security from network snooping attacks. Enabling telnet is not recommended. You need the telnet-server package installed for this option to be useful.</description>  # 服务的描述
<port port="23" protocol="tcp"/>  # 端口,使用port可以不通过service而直接对端口进行设置
</service>

 

  2. 用户配置目录(注意所有用户做的配置都会保存在这个目录的某个文件中)

  /etc/firewalld    # 用于存放用户的配置信息,配置文件跟系统目录差不多

[root@centos02 23:26:53 ~]# ls /etc/firewalld/
firewalld.conf helpers icmptypes ipsets lockdown-whitelist.xml zones

services    # zone模式最根本的是调用不同services实现了不同的效果

四、配置端口

  方式一:配置命令

  firewall-cmd --permanent --add-port=9527/tcp  # 默认会在/etc/firewalld/zones/public.xml中新增一条记录

  <port protocol="tcp" port="9527"/>  # 端口已经被添加

  firewall-cmd --zone=dmz --permanent --add-port=8010/tcp  # 指定模式,会在dmz.xml新增一条记录

  

  方式二:配置文件

[root@centos02 19:39:00 zones]# pwd  # 当前用户配置信息保存的路径
/etc/firewalld/zones

[root@centos02 20:01:46 zones]# ls  # 当前用户配置信息的具体文件信息,old是指备份文件信息
public.xml public.xml.old

[root@centos02 19:57:13 zones]# cat public.xml  # 查看zones中名为public
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>  # 服务的名称
<service name="dhcpv6-client"/>  # 服务
<port protocol="tcp" port="9527"/>  # 新增的端口记录
</zone>

 五、常用命令

  systemctl status firewalld.service 查看firewalld状态

  systemctl start firewalld.service 开启

  firewalld systemctl stop firewalld.service 关闭

  firewalld firewall-cmd --zone=public --add-port=80/tcp --permanent 永久添加指定端口

  firewall-cmd --zone=public --remove-port=8080/tcp --permanent 永久移除指定端口

  firewall-cmd --query-port=3306/tcp 查看端口是否被开放,返回yes/no

  firewall-cmd --list-all 查看所有开放的端口

  systemctl enable firewalld.service 开启自启

  systemctl disable firewalld.service 禁止开机自启

  systemctl is-enabled firewalld.service 查看是否开机自启

  firewall-cmd --reload 更新防火墙规则(立即生效,永久添加时需要reload)

 

六、案例

举例:(使用配置文件的方法修改zone和service)

1.需求:把ftp服务自定义端口1121,需要在work zone下面方形ftp

[root@litongyao zones]# cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services   (复制模板到service下)

[root@litongyao zones]# vim /etc/firewalld/services/ftp.xml              (修改ftp的配置文件,修改端口1121)

[root@centos02 00:23:14 ~]# cat /usr/lib/firewalld/services/ftp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>FTP</short>
<description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
<port protocol="tcp" port="21"/>
<module name="nf_conntrack_ftp"/>
</service>

[root@litongyao zones]# cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/         (复制模板到zones下)

[root@litongyao zones]# vim /etc/firewalld/zones/work.xml             (修改work.xml的配置文件,把ftp加到里面)

[root@centos02 00:37:28 ~]# cat /usr/lib/firewalld/zones/work.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Work</short>
<description>For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>

<service name="ftp"/>
</zone>

[root@litongyao zones]#  firewall-cmd --reload                  (重新加载配置,配置文件生效)

 

2.需求:在防火墙开启的情况下,如何修改ssh服务的端口?并实现远程登录的功能

 第一步:修改ssh配置文件中的默认端口号 /etc/ssh/sshd_conf

    # Port 22  # 默认端口号

    Port 9527  # 修改后的端口号

    systemctl restart sshd  # 服务重启后,远程连接断开

    第二步:firewalld未开启9527端口功能,是否可以连接 

Connecting to 192.168.0.201:9527...
Could not connect to '192.168.0.201' (port 9527): Connection failed.    # 新端口连接请求失败

 第三步:防火墙开启9527端口

   firewalld-cmd --permanent --add-port=9527/tcp

   firewall-cmd --reload 或者 systemctl restart firewalld

 第四步:测试连接

  ssh 192.168.0.201 9527    # 192.168.0.201服务器地址

  

[c:\~]$ ssh 192.168.0.201 9527


Connecting to 192.168.0.201:9527...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Thu Jul 30 09:11:33 2020 from 192.168.0.1
[root@centos01 ~]#

七、总结

  1. Centos7防火墙的关键配置文件

  /usr/lib/firewalld  # 系统默认配置文件目录

  /etc/firewalld    # 用户默认配置文件目录

  services  # 存储一组服务文件(目录下的服务才会被防火墙支持)

  zones  # 存储区域规则(防火墙的所有过滤规则都在这个目录下面的策略文件中)

  firewalld.conf  #  默认配置文件,可以设置默认使用的区域,默认区域为public,对应zones目录下的public.xml

  

  2. 在执行命令时,如果没有带 --permanent参数表示配置立即生效,但是不会对该配置进行存储,相当于重启服务器器就会丢失。

   如果添加到命令行中,那么防火墙需要重启

  3. Centos7防火墙非常的灵活(服务,端口,协议)

    备注:在做下面测试命令的时候,自己搭建的环境是宿主机跟虚拟机,但是屏蔽宿主机的ip的时候一直都不成功(大坑)

    办法: 

      虚拟机使用的NAT转换,宿主机的ip地址会被转换为另外的IP地址,因此无法屏蔽宿主机的ip

 

    服务:

      firewall-cmd --add-service=<service name> #添加服务

      firewall-cmd --remove-service=<service name> #移除服务

      测试:

      第一步:firewall-cmd --permanent --remove-service=ssh    # 移除ssh服务

      第二步:firewall-cmd --reload  # 重启     

Connecting to 10.0.0.200:22...
Could not connect to '10.0.0.200' (port 22): Connection failed.

Type `help' to learn how to use Xshell prompt.    # 远程登陆服务被屏蔽掉

 

    端口

      firewall-cmd --add-port=<port>/<protocol> #添加端口/协议(TCP/UDP)

      firewall-cmd --remove-port=<port>/<protocol> #移除端口/协议(TCP/UDP)

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

      测试:注意在测试ssh远程登陆服务的时候,ssh.xml文件已经默认了22端口,因此仅仅通过命令去掉22端口无法屏蔽ssh服务

        第一步:打开ssh.xml文件,删除22端口的配置  <port protocol="tcp" port="22"/>,随后将无法远程连接

        第二步:添加端口

            firewall-cmd --permanent --add-port=22/tcp 

            firewall-cmd --reload

            远程连接成功

    协议:

      firewall-cmd --add-protocol=<protocol> # 允许协议

      firewall-cmd --remove-protocol=<protocol> # 取消协议 firewall-cmd --list-protocols # 查看允许的协议

      测试:禁止ping

      firewall-cmd --permanent --add-icmp-block=echo-reply

      firewall-cmd --reload

[D:\~]$ ping 10.0.0.200

正在 Ping 10.0.0.200 具有 32 字节的数据:
来自 10.0.0.200 的回复: 无法访问目标主机。
来自 10.0.0.200 的回复: 无法访问目标主机。
来自 10.0.0.200 的回复: 无法访问目标主机。
来自 10.0.0.200 的回复: 无法访问目标主机。

    允许指定ip的所有流量

      firewall-cmd --add-rich-rule="rule family="ipv4" source address="<ip>" accept"

      firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.1" accept" # 表示允许来自192.168.2.1的所有流量

      测试:

[root@centos02 ~]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.0.0.1" reject"
success
[root@centos02 ~]# firewall-cmd --reload
success

    允许指定ip的指定协议

      firewall-cmd --add-rich-rule="rule family="ipv4" source address="<ip>" protocol value="<protocol>" accept"

         firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept" # 允许192.168.2.208主机的icmp协议,即允许192.168.2.208主机ping

    允许指定ip的指定服务

      firewall-cmd --add-rich-rule="rule family="ipv4" source address="<ip>" service name="<service name>" accept"

      firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept" # 允许192.168.2.208主机访问ssh服

    允许指定ip的指定端口

      firewall-cmd --add-rich-rule="rule family="ipv4" source address="<ip>" port protocol="<port protocol>" port="<port>" accept"

      firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.1" port protocol="tcp" port="22" accept" # 允许192.168.2.1主机访问22端口

    允许指定ip网段

      firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" accept"

    禁止指定ip网段

      firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" reject"

 

  4.防火墙的原理

    1. 网络连接进入主机后,会经过防火墙

    2. 防火墙首先查找services是否存在,如果不存在,就直接屏蔽掉;如果存在,匹配连接信息跟文件配置是否一致;

    3. 然后读取zones中的策略,判断是否连接是否可以通过

 

posted on 2020-07-30 00:40  天涯共此良辰时  阅读(264)  评论(0编辑  收藏  举报