防火墙

Iptables Tutorial - Beginners Guide to Linux Firewall

安全防御

常见的攻击手段

拒绝服务(DOS):
通过大量访问请求使服务器资源耗尽,无法向正常用户处理请求连接,常见解决手段使用云服务商的流量清洗功能

口令破解:
常用的攻击手法俗称“跑字典”,常用解决方案设置登录错误次数限制

已知漏洞
通过一直漏洞进行数据获取或提权,常见解决手段定时更新防御性补丁

欺骗权限用户
社会工程学,通过欺骗权限客户得到授权资格的方式

常见的防御手段

基础类型防火墙:
主要实现包过滤防火墙

IDS类防火墙:
入侵检测系统,提供报告和事后监督为主

IPS类防火墙:
入侵防御系统,分析数据包内容,根据模式匹配去阻断非法访问

主动安全类防火墙:
对特定服务类型进行专项防御,常见设备有waf、daf

基础类防火墙

概念篇:

防火墙定义:
工作在主机边缘或者网络边缘处对数据报文进行检测,并能够实现定义好的规则,对数据报文进行相应处理的模块

防火墙分类:

类型分类
	软件:iptables
	硬件:深信服,网御,华为
逻辑上分类
	主机防火墙
	网络防火墙

工作机制:
包过滤防火墙:源地址 目标地址 源端口 目标的端口 连接状态
应用层防火墙:URL

模块
内核态:netfilter
用户态:iptables

防火墙

iptables 经历的构造变化

防火墙

centos7安装iptables
卸载firewalld
yum -y remove firewalld
yum -y install iptables-services.x86_64
systemctl start iptables.service
systemctl enable iptables.service

iptables 相关原理

而Linux防火墙的工作区域为下图中的绿色阴影部分(防火墙的概念这里不赘述):

防火墙

Linux系统中防火墙功能的两大角色:iptables和netfilter。iptables是Linux系统下应用层内置控制防火墙的工具,netfilter则是防火墙功能的具体实现,是内核空间的功能模块。所谓的iptables“控制”防火墙,就是用户利用iptables将防火墙规则设置给内核的netfilter功能模块,这中间涉及“四表五链”:

防火墙

“四表五链”其实是对用户设置规则的管理,是看待用户设置的规则的两个维度。举个例子,看图中深蓝色箭头的数据流向,数据包要到达用户层,需要经过PREROUTING链(路由前链),INPUT链(输入链),在这个链路中存放着用户设置的规则,这些规则根据功能不同又会被分组存放在RAW表、Mangle表和NAT表中。当数据包抵达PREROUTING链时,netfilter程序会依次从RAW表、Mangle表和NAT表中取出针对PREROUTING链的用户规则并执行相应操作;同理,INPUT链上的规则也会被分组存放在Mangle表和Filter表中,netfilter程序会依次从这两个表中取出针对INPUT链设置的用户规则并执行相应操作。(特别强调,转发的数据包不经过 OUTPUT 链)

这里需要强调的一点是FORWARD链,它是转发链,也就是说只有在网卡个数>=2的系统中才具有的功能:开启系统转发功能后,当网络层发现数据包并非发给本机时会从另一网卡转发出去。中间经过FORWARD链,FORWARD链上的规则由Filter表、Mangle表读取操作。所以对于单网卡的系统中,上图应更改为:

防火墙

四表五链功能性介绍

规则链:承载防火墙规则

入站:INPUT
出战:OUTPUT
转发:FORWARD
路由前应用规则:修改目标地址 PREROUTING 
路由后应用规则:修改源地址 POSTROUTING

链详解:

链(Chains):
INPUT链:
处理所有目标地址是本地系统的数据包。
在filter、nat 和 mangle 表中都有。

OUTPUT链:
处理所有源地址是本地系统的数据包。
在filter、nat、mangle 和 raw 表中都有。

