Linux系统学习(七)
iptables
防火墙基本概念:
- 根据逻辑分类:
- 主机防火墙: 对单个主机进行防护
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模块
- 表存在优先级: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掉
Firewalld
- 动态防火墙后台服务程序:提供一个动态管理的防火墙,用以支持网络“Zone”,来分配对一个
网络链接和界面一定程序的信息,它具备对IPv4和Ipv6防火墙设置的支持
- 它支持以太网桥,并有分离运行时间和永久配置选项,可以通过服务程序直接增加规则
- 图形化配置工具:firewall-config
- 命令行配置工具:firewall-cmd
- 用于配置firewalld服务永久性或者非永久性运行时间的改变,它依次用IPtables工具与执行
数据包筛选的内核中Netfilter通信
- Firewalld和IPtables的关系:
1. firewalld和IPtables本身都不具备防火墙功能
2. 他们都是在用户空间将执行规则放到内核空间的“安全框架”- Netfilter中去实现
- Firewalld和IPtables的区别:
1. iptables 在 /etc/sysconfig/iptables-config中存放IPtables规则设置;Firewalld 在
/usr/lib/firewalld/* 中进行系统配置和/etc/firewalld/* 中关于服务xml文件格式的配置
2. 在使用IPtables的时候,每去操作一条规则立即生效
3. Firewalld不会创建任何新的规则,仅仅运行规则中的不同之处,因此Firewalld可以在运行时间内
改变配置而不丢失现有的连接
- Zone区域: 不同区域对于网络连接的设置规范不同
- trusted 信任区域
- home 家庭区域
- internal 内部区域
- worker 工作区域
- public 公共区域
- extenal 外部区域
- dmz 非军事区域
- block 限制区域
- drop 丢弃区域
- 管理防火墙
- 每个zone中都有一套规则集,对于接收到的请求具体使用哪个zone,Firewalld通过三种方式来判断
1. source 源地址优先级最高
2. Interface 接收请求的网卡
3. firewall.config 中配置的默认zone
[root@test ~]# cat /etc/firewalld/firewalld.conf | grep Zone
DefaultZone=public
- 查看默认zone: [root@test ~]# firewall-cmd --get-default-zone
- 设置默认zone: --set-default-zone=<zone>
- 查看当前firewalld状态: [root@test ~]# firewall-cmd --state
- 查看当前活动的zone:[root@test ~]# firewall-cmd --get-active-zones
- 列出所有可用zone: [root@test ~]# firewall-cmd --list-all-zones
- 列出所有区域设置:--list-all
- 列出所有预定服务:--get-services # 所有已经设定好的可直接使用的服务规则
- 将某个网络地址放置/移除某个zone
--add-source=<source>[/<mask>]|<MAC>|ipset:<ipset>
--remove-source=<source>[/<mask>]|<MAC>|ipset:<ipset>
- 管理操作:
- 添加、删除、改变网络接口到制定域中(域中会有一条规则)
--list-interfaces
--add-interface=<interface>
--change-interface=<interface>
--remove-interface=<interface>
--query-interface=<interface>
- 添加、删除、列出服务
--get-services
--delete-service=<service>
--add-service=<service>
--list-services
--remove-service=<service>
--query-service=<service>
- 列出、添加、删除端口
--list-ports List ports added for a zone [P] [Z]
--add-port=<portid>[-<portid>]/<protocol>
--remove-port=<portid>[-<portid>]/<protocol>
--query-port=<portid>[-<portid>]/<protocol>
- 永久生效: --permanent
- 重载防火墙: --reload
实验操作:
部署http服务,并在防火墙开启的情况能够正常访问:
1. [root@test ~]# firewall-cmd --add-service=http
/usr/lib/firewalld/services
[root@test services]# cat http.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/> # 每个可添加的服务都有对应的xml文件
</service>
- 每个服务的xml文件当中都定义了规则(协议+端口)
- 所以当我们去添加服务到当前zone中,也就意味只 对xml当中的设定的规则生效(允许放行)
2. [root@test services]# firewall-cmd --add-port=80/tcp
总结来说:去添加服务的方式最终还是涉及到添加端口的方式(要看对应服务的xml文件如何定义)