一、防火墙

    防火墙是整个数据包进入主机前的第一道关卡。是一种位于内部网络与外部网络之间的网络安全系统,是一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。

    在centos7中,防火墙主要通过Netfilter与TCPwrappers两个机制来管理的

 

从逻辑上讲,防火墙分为主机防火墙和网络防火墙

  • 主机防火墙,针对单个主机进行防护,一般软件实现

  • 网络防火墙,往往处于网络边缘,对防火墙背后的本地局域网进行防护,一般是硬件

 

1、Firewalld介绍

    在RHEL7里有几种防火墙配置工具:FirewallD、iptables、ebtables,默认是使用FirewallD。

    Filewalld即Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器

    FirewallD自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过FirewallD和iptables的结构以及使用方法不一样

 

1.1、iptables和firewalld关系

 

 

    Firewalld不依赖NetworkManager,但建议使用。如果不使用NetworkManager,则存在一些限制:Firewalld将不会收到有关网络设备重命名的通知。

    netfilter是Linux 2.4.x及更高版本内核系列中包过滤框架软件

    ebtables即是以太网桥防火墙,以太网桥工作在数据链路层,ebtables来过滤数据链路层数据包

    iptables即ip防火墙,ip工作在网络层,用来过滤网络层数据包

    ipset相当于iptable的扩展,iptable通过链表线性存储,然后遍历来实现匹配。而ipset通过索引的数据结构设计达到快速匹配。这种设计使得当配置比较庞大的时候,也可以高效地进行匹配。

    nft,即nftables,nftables是一个netfilter项目,旨在替换现有的{ip,ip6,arp,eb}tables框架

 

FirewallD 是 iptables 的前端控制器,用于实现持久的网络流量规则。与直接控制 iptables相比,使用FirewallD有两个主要区别:

  • FirewallD 使用区域和服务而不是链式规则。

  • firewalld可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接。而iptables,在修改了规则后必须得全部刷新才可以生效;

 

iptables:

  • 用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,再执行命令 /etc/init.d/iptables reload 使变更的规则生效。

  • 在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则

  • 如果加载了防火墙的模块,需要在重新加载后进行手动加载防火墙的模块

 

firewalld:

  • 任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的iptables即可。

  • 还有命令行和图形界面配置工具,它仅仅是替代了 iptables service部分,其底层还是使用iptables作为防火墙规则管理入口。

  • firewalld 使用 python 语言开发,在新版本中已经计划使用c++重写daemon部分。

     

1.2、zone

    如果开启了防火墙,所有进来的报文,都会送往netfilter进行过滤。

    但是在过滤之前,会先把数据包送到一个zone,然后再去和zone里面的过滤规则进行匹配,要么允许,要么拒绝

    zone,可以理解为不同的房间,一个zone就是一个房间,每个房间里面存放的就是不同的过虑规则

 

    区域定义了网络连接的可信等级。这是一个一对多的关系,这意味着一次连接可以仅仅是一个区域的一部分,而一个区域可以用于很多连接。区域按照从不信任到信任的顺序排序:

  • 丢弃(drop):任何流入网络的包都被丢弃,不作出任何响应。只允许流出的网络连接。

  • 阻塞(block):任何进入的网络连接都被拒绝,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接。

  • 公开(public):用以可以公开的网络,默认区域。只允许选中的连接接入。

  • 外部(external):用在路由器等启用伪装的外部网络。只允许选中的连接接入。

  • 隔离区(dmz):用以允许隔离区(dmz)中的电脑有限地被外界网络访问。只接受被选中的连接。

  • 工作(work):用在工作网络。只接受被选中的连接。

  • 家庭(home):用在家庭网络。只接受被选中的连接。

  • 内部(internal):用在内部网络。只接受被选中的连接。

  • 受信任的(trusted):允许所有网络连接。

 

    /usr/lib/firewalld/ 存放默认配置文件,避免修改它们,因为每次firewalld 软件包的更新会重置这些文件。

    /etc/firewalld/ 系统配置文件,这些文件将覆盖默认配置。

    通常将配置文件从/usr/lib/firewalld/拷贝到/etc/firewalld/ 相应目录,再根据需求进行修改。

    target,设置该zone的默认动作。值:ACCEPT、%%REJECT%%(default)、DROP

 

#查看一个zone的target,也就是默认规则