FORWARD链:
处理所有通过系统进行的转发的数据包。
仅在filter 表中。

PREROUTING链:
在数据包进入路由之前处理,主要用于目标地址修改。
在nat、mangle 和 raw 表中。

POSTROUTING链:
在数据包离开路由之后处理,主要用于源地址修改。
在nat、mangle 和 raw 表中。

=======================================
INPUT和OUTPUT均包括经过内核和不经过内核的信息
FORWARD是经过内核的路由转发信息
PREROUTING是不经过内核路由之前的信息
POSTROUTING是不经过内核路由之后的信息

规则表:承载防火墙链

filter表:
主要用于过滤数据包,决定是否允许数据包通过防火墙。
包含默认的三个链:INPUT、OUTPUT 和 FORWARD。

nat表:
用于进行网络地址转换(Network Address Translation,NAT),改变数据包的源或目标地址。
包含三个主要链:PREROUTING、POSTROUTING 和 OUTPUT。

mangle表:
主要用于修改数据包的头部信息,如修改TTL(Time To Live)等。
包含五个链:PREROUTING、OUTPUT、INPUT、FORWARD 和 POSTROUTING。

raw表:
用于配置连接跟踪表的规则,决定数据包是否需要被跟踪。
包含两个链:PREROUTING 和 OUTPUT。
防火墙

注:centos7中NAT表默认包含的是4个链,还包括INPUT链

防火墙

防火墙的相关顺序:

规则顺序匹配:
	由上而下,匹配即停止
表应用顺序:
	raw>mangle>nat>filter
链应用顺序
	入站:PREROOUTING -->INPUT
	出站:OUTPUT -->POSTROUTING
	转发:PREROUTING-->FROWARD-->POSTEROUTING
防火墙
防火墙

iptables语法规则

防火墙

书写规则
语法构成:iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]注意:
不指定表时,默认filter表
不指定链名时,默认指表内所有链
除非设置链默认策略,否则,必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写

常见动作类型
ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过。必要时会给出提示
SNAT:修改数据包源地址
DNAT:修改数据包目的地址
REDIRECT:重定向
LOG:记录日志信息,然后传给下一条规则继续匹配

匹配选项

查看规则列表
	-L 列出所有规则条目,可以指定链
	-n 以数字形式显示地址、端口等信息
	-v 以更详细的方式像是规则信息
	--line-numbers 查看规则时,显示规则的序号
添加性的规则
	-A  在链的末尾追加一条规则
	-I  在链的开头(或指定序号)插入一条规则
删除、清空规则
	-D 删除链内指定序号(或内容)的一条规则
	-F 清空所有规则
设置默认策略
	-P 指定的链设置默认规则

配型类型分类

通用匹配
	可直接使用,不依赖于其他条件或扩展
	包括网络协议、IP地址、网络接口等条件
隐含匹配
	要求以特定的协议匹配作为前提
	包括端口、TPC标记、ICMP类型等条件
显示匹配
	要求以“-m扩展模块”的形式明确指出类型
	包括多端口、MAC地址、IP范围、数据包状态等条件

匹配选项来说可以分为查看、添加、替代、删除

查看显示规则-L -n 和 -v的不同显示

iptables是有默认规则的,使用-L查看

防火墙

默认允许所有TPC协议进行访问

如果只看单个链,-L后可以指定链
iptables -t 表名 -L 链名

防火墙

-n 以数字(IP)形式展示

防火墙

-v
-v 显示哪条规则过滤的数据报文最多,过滤越多数据报文的端口规则顺序应该越靠前,因为匹配规则方式是由上而下逐个规则过滤

防火墙

添加规则选项
-A(append)追加
如果我们再增加一条允许UDP协议通过的规则

防火墙
防火墙

-I(insert)插入
如果想要吧ICMP接受规则插入到第二个位置

防火墙

--line-numbers(也可以直接--line) 显示行号,方便插入

防火墙

删除规则选项

