文章目录
防火墙基本概念
根据逻辑分类:
主机防火墙
对单个主机进行防护
a) window上的防火墙
b) 云上的安全组
网络防火墙
对网络入口进行防护,防火墙的背后是本地局域网
a) 安全厂商设备
b)云上的FaaS服务(对VPC网络进行防护)
主机防火墙(个人)和网络防火墙(集体)相辅相成的
根据物理分类
物理防火墙
硬件级别实现部分防火墙功能;性能高,但是成本也高
软件防火墙
应用软件出力逻辑运行于通用硬件平台上的防火墙;成本低,但是性能低
IPtables
是一个客户端代理软件,用于将用户安全设定执行到对应的“安全框架”中;所以它能够实现的是软件防火墙
-
“安全框架” - Netfilter 位于在内核中
Netfilter - 内核空间;是真正去实现软件防火墙功能
IPtables - 用户空间;是一个用户空间的客户端代理软件在用户空间中使用IPtables工具,将安全策略执行到内核空间中netfilter上从而来实现Linux主机上的防火墙功能。
-
Netfilter是Linux操作系统下的包过滤防火墙的“安全框架”(免费);所以说IPtables没有守护进程,不是真正的服务,而是内核提供的功能。
- 功能:
- 网络地址转换
- 数据包内容修改
- 数据包过滤的防火墙功能(***)
- 功能:
IPtables基础
IPtables能够根据它的rule匹配而进对数据包进行处理:accept(放行) drop(丢弃) reject(拒绝)
不同的处理方式 -> 动作
rule存储在内核空间的信息过滤表中,这些规则指定:SIP DIP 传输协议类型(Tcp/Udp)等等。
Netfilter 位于在内核空间中,设置了"关卡": Input Output等等。
网卡的驱动也是位于内核空间中,所以IPtables+Netfilter可以在内核空间中设置“关卡”,当用户去访问应用服务的时候,数据包是通过网卡流经内核空间之后到达用户空间
如果我们的报文需要转发,则不会经过Input和output链(即不会从用户空间绕一圈);只需要通过prerouting FORWARD postrouting链。
Input链 和 Output链 : 作用于数据包于用户空间和内核空间的流入流出
prerouting FORWARD postrouting链: 在内核空间中关于数据包的流入流出及转发
- 常见应用场景
到本地某个进程(服务)的报文: prerouting -> input -> ouput -> postrouting
由本地进行转发的报文: prerouting -> forward -> postrouting
这里的“关卡”就是下面要提到的“链”的概念。
链的概念
- 防火墙的作用在于对经过的报文匹配“规则”,然后执行相对应的动作,如果有多个“规则”组合到一起,那么我们就称之“链”。
- 每经过一条链则需要把所有规则都匹配一遍;如果有符合条件的规则,则执行响应动作即可。
- 简单来说:多个规则组成链,经过链时,链上的所有规则需要匹配一遍,符合规则的条件,执行相应动作。
表的概念
- 每个链上都有一些规则,但是有许多相似的规则,这些规则可能是:
- 对IP或者端口进行过滤
- 对报文进行修改
- 对网络地址进行转化
把这些功能相似的规则的集合称之为“表”; 多张表的规则的集合叫做“链”。
IPtables所有规则的定义:都是去定义到不同的表中。
- IPtables表:
- raw表:关闭nat上启动的连接追踪机制; iptable_raw模块
- mangle表:解析报文,做出修改,并重新封装的功能; iptable_mangle模块
- nat表: 网络地址转换; iptable_nat模块
- filter表:负责过滤功能(包过滤防火墙使用到的表);iptables_filter模块
这里nat表、raw表、mangle表构成一条链。
表存在优先级:raw -> mangle -> nat -> filter ; 优先级越高的表中规则优先匹配处理。
概念:4表5链
表链关系
那么是不是每类链上的规则都会存在于4张表中?
肯定不是;每个链只能有某些规则 -> 拥有某些表
总结:每个链中的规则都会存在于哪些表中
prerouting链: raw mangle nat
input链: mangle filter nat
forward链: mangle filter
output链:raw mangle nat filter
postrouting链: mangle nat
实际操作过程中,往往都是通过表为操作入口,查看表中对应的规则,以及该表上规则所作用的“链”。
表 ------ 链
raw表:prerouting output
mangle表: prerouting input output forward postrouting
nat表: prerouting input output postrouting
filter表: input forward output
当一个数据包经过一个“链”的时候,会将当前链上的所有规则进行匹配,而定义的规则都汇聚到表中;匹配时,因此会存在于优先级,所以就拥有了表的优先级。
- 注意:想要主机支持转发功能,需要开启内核中ip_forward参数
[root@test ~]# cat /proc/sys/net/ipv4/ip_forward
[root@test ~]# iptables -t <table_type> -L
-t : 指定表
-L :查看表中规则
规则概念
匹配条件 + 动作
规则:规则指定的匹配条件来尝试匹配流经的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理
-
匹配条件:
基本匹配条件: SIP DIP等等
扩展匹配条件: Sport Dport等等
扩张匹配条件也是Netfilter中的一部门,以模块插件的形式存在,如果想要试用,则需要依赖对应的模块 -
处理动作:在IPtables中称之为“target”
-
常用动作:
ACCEPT: 允许数据包通过
DROP:直接丢弃数据包,没有任何响应信息
REJECT:拒绝数据包通过,必要的时候会向发送端发送一个响应的拒接消息
SNAT:源地址转换,解决内网用户同一个公网地址上网问题
MASQUERADE: 是SNAT的一种特殊处理动作,适用于动态的,临时会变的公网IP地址
DNAT:目的地址转换,解决外部网络访问内部局域网中的服务
REDIRECT:在本地端口做端口映射
LOG:/var/log/message系统日志文件中记录日志信息,然后将数据包传递给下一条匹配条件,不催数据包做任何处理,只是进行记录 -
扩展动作
-
-
规则查询: 以filter表进行操作,filter负责过滤功能
[root@test ~]# iptables -t filter -L
-t: 指定表
-L: 列出表中的规则,默认是所有链的规则
[root@test ~]# iptables -t filter -vnL INPUT
Chain INPUT (policy ACCEPT 172 packets, 12678 bytes)
pkts bytes target prot opt in out source destination
-v : 显示详细信息
-n : 展开数字
--line-numbers: 显示有序序号
policy : 当前链的默认策略
packets: 当前链默认策略匹配到的包的数量
bytes: 当前链默认策略匹配到的包的大小总和
pkts: 对应匹配到的报文个数
bytes: 对应匹配到的报文大小综合
target: 规则对应的处理动作
prot: 规则对应的传输协议
opt: 规格对应的选项
in: 数据包由哪个接口流入
out:数据包由哪个接口流出
即 设置哪块网卡的报文需要匹配当前规则
source: 规则对应的SIP
destination: 规则对应的DIP
规则操作 : 增删改
增: iptables -t filter -A INPUT -s x.x.x.x -j <action>
实例1:
[root@test ~]# iptables -t filter -A INPUT -s 172.16.0.1 -j DROP
# 关于源地址为172.16.0.1/16主机数据包报文的流入给drop掉
- 清除规则:iptables -t <tables..> -F <chains...>
-F:清除规则
- 增加规则:
-A : 追加
-I :插入
-s :匹配条件中的源地址
-j :匹配条件中的所对应动作
- 删除规则:
- 方法1:根据规则的编号去删除规则
- 方法2:根据具体的匹配条件去删除规则
-D:删除指定链中的规则
-F:删除操作,冲刷指定链中的规则
- 修改规则:
[root@test ~]# iptables -t filter -R INPUT 1 -s 172.16.10.0/24 -j ACCEPT
[root@test ~]# iptables -t filter -P FORWARD DROP
-R:修改规则
-P:修改链的默认规则的处理动作
- 保存规则:
iptables-save > /etc/sysconfig/iptables
# 是系统启动后可导入的规则
- 导入规则:
iptables-restore < /etc/sysconfig/iptables
匹配条件
基本条件:
-s:指定源地址
-d:指定目的地址
-p:指定协议类型
-i / -o : 指定网卡流入和流出
-i : prerouting INPUT FORWARD
-o : OUTput postrouting
扩展条件:
需要模块支持
-m:指定扩展模块
- tcp/udp扩展模块
--sport: 指定源端口
--dport:指定目的端口
- iprange扩展模块
--src-range: 指定源地址范围
--dst-range:指定目的地址范围
- string扩展模块:指定匹配报文中的字符串
--algo: 指定匹配算法(bm和kmp)
--string: 指定需要匹配的字符串
- time扩展模块:时间段匹配,如果报文在到达时间范围内,则符合匹配条件
--timestart [起始时间] --tiemstop [结束时间]
--weekdays: 指定星期
--mouthdays: 指定日
--datastart [起始日期] --datastop [结束日期]
- connlimit扩展模块:限制每个IP地址同时连接到Server端的连接数量,不需要指定IP地址,默认就是针对每个客户端IP地址
--connlimit-above : 限制每个客户端IP的并发连接数量;如果高于此数量则执行响应动作
--connlimit-upto : 限制每个客户端IP的并发连接数量;如果低于次数量则执行响应动作
自定义链
当默认链的规则非常多的时候,不方便我们管理,如果INPUT链中放置了几百条规则,我们可以针对不同服务(httpd ftp mysql);有针对性将规则放置到自定义链中,在其他5个链进行引用即可,此时当我们想要去修改关于某个服务的规则时,只需要去对应的自定义链中修改即可。
- 创建自定义链:
[root@test ~]# iptables -t filter -N httpd
[root@test ~]# iptables -t filter -I httpd -s 172.16.0.0/16 -p icmp -j REJECT
[root@test ~]# iptables -t filter -I INPUT -j httpd # 去引用自定义链中的规则
-N: 创建自定链
- 关于自定义链的增删改查同上
- 删除自定义链
[root@test ~]# iptables -t filter -F httpd
# 1.清除自定义链中的规则
[root@test ~]# iptables -t filter -D INPUT 1
# 2.删除引用自定义链中的相关规则
[root@test ~]# iptables -t filter -X httpd
# 3.通过-X参数删除自定义链
- 关于删除自定义链规则:
- 自定义链中没有任何默认链的引用,即引用参数refer为0
- 自定义链中不能有任何规则,即自定义链为空