firewall-cmd --permanent [--zone=zone] --get-target

 

#设置一个zone的默认规则

firewall-cmd --permanent [--zone=zone] --set-target=target

 

注意:

  • FirewallD有两个配置集:“运行时”和“持久”。

  • 运行时,在系统或firewalld重启时,配置将丢失。

  • 持久,系统或firewalld重启时,配置不会丢失,但更改不会应用于正在运行的系统。

  • 默认情况下,firewall-cmd 命令用于运行时配置,使用 --permanent 将保存到持久配置中。

 

1.3、service

firewalld可以根据预定义的网络服务来定义规则。

service配置文件位于:/usr/lib/firewalld/services和/etc/firewalld/services

 

#查看服务

firewall-cmd --get-services

 

1.4、规则

一个数据报文,应该送往哪个zone呢?

1,source,对于传入系统的每个数据包,将首先检查其源IP,如果该IP关联到了一个zone,就将这个数据包送往该zone

2,interface,如果该源地址没有关联zone,则送往接收这个数据的网卡所关联的zone

3,默认zone,如果这个网卡也没有关联zone,就送往默认zone

 

#系统默认有哪些zone呢?

firewall-cmd --list-zones

 

#在每个zone里面有不同的默认规则

#查看home这个zone的默认规则

firewall-cmd --list-all --zone=home

 

2、配置关联

配防火墙,第一件事,就是把一个源地址,或网卡去关联一个zone

 

2.1、source关联到zone

#把一个IP段关联到一个zone

#将172.25.0.0/24这个IP段关联到home这个zone,以后只要源IP是172.25.0.0/24这个网段的数据包,就会送去home这个zone去匹配规则

firewall-cmd --permanent --add-source=172.25.0.0/24 --zone=home

 

注意:

  • --permanent 代表永久生效,但当次并没有生效,需要重新加载规则才生效,考试的时候注意,必须要加上这个选项,如果没有这个选项,只是当次生效,但重启就没了

 

#重新加载规则

firlewall-cmd --reload

 

#查询一个IP段是否属于一个zone

firewall-cmd --query-source=172.25.0.0/24 --zone=home

 

#把一个IP段从一个zone中删除

#把172.25.0.0/24这个IP段从home这个zone中删除,并永久生效

firewall-cmd --permanent --remove-source=172.25.0.0/24 \

--zone=home

 

#重新加载

firewall-cmd --reload

 

2.2、interface关联到zone

#和interface相关的操作

firewall-cmd --help |grep interface

 

#把一个网卡加入到一个zone

firewall-cmd --permanent --add-interface=eth0 --zone=home

 

#这里,需要重启服务才行。

systemctl restart firewalld

 

#删除关联,这个网卡就回归默认zone了

firewall-cmd --permanent --remove-interface=eth0 --zone=home

 

2.3、默认zone

#查看默认zone

firewall-cmd --get-default-zone

 

#设置默认zone

firewall-cmd --set-default-zone=work

 

3、基本规则

3.1、service

#查看所有service

firewall-cmd --get-services

 

#后面的服务名,可以通过两个tab键出来

#如果不加后面的zone,就只会在默认zone

firewall-cmd --permanent --add-service=http --zone=home

 

#重新加载

firewall-cmd --reload

 

#查看

firewall-cmd --list-all --zone=home

 

#删除

firewall-cmd --permanent --remove-service=http --zone=home

 

3.2、port

#增加tcp80端口到home这个zone

firewall-cmd --permanent --add-port=80/tcp --zone=home

firewall-cmd --reload

 

#删除

firewall-cmd --permanent --remove-port=80/tcp --zone=home

 

3.3、icmp-block

#icmp应答

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

 

#icmp请求

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

 

#采用内核参数

sysctl -a |grep icmp

net.ipv4.icmp_echo_ignore_all = 0

 

vi /etc/sysctl.conf

net.ipv4.icmp_echo_ignore_all = 1

 

sysctl -p

sysctl -a |grep icmp

 

3.4、masquerade

    把linux服务器充当一个路由器,最少要两张网卡,一张对内,一张对外

    对内网卡的IP地址,作为内网的网关

    当内网地址需要访问外网时,会把内网的源IP转换成公网IP

 

#开启masquerade,伪装

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

 

#重新加载

firewall-cmd --reload

 