防火墙

默认filter表,此时也可以不指定表
删除第二条规则

防火墙

-F:清空所有规则

防火墙

修改规则 -R

防火墙

和插入很相似,只是将-A修改成-R

-P  指定默认规则

实例:假设只放行apache服务

准备:
yum -y install httpd
systemctl start httpd
echo "123" >/var/www/html/index.html
curl localhost

防火墙

操作:

清空所有规则
iptables -F

允许80端口连接
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

允许22端口连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

其他端口拒绝
iptables -P INPUT DROP

查看

防火墙

浏览器查看

防火墙

使用ICMP协议进行ping操作

防火墙

就匹配类型而说,可以分为通用匹配(协议、IP)、隐含匹配(端口,icmp类型)、显示匹配(-m扩展模块)

通用匹配(协议、IP)

协议匹配:-p 协议名
地址匹配:-s 源地址、-d 目的地址
接口匹配:-i 入站网卡 -o 出站网卡

示例:

1:filter表中追加规则:当源地址是192.168.1.11时,请求转发时拒绝
iptables -A FORWARD -s 192.168.1.11 -j REHECT

2:filter表中开头添加规则:当源地址是10.20.30.0/24网段的IP,丢弃
iptables -I INPUT -s 10.20.30.0/24 -j DROP

3:iptables -I INPUT -p icmp -j DROP
在filter表开头增加一条规则:当入站请求为ICMP请求时丢弃数据包
4:iptables -A FORWARD ! -p icmp -j ACCEPT
转发请求非ICMP协议都接受,ICMP协议拒绝
5:iptables -A INPUT -i ens33 -s 172.16.0.0/12 -j DROP
filter表添加规则:INPUT链上通过ens33的数据包且来自于172.16.0.0/12 的IP的数据包丢弃
6:iptables -A INPUT -p icmp -i lo -j REJECT
拒绝本地回环地址进行icmp协议

拒绝和丢弃的区别:
拒绝会返回无法连接的消息回复,会消耗资源
如果是drop,不返回拒绝信息,直接丢弃,客户端等到连接超时后自动显示连接超时

隐含匹配(端口,icmp类型)

常用的隐含匹配条件
端口匹配:--sport 源端口 --dport 目的端口
ICMP类型 --icmp-type ICMP类型

实现可以ping别人,别人不能ping自己

实现方法一:
ICMP类别代号
0(echo-reply) 代表一个响应信息(回复报文)
3(destination unreachable)表示目的地不可达
8(echo request)来自客户端的请求消息

iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -j DROP

防火墙

实现方法二:
iptables -A INPUT -p icmp --icmp-type 8 -s 192.168.1.11 -j DROP
设置当来源IP为192.168.1.11,直接丢包

其他示例:
1、转发链追加当1.0网段IP进行连接且端口为53号UDP协议端口接收
iptables -A FORWARD -s 192.168.1.0/24 -p udp --dport 53 -j ACCEPT
2、放行FTP服务端口
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT

显示匹配

多端口匹配
-m mutiport --sport 源端口列表
-m mutiport --dport 目的端口列表
例:
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 80-82,85 -j REJECT
注:和分开写的区别:这样多个端口可以成为一条规则,可以优化匹配次数

IP范围匹配
-m iprange --src-range IP范围
例:
对IP范围进行过滤:禁止1.10-1.20之间的IP进行访问
iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.10-192.168.1.20 -j REJECT

MAC地址匹配
-m mac --mac-source MAC地址
例:
对mac地址进行处理
iptables -A INPUT -m mac --mac-source 00:0c:29:fe:d1:df -j DROP

状态匹配
-m state --state 连接状态
例:
当新增访问连接21号端口的时候,拒绝连接,(已经连接的不拒绝)
iptables -I INPUT -p tcp -m state --state NEW,ESTABLISH,RELATED -j ACCEPT
iptables -I INPUT -p tcp --dport 21 -m state --state NEW -j DROP

