目录
实验二(host2安装http服务,禁止访问防火墙的80端口,其他都可以访问)
防火墙的作用
注明:在计算机领域,防火墙是用于保护信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输。
● 用于保护内网安全的一种设备依据规则进行防护
● 依据规则进行防护
● 用户定义规则
● 允许或拒绝外部用户访问
防火墙分类
逻辑上划分,防火墙可以大体分为主机防火墙和网络防火墙主机防火墙:针对于单个主机进行防护
网络防火墙:针对网络进行防护,处于网络边缘,防火墙背后是本地局域网网络防火墙主外(服务集体),主机防火墙主内(服务个人)
物理上划分,防火墙可分为硬件防火墙和软件防火墙
硬件防火墙:在硬件级别实现防火墙功能,另一部分基于软件实现,其性能高,硬件成本高 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,其性能相较于硬件防火墙低,成本较低,对于 Linux系统已自带,直接使用即可
防火墙性能
● 吞吐量
● 并发连接
● 新建连接
● 时延
● 抖动
硬件防火墙
硬件防火墙定义
硬件防火墙是指把具备配置数据包通过规则的软件嵌入硬件设备中,为网络提供安全防护的硬件设备。多见于网络边 缘。
硬件防火墙作用(拓扑图ups)
硬件防火墙品牌
● Juniper(瞻博网络)
● cisco(思科ASA)
● 华为(思科ASA)
● 天融信
软件防火墙
软件防火墙是单独使用具备配置数据包通过规则的软件来实现数据包过滤。
多见于单主机系统或个人计算机
扩展: Web 应用防火墙 (WAF)
Web应用防火墙是对web防护(网页保护)的安全防护设备(软件),主要用于截获所有HTTP数据或仅仅满足某些规则的 会话。多见于云平台中。
硬件防火墙与软件防火墙比较
硬件防火墙有独立的硬件设备,运算效率较高,价格略高,可为计算机网络提供安全防护。
软件防火墙必须部署在主机系统之上,相较于硬件防火墙运算效率低,在一定程度上会影响到主机系统性能,一般用 于单机系统或个人计算机中,不直接用于计算机网络中。
iptables
iptables是什么?
**●**iptables不是防火墙,是防火墙用户代理
**●**用于把用户的安全设置添加到"安全框架"中
●"安全框架"的名称为net filter
**●**netfilter位于内核空间中,是linux操作系统核心层内部的一个数据包处理模块
**●**iptables是用于在用户控件对内核控件的net filter进行操作的命令行工具
netfilter/iptables功能
netfilter/iptables可简称为iptables,为Linux平台下的包过滤防火墙,是开源的,内核自带的,可以代替成本较高的 企业级硬件防火墙,能够实现如下功能:
**●**数据包过滤,即防火墙
**●**数据包重定向,即转发
**●**网络地址转换,即可NAT
注:平常我们使用iptables并不是防火墙的"服务",而服务是由内核提供的。
iptables概念
iptables工作一句------规则(rules)
iptables是按照规则(rules)来办事的,而规则就是运维人员所定义的条件;规则一般定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。
规则存储在内核控件的数据包过滤表中,这些规则分别指定了源地址、目的地址,传输协议(TCP、UDP、ICMP)和服务类型(HTTP、FTP等)。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包, 比如放行(ACCEPT)、拒绝(REHECT)、丢弃(DROP)等
配置防火墙主要工作就是对iptables规则进行添加、修改、删除等
iptables中链的概念
举例说明:
当客户端访问服务器端的web服务时,客户端发送访问请求报文至网卡,而tcp/ip协议栈是属于内核的一部分,所 以,客户端的请求报文会通过内核的TCP协议传输到用户空间的web服务,而客户端报文的目标地址为web服务器所 监听的套接字(ip:port)上,当web服务器响应客户端请求时,web服务所回应的响应报文的目标地址为客户端地址, 我们说过,netfilter才是真正的防火墙,属于内核的一部分,所以,我们要想让netfilter起到作用,我们就需要在内 核中设置"关口",所以进出的数据报文都要通过这些关口,经检查,符合放行条件的准允放行,符合阻拦条件的则被 阻止,于是就出现了input和output关口,然而在iptables中我们把关口叫做"链"。
上面的举例中,如果客户端发到本机的报文中包含的服务器地址并不是本机,而是其他服务器,此时本机就应该能够 进行转发,那么这个转发就是本机内核所支持的IP_FORWARD功能,此时我们的主机类似于路由器功能,所以我们会 看到在iptables中,所谓的关口并只有上面所提到的input及output这两个,应该还有"路由前","转发","路由后", 它们所对应的英文名称分别为"PREROUTING","FORWARD","POSTROUTING",这就是我们说到的5链。
通过上图可以看出,当我们在本地启动了防火墙功能时,数据报文需要经过以上关口,根据各报文情况,各报名经常 的"链"可能不同,如果报文目标地址是本机,则会经常input链发往本机用户空间,如果报文目标不是本机,则会直接 在内核空间中经常forward链和postrouting链转发出去。
有的时候我们也经常听到人们在称呼input为"规则链",这又是怎么回事呢?我们知道,防火墙的作用在于对经过的数 据报文进行规则匹配,然后执行对应的"动作",所以数据包经过这些关口时,必须匹配这个关口规则,但是关口规则 可能不止一条,可能会有很多,当我们把众多规则放在一个关口上时,所有的数据包经常都要进行匹配,那么就形成 了一个要匹配的规则链条,因此我们也把"链"称作"规则链"。
**●**INPUT:处理入站数据包
**●**OUTPUT:处理出站数据包
**●**FORWARD:处理转发数据包(主要是将数据包转发至本机其它网卡)
**●**当数据报文经过本机时,网卡接收数据报文至缓冲区,内核读取报文ip首部,发现报文不是送到本机时(目的ip 不是本机),由内核直接送到forward链做匹配,匹配之后若符合forward的规则,再经由postrouting送往下一 跳或目的主机。 PREROUTING:在进行路由选择前处理数据包,修改到达防火墙数据包的目的IP地址,用于判断目标主机
**●**POSTROUTING:在进行路由选择后处理数据包,修改要离开防火墙数据包的源IP地址,判断经由哪一接口送往 下一跳
iptables中表的概念
每个"规则链"上都设置了一串规则,这样的话,我们就可以把不同的"规则链"组合成能够完成某一特定功能集合分 类,而这个集合分类我们就称为表,iptables中共有5张表,学习iptables需要搞明白每种表的作用。
**●**filter: 过滤功能,确定是否放行该数据包,属于真正防火墙,内核模块:iptables_filter
**●**nat: 网络地址转换功能,修改数据包中的源、目标IP地址或端口;内核模块:iptable_nat
**●**mangle: 对数据包进行重新封装功能,为数据包设置标记;内核模块:iptable_mangle
**●**raw: 确定是否对数据包进行跟踪;内核模块:iptables_raw
**●**security:是否定义强制访问控制规则;后加上的
iptables中表链之间的关系
我们在应用防火墙时是以表为操作入口的,只要在相应的表中的规则链上添加规则即可实现某一功能。那么我们就应 该知道哪张表包括哪些规则链,然后在规则链上操作即可。
**●**filter表可以使用哪些链定义规则:INPUT,FORWARD,OUTPUT
**●**nat表中可以使用哪些链定义规则:PREROUTING,OUTPUT ,POSTROUTING,INPUT
**●**mangle表中可以使用哪些链定义规则:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
**●**raw表中可以使用哪些链定义规则:PREROUTING,OUTPUT
iptables中的表的优先级
raw-mangle-nat-filter(由高至低)
iptables规则匹配条件分类
基本匹配条件:
源地址,目标地址,源端口,目标端口等
基本匹配使用选项及功能
cpp
-p protocal指定规则协议,tcp(传输层) udp(传输层) icmp(网络层) ip(网络层)
-s source 指定数据包的源地址,192.168.1.10
-d destination指定目的地址
-i 输入网卡接口 如:lo本地回环,ens33
-o 输出网卡接口 如:ens37,ens33等
! 取 反
基本匹配的特点是:无需加载扩展模块,匹配规则生效
扩展匹配条件:
扩展匹配又分为显示匹配和隐式匹配。
扩展匹配的特点是:需要加载扩展模块,匹配规则方可生效。
隐式匹配的特点:使用-p选项指明协议时,无需再同时使用-m选项指明扩展模块以及不需要手动加载扩展模块; 显示匹配的特点:必须使用-m选项指明要调用的扩展模块的扩展机制以及需要手动加载扩展模块。
隐式匹配选项及功能
cpp
-p tcp
--sport 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围
--dport 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围
-p udp
--sport 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围
--dport 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围
--icmp-type
0/0: echo reply 允许其他主机ping
8/0:echo request 允许ping其他主机
显示匹配使用选项及功能
**●**multpiort
多端口
cpp
iptables -I INPUT -d 192.168.31.15 -p tcp -m multiport --dports 22,80 -j ACCEPT
#在INPUT链中开放本机tcp 22,tcp80端口
#该iptables命令的作用是允许通过防火墙的TCP数据包,目标IP地址为192.168.31.15,目标端口为22或80的连接。
iptables -I OUTPUT -s 192.168.31.15 -p tcp -m multiport --sports 22,80 -j ACCEPT
#在OUTPUT链中开发源端口tcp 22,tcp80
#该iptables命令的作用是允许通过防火墙的TCP数据包,源IP地址为192.168.31.15,源端口为22或80的连接。
**●**iprange
多ip地址
cpp
#该iptables命令的作用是允许通过防火墙的TCP数据包,目标IP地址为192.168.2.10,目标端口为23,并且源IP地址在192.168.2.11到192.168.2.21之间的连接。其他源IP地址的连接将被阻止。
iptables -A INPUT -d 192.168.2.10 -p tcp --dport 23 -m iprange --src-range 192.168.2.11-192.168.2.21 -j ACCEPT
#该iptables命令的作用是允许通过防火墙的TCP数据包,源IP地址为192.168.2.10,源端口为23,并且目标IP地址在192.168.2.11到192.168.2.21之间的连接。其他目标IP地址的连接将被阻止。
iptables -A OUTPUT -s 192.168.2.10 -p tcp --sport 23 -m iprange --dst-range 192.168.2.11-192.168.2.21 -j ACCEPT
**●**time
cpp
iptables -A INPUT -d 192.168.2.10 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 192.168.2.10 -p tcp --sport 901 -j ACCEPT
指定访问时间范围
**●**connlimit
连接限制,根据每个客户端IP作并发连接数量限制。
cpp
--connlimit-upto n 连接数小于等于n时匹配
--connlimit-above n 连接数大于n时匹配
**●**limit
报文速率限制
**●**state
追踪本机上的请求和响应之间的数据报文的状态。状态有五种:INVALID, ESTABLISHED, NEW, RELATED, UNTRACKED.
cpp
--state state
NEW 新连接请求
已建立的连接
INVALID 无法识别的连接
RELATED 相关联的连接,当前连接是一个新请求,但
UNTRACKED 未追踪的连接
对于进入的状态为ESTABLISHED都应该放行;
对于出去的状态为ESTABLISHED都应该放行;
严格检查进入的状态为NEW的连接;
所有状态为INVALIED都应该拒绝;
iptables规则中动作
iptables规则中的动作常称为target,也分为基本动作和扩展动作。
**●**ACCEPT:允许数据包通过
**●**DROP:直接丢弃数据包,不给任何回应信息
**●**REJECT:拒绝数据包通过,发送回应信息给客户端
**●**SNAT:源地址转换
解释1:数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定IP,接收方认为数据包的来源是被替换的那个IP主机,返回响应时,也以被替换的IP地址进行。
解释2:修改数据包源地址,当内网数据包到达防火墙后,防火墙会使用外部地址替换掉数据包的源IP地址(目的IP地址不变),使网络内部主机能够与网络外部主机通信。
cpp
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to-source 202.12.10.100
**●**MASQUERADE:伪装,类似于SNAT,适用于动态的、临时会变的ip地址上,例如:家庭使用的宽带。用发送数据的网卡上的ip来替换源ip,对于ip地址不固定场合使用
**●**DNAT:目标地址转换
解释1:数据包从网卡发出时,修改数据包中的目的ip,表现为你想访问A,但因网关做了DNAT,把所有访问A的数据包中的目的ip地址全部修改为B,实际最终访问的是B。
解释2:改变数据包目的地址,当防火墙收到来自外网的数据包后,会将该数据包的目的ip地址进行替换(源ip地址不变),重新转发到内网的主机。
cpp
iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 80 -j DNAT --to- destination 192.168.10.1
**●**REDIRECT:在本机做端口映射
**●**LOG:在/var/log/message文件中记录日志信息,然后将数据包传递给吓一跳规则。
路由是按照目的地址进行路由选择,因此,DNAT是在PPEROUTING链上进行的,SNAT是在数据包发出的时候进行的,因此是在POSTROUTING链上进行的。
制定iptables规则策略
**●**黑名单
没有被拒绝的流量都可以通过,这种策略下管理员必须针对每一种新出现的攻击,制定新的规则,因此不推荐
**●**白名单
没有被允许的流量都要拒绝,这种策略比较保守,根据需要,主机主机逐渐开放,目前一般都采用白名单策略,推荐。
制定iptables规则思路
- 选择一张表,此表决定了数据报文处理的功能
- 选择一条链,此链决定了数据报文流经哪些位置
- 选择合适的规则,此条件决定了对数据做何种条件匹配
- 选择处理数据报文的动作 拒绝还是允许
iptables基础语法机构
cpp
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
不指定表名时,默认表示filter表,不指定链名时,默认表示该表内所有链,除非设置规则链的默认策略,否则 需要指定匹配条件。
iptables链管理方法(了解)
cpp
-N, --new-chain chain:新建一个自定义的规则链;
-X, --delete-chain [chain]:删除用户自定义的引用计数为0的空链;
-F, --flush [chain]:清空指定的规则链上的规则;
-E, --rename-chain old-chain new-chain:重命名链;
-Z, --zero [chain [rulenum]]:置零计数器; 注意:每个规则都有两个计数器
packets:被本规则所匹配到的所有报文的个数; bytes:被本规则所匹配到的所有报文的大小之和;
-P, --policy chain target 制定链表的策略(ACCEPT|DROP|REJECT)
iptables规则管理(重点记忆)
cpp
-A, --append chain rule-specification:追加新规则于指定链的尾部;
-I, --insert chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部;
-R, --replace chain rulenum rule-specification:替换指定的规则为新的规则;
-D, --delete chain rulenum:根据规则编号删除规则;
-D, --delete chain rule-specification:根据规则本身删除规则;
iptables规则显示
cpp
-L, --list [chain]:列出规则;
-v, --verbose:详细信息;
-vv 更详细的信息
-n, --numeric:数字格式显示主机地址和端口号;
-x, --exact:显示计数器的精确值,而非圆整后的数据;
--line-numbers:列出规则时,显示其在链上的相应的编号;
-S, --list-rules [chain]:显示指定链的所有规则;
iptables应用
**●**环境 centos7
iptables-services安装
centos7系统中默认存在iptables命令,此命令仅为简单查询及操作命令,不包含配置文件,安装iptables- services后,将直接生成配置文件,便于配置保存。包含ipv4及ipv6。
cpp
###安装、启动、设为开机自启
yum -y install iptables-services
systemctl start iptables.service
systemctl enable iptables
##保存规则
iptables-save > /etc/sysconfig/iptables
##重载规则
iptables-restore < /etc/sysconfig/iptables
iptables -h #查看帮助信息
#删除现有规则
iptables -F
##查看规则
iptables -nL
实验
准备:host1:192.168.31.15 host2:192.168.31.16
在接下来的实验中,每次做完一个实验,需要删除策略,便于下一个实验
实验一(保存策略)
1.现在我想让hos1ping不通host2,但是host2可以ping通host1
cpp
##host2
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8/0 -j REJECT
[root@localhost ~]# iptables -nL
命令解析
-A INPUT 指定链路
-p icmp --icmp-type 8/0 ping所在的层icmp协议 8/0标识别人ping不通我 我能ping通别人
-j REJECT 动作拒绝并返回一个信息
测试:host1修改前PING通修改后PING不通
测试:host2不影响
2.重启host2并ping测试,可以ping通
3.保存策略后重启测试
cpp
##host2
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8/0 -j REJECT
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
##host1测试
[root@hd1 ~]# ping 192.168.31.16
PING 192.168.31.16 (192.168.31.16) 56(84) bytes of data.
64 bytes from 192.168.31.16: icmp_seq=1 ttl=64 time=0.418 ms
64 bytes from 192.168.31.16: icmp_seq=2 ttl=64 time=0.230 ms
^C
--- 192.168.31.16 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.230/0.324/0.418/0.094 ms
##host2
[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables //恢复之前保存的策略
##host1测试
[root@hd1 ~]# ping 192.168.31.16
PING 192.168.31.16 (192.168.31.16) 56(84) bytes of data.
From 192.168.31.16 icmp_seq=1 Destination Port Unreachable
From 192.168.31.16 icmp_seq=2 Destination Port Unreachable
^C
--- 192.168.31.16 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1000ms
实验二(host2安装http服务,禁止访问防火墙的80端口,其他都可以访问)
cpp
###host2安装并启动http
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# echo 192.168.31.16 > /var/www/html/index.html
##host1可以访问
[root@hd1 ~]# curl 192.168.31.16
192.168.31.16
###host2关闭80端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j REJECT
##host1拒绝连接
[root@hd1 ~]# curl 192.168.31.16
curl: (7) Failed connect to 192.168.31.16:80; 拒绝连接
###host2删除关闭80端口
[root@localhost ~]# iptables -D INPUT -p tcp --dport 80 -j REJECT
##host1可以访问
[root@hd1 ~]# curl 192.168.31.16
192.168.31.16
实验三(拒绝多个端口)
cpp
##在host2上我们利用httpd的虚拟主机头来指定多个不同的端口
mkdir /etc/httpd/vhosts
cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/vhosts
vim /etc/httpd/conf/httpd.conf
###注释80端口、文末插入、注释131-157行
IncludeOptional vhosts/*.conf
###编辑虚拟主机头
vim /etc/httpd/vhosts/httpd-vhosts.conf
listen 80
listen 81
<VirtualHost 192.168.31.16:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/var/www/html/"
ServerName www.test.com
ServerAlias www.dummy-host.example.com
ErrorLog "/var/log/httpd/80-error_log"
CustomLog "/var/log/httpd/80-access_log" common
</VirtualHost>
<VirtualHost 192.168.31.16:81>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/opt/www/html/"
ServerName dummy-host2.example.com
#####创建日志
touch /var/log/httpd/80-error_log
touch /var/log/httpd/80-access_log
touch /var/log/httpd/81-access_log
touch /var/log/httpd/81-error_log
#####创建html页面
echo 192.168.31.16 > /var/www/html/index.html
mkdir /opt/www/html -p
echo http > /opt/www/html/index.html
#####
systemctl restart httpd
关闭host2的80、81端口
cpp
iptables -A INPUT -p tcp -m multiport --dports 80,81 -j REJECT