3.5、forward-port

    为了安全,一般我们会将服务的熟识端口改掉,但这样对于用户就不够友好,使用端口转发机制,用户还是使用熟识端口访问应用,当数据包到达防火墙,防火墙再将数据包转发到真正的端口。

 

#访问80端口的时候,转到ssh服务的22端口

firewall-cmd --add-forward-port=port=80:proto=tcp:toport=22

 

#重新加载

firewall-cmd --reload

 

#验证

ssh -p 80 root@172.24.0.1

 

4、rich-rules富规则

    富规则比基本规则能实现更强的功能

    通过富规则(rich rule),可以去指定源地址、目的地址、目的端口、协议等

 

#查看帮助

man 5 firewalld.richlanguage

 

4.1、添加富规则

#仅允许172.25.0.0/24这个网段访问http服务

firewall-cmd --permanent \

--add-rich-rule='rule family=ipv4 \

source address=172.25.0.0/24 service name=http accept'

 

#重新加载

firewall-cmd --reload

 

#对masquerade作限制

firewall-cmd --permanent --zone=public \

--add-rich-rule='rule family=ipv4 \

source address=172.25.0.0/24 masquerade'

 

#只有172.25.0.0/24网段访问80端口,才会转发到22端口

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 \

source address=172.24.0.0/24 forward-port port=80 \

protocol=tcp to-port=22'

 

4.2、删除富规则

firewall-cmd --permanent \

--remove-rich-rule='rule family=ipv4 \

source address=172.25.0.0/24 service name=http accept'

 

firewall-cmd --reload

 

4.3、特殊流量

#有些流量是不走TCP和UDP协议的,比如ospf协议,这时指定方式就不一样:

firewall-cmd --permanent --add-rich-rule=’rule \

protocol value=ospf accept’

 

5、图形化

firewall-config

  • 选zone

  • 选source或interface

  • 选service或port

  • 自动保存,设置完成后,直接关闭即可

 

注意:

  • 如果最上面configration那里,选择runtime,临时生效,parmanent,永久生效

 

6、tcpdump抓包

#抓取eno16777736接口的所有ICMP包

tcpdump -i eno16777736 icmp

 

#-w,将抓取的包存入一个文件

#可以在windows,使用wireshark,图形界面查看数据包。

tcpdump -i eno16777736 icmp -w f1

 

#抓取所有与192.168.1.1这个IP相关的包

tcpdump host 192.168.1.1

 

#只抓取源IP是192.168.1.1的包

tcpdump src host 192.168.1.1

 

#只抓取目的IP是192.168.1.1的包

tcpdump dst host 192.168.1.1

 

#抓取和本地22号端口通讯的所有数据包

tcpdump tcp port 22

 

二、TCP Wrapper

    TCP Wrappers是RHEL 7系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。换句话说,Linux系统中其实有两个层面的防火墙,第一种是前面讲到的基于TCP/IP协议的流量过滤工具,而TCP Wrappers服务则是能允许或禁止Linux系统提供服务的防火墙,从而在更高层面保护了Linux系统的安全运行。

 

1、控制文件

TCP Wrappers服务的防火墙策略由两个控制列表文件所控制:

  • /etc/hosts.allow,允许控制列表文件来放行对服务的请求流量

  • /etc/hosts.deny,拒绝控制列表文件来阻止对服务的请求流量

 

注意:

  • 控制列表文件修改后会立即生效

  • 系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;

  • 如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。

  • 如果这两个文件全都没有匹配到,则默认放行流量。

  • 编写拒绝策略规则时,填写的是服务名称,而非协议名称;

 

2、语法

    单一主机192.168.1.1IP地址为192.168.1.1的主机

    指定网段192.168.1.或192.168.10.0/255.255.255.0IP段为192.168.1.0/24的主机

    指定DNS后缀.example.com所有DNS后缀为.example.com的主机

    指定主机名称www.example.com主机名称为www.example.com的主机

    指定所有客户端ALL或*所有主机全部包括在内

 

例1:禁止所有人访问本地SSHD服务

vi /etc/hosts.deny

sshd: *

 

例2,允许192.168.1.0/24这个网段可以访问本地SSHD

vi /etc/hosts.allow

sshd: 192.168.1.

 

例3,允许主机名后缀为.example.com的主机访问本地SSHD

vi /etc/hosts.allow

sshd: .example.com