时间匹配
例:
-m time --timestart 开始时间 --timestop 结束时间
iptables -A OUTPUT -p tcp -m tcp --dport 80 -m time --timestart 00:00 --timestop 23:59 -j DROP

SNAT实验:

实验配置双网卡路由器:

环境准备:
192.168.2.10:作为网关(2块网卡,ens33;net模式,ens34:仅主机模式)
192.168.2.11:模拟内网服务器(一块网卡,仅主机模式)

10修改为iptables
yum -y remove firewalld
yum -y install iptables-services.x86_64
systemctl start iptables.service
systemctl enable iptables.service

10配置:
把vmnet8网卡设置成vmnet8自动分配IP地址
cd /etc/sysconfig/network-scripts
cp -a ifcfg-ens33 ifcfg-ens34
vim ifcfg-ens34
把ens33网卡修改成dhcp模式
vim ifcfg-ens33

防火墙

增加一块网卡ens34,模式为仅主机模式.IP为192.168.2.10

防火墙

service network restart

ping一下百度查看是否可以连接公网

防火墙

10开启路由转发
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf
sysctl -p
目录:
cat /proc/sys/net/ipv4/ip_forward

出口网卡为ens33的IP全部修改为上公网的IP(dhcp模式给ens33分配的IP)
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens33 -j SNAT --to-source 192.168.1.128
意为从2.0网段传来的IP,源地址全部修改为192.168.1.128
iptables -t nat -L

防火墙

11配置:
修改网关,指向网关服务器
vim /etc/sysconfig/network-scripts/ifcfg-ens33

防火墙

service network restart

测试:11端ping一下百度,成功即可

动态识别公网地址并分配,无需手动指定

iptables -t nat -F
ADSL原理(动态分配IP地址)
在经过路由表之后,再去修改为外网地址(匹配规则之后再去修改IP,这样不用去找dhcp给匹配的上网IP了)
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens33 -j MASQUERADE

防火墙

DNAT

DNAT策略的典型应用环境
在Internet中发布位于企业局域网内的服务器

DNAT策略的原理
目标地址转换,Destination Network Address Translation
修改数据包的目标地址

图示

防火墙

DNAT进入路由表之前先把IP改了,然后进入路由表匹配

实验:

三台服务器
都使用NAT模式即可
公网路由器:192.168.2.10(nat) 192.168.1.10(仅主机)
内网web服务器:192.168.1.11(nat)
公网用户:192.168.2.12(仅主机)
实现:公网用户通过网关服务器访问web服务器

11配置httpd
yum -y install httpd
systemctl start httpd
echo "123" >/var/www/html/index.html
配置网卡网关,指向10网关服务器
vim /etc/sysconfig/network-scripts/ifcfg-ens33

防火墙

10配置网关服务器
开启网关服务器(10)的路由转发
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf
sysctl -p
当外网用户(2.0网段IP)从ens34进入且目标IP为192.168.2.10(网关服务器(即自己)的外网网卡IP),目标端口为80之前将访问的目标IP地址修改为192.168.1.11(指向内网服务器)
iptables -t nat -A PREROUTING -i ens34 -d 192.168.2.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.11
iptables -t nat -L

防火墙

12根据ifconfig配置网卡

防火墙

测试
2.12 curl 2.10网关服务器

防火墙

防火墙的备份

清空后建立一条规则
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT

永久保存
service iptables save(centos 7:iptables-save >/etc/sysconfig/iptables)
保存在了/etc/sysconfig/iptables中

防火墙

导出和导入
导出:
iptables-save > save.iptables

防火墙

导入:
iptables-restore <save.iptables

防火墙

发布者:LJH,转发请注明出处:https://www.ljh.cool/6694.html

(0)
上一篇 2022年5月28日 下午8:16
下一篇 2022年7月3日 下午11:40

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注