1.1 防火墙的分类
(一)、包过滤防火墙
数据包过滤(packet Filtering)技术是在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,称为访问控制表(access control lable,ACL)。通过检查数据流中每个数据包的源地址和目的地址,所用的端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。
包过滤防火墙的优点是它对用户来说是透明的,处理速度快且易于维护。缺点是:非法访问一旦突破防火墙,即可对主机上的软件和配置漏洞进行攻击;数据包的源 地址、目的地址和IP的端口号都在数据包的头部,可以很轻易地伪造。“IP地址欺骗”是黑客针对该类型防火墙比较常用的攻击手段。
(二)、代理服务型防火墙
代理服务(proxy service)也称链路级网关或TCP通道。它是针对数据包过滤和应用网关技术存在的缺点而引入的防火墙技术,其特点是将所有跨跃防火墙的网络通信链路 分为两段。当代理服务器接收到用户对某个站点的访问请求后就会检查请求是否符合控制规则。如果规则允许用户访问该站点,代理服务器就会替用户去那个站点取 回所需的信息,再转发给用户,内外网用户的访问都是通过代理服务器上的“链接”来实现的,从而起到隔离防火墙内外计算机系统的作用。
此外,代理服务也对过往的数据包进行分析和注册登记,并形成报告,同时当发现有被攻击迹象时会向网络管理员发出警告,并保留攻击记录,为证据收集和网络维护提供帮助。
1.2 防火墙的工作原理
(一)、包过滤防火墙的工作原理
包过滤是在IP层实现的,因此,它可以只用路由器来完成。包过滤根据包的源IP地址、目的IP地址、源端口、目的端口及包传递方向等报头信息来判断是否允 许包通过,过滤用户定义的内容,如IP地址。其工作原理是系统在网络层检查数据包,与应用层无关。包过滤器的应用非常广泛,因为CPU用来处理包过滤的时 间可以忽略不计。而且这种防护措施对用户透明,合法用户在进出网络时,根本感觉不到它的存在,使用起来很方便。这样系统就具有很好的传输性能,易扩展。
但是这种防火墙不太安全,因为系统对应用层信息无感知--也就是说,它们不理解通信的内容,不能在用户级别上进行过滤,即不能识别不同的用户和防止地址的 盗用。如果攻击者把自己主机的IP地址设成一个合法主机的IP地址,就可以很轻易地通过包过滤器,这样更容易被黑客攻破。基于这种工作机制,包过滤防火墙 有以下缺陷:
1、通信信息:包过滤防火墙只能访问部分数据包的头信息。
2、通信和应用状态信息:包过滤防火墙是无状态的,所以它不可能保存来自于通信和应用的状态信息。
3、信息处理:包过滤防火墙处理信息的能力是有限的。
(二)、代理服务型防火墙工作原理
代理服务型防火墙在应用层上实现防火墙功能。它能提供部分与传输有关的状态,能外圈提供与应用相关的状态和部分传输的信息,它还能处理和管理信息。
1.3 防火墙之firewalld:
在RHEL7里有几种防火墙共存:firewalld、iptables、ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。
FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行临时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。
以前的 system-config-firewall/lokkit 防火墙模型是静态的,每次修改都要求防火墙完全重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配置所需模块的装载等。而模块的卸载将会破坏状态防火墙和确立的连接。相反,firewall daemon 动态管理防火墙,不需要重启整个防火墙便可应用更改。因而也就没有必要重载所有内核防火墙模块了。
不过,要使用 firewall daemon 就要求防火墙的所有变更都要通过该守护进程来实现,以确保守护进程中的状态和内核里的防火墙是一致的。
另外,firewall daemon 无法解析由 ip*tables 和 ebtables 命令行工具添加的防火墙规则。
1.4 防火墙之iptables:
(一)、iptables概述及原理
iptables只是一个管理内核包过滤的工具,可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正执行这些过滤规则的是netfilter(linux核心中一个通用架构)及其相关模块(如iptables模块和nat模块)。
netfilter是linux核心中一个通用架构,它提供一系列的“表”(tables),每个表由若干“链”(chains)组成,而每条链中可以由一条或数条规则(rule)组成。可以这样理解,netfilter是表的容器,表是链的容器,链是规则的容器。
系统缺省的表为“filter”,该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的:“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链 时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件,如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条 规则;最后,如果数据包不符合该链中任何一条规则,系统就会根据该链预先定义的策略(policy)来处理该数据包。
(二)、iptables传输数据包的过程
当数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有以下3种情况:
1、数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。
2、数据包的上的地址不是本机,也就是说这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。
3、数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。
用户可以给各链定义规则,当数据包到达其中的每一条链,iptables就会根据链中定义的规则来处理这个包。iptables将数据包的头信息与它所传 递到的链中的每条规则进行比较,看它是否和每条规则完全匹配。如果数据包与某条规则匹配,iptables就对该数据包执行由该规则指定的操作。例如某条 链中的规则决定要丢弃(DROP)数据包,数据包就会在该链处丢弃;如果链中规则接受(ACCEPT)数据包,数据包就可以继续前进;但是,如果数据包与 这条规则不匹配,那么它将与链中的下一条规则进行比较。如果该数据包不符合该链中的任何一条规则,那么iptables将根据该链预先定义的默认策略来决 定如何处理该数据包,理想的默认策略应该告诉iptables丢弃(DROP)该数据包。
1.5 防火墙之firewall与iptables的区别:
firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
firewalld 和 iptables server 之间最本质的不同是:iptables server在/etc/sysconfig/iptables中存储配置,而firewalld将配置存储在/user/lib/firewalld/和/etc/firewalld/中的各种xml文件里;
下面一张图,让大家明确的了解防火墙 Firewall 与 iptables 之间的关系与区别。
2.1 防火墙之firewall区域管理:
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域:
阻塞区域(block):任何传入的网络数据包都将被阻止。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted):所有的网络连接都可以接受。
丢弃区域(drop):任何传入的网络连接都被拒绝。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
注:FirewallD的默认区域是public。firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。
2.2 防火墙之firewall过滤规则:
source | 根据源地址过滤 |
interface | 根据网卡过滤 |
service | 根据服务名过滤 |
port | 根据端口过滤 |
icmp-block | icmp 报文过滤,按照 icmp 类型配置 |
masquerade | ip 地址伪装 |
forward-port | 端口转发 |
rule | 自定义规则 |
其中,过滤规则的优先级遵循如下顺序:
1.source 2.interfac 3.firewalld.conf
2.3 防火墙之firewall配置方法:
firewalld的配置方法主要有三种:firewall-config、firewall-cmd和直接编辑xml文件,其中 firewall-config是图形化工具,firewall-cmd是命令行工具.
2.3.1 firewall配置方法:firewall-config
1.先开启firewalld,关闭iptables
yum search firewalld
systemctl stop iptables
systemctl mask iptables
systemctl start firewalld
2.使用工具firewall-config改变firewalld默认的域(默认的是public)
选择options--->trusted 所有都可以连接我的主机
在block中添加不允许连接的主机ip
选择options--->block 所有都不可以连接我的主机
在trusted中添加允许连接的主机ip
3.端口转发
选择options---->trusted----->port forwarding
port/port/range :8888
local forward :80
masquerading 勾对号
浏览器中输入172.25.254.133:8888 自动访问80端口
也可以设置为自动转到别的主机的端口
选择options---->trusted----->port forwarding
port/port/range :22
forward another port :172.25.254.133 22端口
masquerading 勾对号
命令行输入ssh [email protected] -X
改变firewalld默认的域
端口转发
图形工具可以做到firewalld的全部管理,以上仅介绍了两个功能,其他功能可以自行实验。
2.3.2 firewall配置方法:firewall-cmd命令行工具
*)命令:
firewall-cmd --state #查看火墙状态
firewall-cmd --set-default-zone=public #设置默认域
firewall-cmd --get-active-zones #正在使用的域
firewall-cmd --get-default-zone #获得默认域
firewall-cmd --get-zones #所有可设的域名
firewall-cmd --get-services #所有可以直接添加的服务
firewall-cmd --list-all-zones #所有域的具体信息
*)设置访问的数据包来源
desktop(233)虚拟机下载httpd,浏览器中不能访问desktop的共享文件
source 根据源数据过滤
firewall-cmd --permanent --zone=trusted ---add-source=172.25.254.72
firewall-cmd --reload
在172.25.254.72主机上访问233,可以访问
firewall-cmd --permanent --zone=trusted ---remove-source=172.25.254.72
移除,不能访问
备注: --permanent表示设置永久生效,需要重新加载才能生效
不加permanent参数则为本次修改只是临时设定,下次开机就失效
*)设置网卡的所在区域
配置desktop虚拟机两个网卡,两个网段:
eth0:172.25.254.233
eth1:1.1.1.100
配置server虚拟机一个网卡,
eth1:1.1.1.200
使用server虚拟机访问desktop的eth1的1.1.1.100网段
firewall-cmd --list-all 会看到eth1和eth0都在public区域,想把eth1摘出来
firewall-cmd --remove-interface=eth1 --zone=public 在public区域中移除网卡eth1
firewall-cmd --list-all
fireall-cmd --add-interface=eth1 --zone=trusted 在trusted区域中添加网卡eth1
firewall-cmd --list-all
firewall-cmd --list-all --zone=trusted
firewall-cmd --change-interface=eth1 --zone=public 也可以直接使用change改变网卡eth1的区域为public
备注:直接将访问端的地址添加到trusted 或者将访问端对应的网卡添加进trusted域中
*)设置火墙允许的服务
firewall-cmd --permanent --zone=public --add-service=smtp
firewall-cmd --permanent --zone=public --remove-service=smtp
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload 不会断开正在连接的链接
firewall-cmd --complete-reload 重新加载配置,断开所有链接
cd /etc/firewalld
cd zones
ls
vim public.xml 重启服务之后的新的xml文件,只有dhcpv6服务
vim public.xml.old 重启服务之前的xml文件,有dhcpv6.ssh服务
firewall-cmd --permanent --add-service=ssh
vim public.xml 重启服务之后的新的xml文件,是服务的名称,有dhcpv6.ssh服务
vim public.xml.old 重启服务之前的xml文件,只有dhcpv6服务
firewall-cmd --reload 重新加载
cd /lib/firewalld/services 是库函数
vim ssh.xml 是服务和端口号 若将端口号改变
systemctl restart firewalld
firewall-cmd --list-all 虽然ssh再允许的服务里面,但是不能使用,端口不能用
*)设置火墙开启的端口
firewall-cmd --zone=public --list-ports
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --permanent --zone=public --remove-port=8080/tcp
*)添加特殊访问规则:
指定某一source能否访问本机指定的port,访问的filter表
firewall-cmd --dircet --add-rule ipv4 filter INPUT 1 -s 172.25.254.72 -p tcp --dport 22 -j ACCEPT 指定特殊访问,没有指定的就走默认访问,public域里面
firewall-cmd --remove-service=ssh 这时,72主机能ssh链接该主机 其他主机不能ssh链接该主机
firewall-cmd --list-all
firewall-cmd --dircet --get-all-rules 获取特殊访问列表
firewall-cmd --dircet --remove-rlue ipv4 filter INPUT 1 -s 172.25.254.72 -p tcp --dport 移除特殊访问列表
备注:filter INPUT 1 表示顺序访问表的第一行
-s 来源 -p 协议 --dport 访问的目的端口 -j 执行的动作
-j 的动作有 accept ; reject,有响应,拒绝之后就不会再访问
drop,丢弃,会一直访问服务端,一直访问一直丢弃
*)指定某一来源不允许访问22端口
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 ! -s 172.25.254.72 -p tcp --dport 22 -j ACCEPT
说明172.25.254.72不走特殊访问,走默认访问,默认访问列表里没有ssh,所以不能链接,其他主机走特殊访问列表,可以链接该主机
desktop虚拟机两个网卡,两个网段:
eth0:172.25.254.100
eth1:1.1.1.100
server虚拟机一个网卡,
eth1:1.1.1.200
*)地址伪装:使server的1.1.1.200网段可以访问172.25.254.0/24网段
firewall-cmd --permanent --zone --add-masquerade
firewall-cmd --permanent --zone --add-rich-rule'rule famliy=ipv4 source addres=172.25.254.0/24 masquerade'
*)端口转发
firewall-cmd --permanent --zone --add-forward
firewall-cmd --permanent --zone --add-forward-port=port=22:proto=tcp:toport=22:toaddr=1.1.1.200
firewall-cmd --permanent --zone --add-rich-rule='rule famliy=ipv4 source addres=172.25.254.0/24 forward-port port=80 protocol=tcp to-port=8080 '
在server上连接172.25.254网段的主机看到的是172.25.254.233的主机连接的,但其实真实的是1.1.1.200连接的
所以在desktop虚拟机上设置:
firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=1.1.1.200
3.1 iptables的基础知识
1、规则(rule)
规则(rule)就是网络管理员预定的条件,规则一般定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表 中,这些规则分别指定了源地址、目的地址、传输协议(TCP、UDP、ICMP)和服务类型(如HTTP、FTP、SMTP)。当数据包与规则匹配 时,iptables就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)、或丢弃(DROP)等。配置防火墙的主要 规则就是添加、修改和删除这些规则。
2、链(chains)
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链 时,iptables就会从链中的第一条规则开始检查,看该数据包是否满足规则所定义的条件,如果满足,系统就会根据该条规则所定义的方法处理该数据包, 否则iptables将继续检查下一条规则。如果该数据包不符合链中任何一何况规则,iptables就会根据该链预先定义的默认策略来处理该数据包。
3、表(tables)
表(tables)提供特定的功能,iptables内置3个表,即filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。
(1)filter表。filter表主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对防火墙而言,主要利用filter表中指定一系列规则来实现对数据包进行过滤操作。
filter表是iptables默认的表,如果没有指定使用哪个表,iptables就默认使用filter表来执行所有的命令。filter表包含了 INPUT链(处理进入的数据包)、FORWARD链(处理转发的数据包)和OUTPUT链(处理本地生成的数据包)。在filter表中只允许对数据包 进行接受或丢弃的操作,而无法对数据包进行更改。
(2)nat表。nat青主要用于网络地址转换NAT,该表可以实现一对一、一对多和多对多的NAT工作,iptables就是使用该表实现共享上网功能 的。nat表包含了PREROUTING链(修改即将到来的数据包)、OUTPUT链(修改在路由之前本地生成的数据包)和POSTROUTING链(修 改即将出去的数据包)。
(3)mangle表。mangle表主要用于对指定的包进行修改,因为某些特殊应用可能去改写数据包的一些传输特性,例如理性数据包的TTL和TOS等,不过在实际应用中该表的使用率不高。
3.2 iptables的设置
我们先进行iotables参数解释:
-t 指定表名称 -n 不做解析
-L 列出指定表中的策略 -A 增加策略
-p 网络协议 --dport 端口
-s 数据来源 -j 动作
ACCEPT 允许 REJECT 拒绝
DROP 丢弃 -N 增加链
-E 修改链名称 -X 删除链
-D 删除指定策略 -I 插入
-R 修改策略 -p 修改默认策略
systemctl stop firewalld firewalld会和iptables冲突,所以先关闭firewalld
systemctl mask firewalld
systemctl start iptables
systemctl enable iptables
iptables -t filter -nL #查看指定表filter中的策略
iptables -t nat -nL #-n参数存在时显示的是ip,没有的话是主机名
iptables -t mangle -nL
iptables -F #-F:删除指定表中所有规则
iptables -nL
service iptables save #保存当前策略,保存了之后重启火墙策略重新出现
vim /etc/sysconfig/iptables #iptables的配置文件
添加策略:
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -s 172.25.254.72 -j ACCEPT
iptables -t filter -A INPUT -s 172.25.254.72 -j REJECT 72主机可以访问,匹配到第二条
iptables -nL
iptables -D INPUT 3 删除第三条
修改策略:
iptables -R INPUT 2 -s 172.25.254.72 -j REJECT
现在72不能访问本机,我们设置可以访问22端口
iptables -I INPUT 2 -s 172.25.254.250 -p tcp --dport 22 -j ACCEPT 必须放在第二条才能匹配
没有设置策略的其他主机走默认策略,policy accept
iptables -P INPUT DROP 则其他主机连接该主机无法连接,一直被丢弃
iptables -P INPUT ACCEPT
增加链
iptables -N redhat #增加redhat链
iptables -E redhat westos #修改链名称
iptables -X westos #删除westos链
地址转发与伪装:
先进行如下的配置
1.1.1.200 1.1.1.100(eth1) 172.25.254.72
server虚拟机 172.25.254.233(eth0) 真机
desktop虚拟机
源地址地址转发(SNAT):伪装
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.233
目的地地址转发(DNAT):转发
desktop中设置:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 1.1.1.200:22
源地址地址转发(SNAT)
目的地地址转发(DNAT):转发
################################The End############################