目录
[一. 安全技术类型](#一. 安全技术类型)
[二. linux防火墙](#二. linux防火墙)
[1. 按保护范围划分:](#1. 按保护范围划分:)
[2. 按实现方式划分:](#2. 按实现方式划分:)
[3. 按网络协议划分:](#3. 按网络协议划分:)
[4. 防火墙原理](#4. 防火墙原理)
[三. 防火墙工具------iptables](#三. 防火墙工具——iptables)
[1. netfilter 中五个勾子函数和报文流向](#1. netfilter 中五个勾子函数和报文流向)
[① .五表四链](#① .五表四链)
[2 .iptable工具](#2 .iptable工具)
[① iptables原理](#① iptables原理)
[② iptables语法](#② iptables语法)
[Ⅱ 查看iptables的规则](#Ⅱ 查看iptables的规则)
[Ⅲ 添加规则](#Ⅲ 添加规则)
[Ⅳ 删除规则](#Ⅳ 删除规则)
[Ⅴ 修改默认规则 -P(大写)](#Ⅴ 修改默认规则 -P(大写))
[Ⅵ 替换规则 -R](#Ⅵ 替换规则 -R)
[Ⅶ 隐含扩展](#Ⅶ 隐含扩展)
[--tcp-flags mask comp](#--tcp-flags mask comp)
[--source-port, --sport port[:port]](#--source-port, --sport port[:port])
icmp:允许本机ping其它主机,禁止其它主机ping本机
[Ⅷ 显示扩展模块](#Ⅷ 显示扩展模块)
[string 字符串](#string 字符串)
一. 安全技术类型
入侵检测系统:只留下攻击记录,不阻止,主要以提供报警和事后监督为主。
入侵防御系统:以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式。
防火墙:隔离功能,将不被允许访问的外网隔离在外。
防水墙:是一种防止内部信息 泄漏的安全产品。预防网络、外设接口、存储介质和打印机构成信息泄漏的全部途径。
二. linux防火墙
linux防火墙是内核中的工具模块, Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中
1. 按保护范围划分:
主机防火墙:服务范围为当前一台主机
网络防火墙:服务范围为防火墙一侧的局域网
2. 按实现方式划分:
硬件防火墙:是服务器,功能只有防火墙,专用硬件级别实现部分功能的防火墙。如华为,山石,深信服等。
软件防火墙:应用软件。
3. 按网络协议划分:
网络层防火墙:OSI模型下四层,又称为包过滤防火墙
应用层防火墙/代理服务器:proxy 代理网关,OSI模型七层
4. 防火墙原理
|-----------|----------|-----------|-----------------|----------|---------|
| 数据包 ||||||
| mac头部 | ip头部 | 协议/端口 | 7层协议 (http) | 真实数据 | 校验位 |
防火墙会收包拆包看真实数据,检查没问题再重新装包,检查有问题隔离或者丢弃。
4层原理:传输层:协议端口号
7层原理:控制真实数据 http协议,dns协议,dhcp协议等
正向代理:代理的是客户端,绕开防火墙限制,加快访问速度
举例:翻墙
反向代理:代理的是服务端,负载均衡
三. 防火墙工具------iptables
iptables是由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
1. netfilter 中五个勾子函数和报文流向
Netfilter在内核中选取五个位置放了五个hook(勾子) function(函数),用户通过命令工具(iptables)向其写入规则。
数据流量从网卡------>内核(netfilter)
流量有两种:一种是发给你的,一种是需要你转发的。
数据包传输过程:
-
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
-
如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达
-
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
① .五表四链
五链:五个勾子函数就是五个链
链的分类依据:处理数据包的不同时机
作用:控制流量的时机,决定了在什么地方控制流量
|-----------------------|-------------|
| 链(chain) | 含义 |
| input(LOCAL_IN) | 进入本机的流量 |
| output(LOCAL_OUT) | 出去本机的流量 |
| forward | 转发流量 |
| prerouting | 路由选择前 |
| postrouting | 路由选择后 |
四表:作用:存放链,决定如何控制流量
表中有链,链中有规则,选择合理的链做规则。
有些地方说五表,是多了一个security表(安全表)
|-------------|-------------------|
| 表 | 含义 |
| raw表 | 跟踪数据包 |
| mangle表 | 标记,优先级 |
| nat表 | 地址转换 |
| filter表 | 流量过滤。是否允许流量通过 |
2 .iptable工具
① iptables原理
Linux 的防火墙体系主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux 系统的防火墙体系基于内核编码实现, 具有非常稳定的性能和高效率,也因此获得广泛的应用。
iptables由四个表table和五个链chain以及一些规则组成。
② iptables语法
Ⅰ语法
iptables -t 表 子命令 链 规则
filter是默认的表,不写-t 选择表的话,默认是它。
子命令(command):
|----------------|-------------------------------------------------------------------------------------------------------------------------|
| 命令 | 效果 |
| -A | 在指定链末尾追加一条规则 iptables -A INPUT (操作) |
| -I(大写的i) | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作) |
| -P(大写) | 指定默认规则 iptables -P OUTPUT ACCEPT (操作) |
| -D | 删除规则, iptables -D 链 规则序号 ; 如iptables -t nat -D INPUT 2 (操作)**** |
| -R | 修改、替换某一条规则 iptables -t nat -R INPUT (操作) |
| -L | 查看 iptables -t nat -L (查看) |
| -n | 所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名) iptables -L -n,iptables -nL,iptables -vnL (查看常和vL一起使用) |
| -v | 查看时显示更详细信息,常跟-L一起使用 |
| --line-num | 规则带编号 iptables -t nat -vnL --line-num |
| -F | 清除链中所有规则 iptables -F (操作) |
| -N | 新加自定义链 |
| -X(大写) | 清空自定义链的规则,不影响其他链 iptables -X |
| -Z(大写) | 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z |
| -S(大写) | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
通用匹配参数(parameter)
通用匹配直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件
|----------|-----------------------|
| 协议匹配 | -p 协议名(tcp,icmp等) |
| 地址匹配 | -s 源地址 |
| 地址匹配 | -d 目的地址 |
| 接口匹配 | -i 入站网卡 |
| 接口匹配 | -o 出站网卡 |
| 端口匹配 | --sport 源端口 |
| 端口匹配 | --dport 目的端口 |
target:-j的选项(jump)
-j是数据包流向,防火墙规则匹配即停止,即排在前面的规则序号被匹配了,就不会执行下面的规则。
但是对于LOG操作时例外,LOG只是辅助,没有处理数据包
|-------------------|------------------------------------------------------|
| 对数据包的操作 | 效果 |
| -j ACCEPT | 允许数据包通过 |
| -j DROP | 直接丢弃数据包,不给出任何回应信息 |
| -j REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应信息 |
| -j LOG | 在/var/log/messages 文件中记录日志信息, 然后将数据包传递给下一条规则 |
| -j SNAT | 修改数据包的源地址 |
| -j DNAT | 修改数据包的目的地址 |
| -j MASQUERADE | 伪装成一个非固定公网IP地址 |
Ⅱ 查看iptables的规则
iptables -vnL [-t 表名](查询非fliter需要指明表)
给规则加上序号:iptables [-t 表名] -vnL --line-num
Ⅲ 添加规则
-A 默认在末尾添加
-I(大写的i)需要指明序号
例: -I INPUT 1 :就是在 INPUT链的规则第一条前添加规则,我就变成第一条了。
Ⅳ 删除规则
iptables [-t 表名] -F :清空所有规则,加上表,就是清空对应表的所有规则
iptables -D 链 规则序号:删除某一条规则 例:iptables -t filter -D INPUT 2
不要轻易使用iptables -F,容易导致与远程连接断开,需要重启。
Ⅴ 修改默认规则 -P(大写)
修改成丢弃进入的数据包:iptables -P INPUT DROP
修改成接收进入的数据包:iptables -P INPUT ACCEPT
iptables [-t表名] -P <链名> <控制类型>
iptables 的各条链中,默认策略是规则匹配的最后一个环节------当找不到任何一条能够匹配数据包的规则时,则执行默认策略。
默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。
例如,执行以下操作可以将 filter 表中 FORWARD 链的默认策略设为丢弃, OUTPUT 链的默认策略设为允许。
Ⅵ 替换规则 -R
bash
iptables -A INPUT -s 192.168.91.101 -j DROP
#添加规则
iptables -R INPUT 1 -s 192.168.91.101 -j ACCEPT
#替换规则,1是规则序号,把DROP替换成ACCEPT
Ⅶ 隐含扩展
iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
--tcp-flags mask comp
mask:是需检查的标志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST
comp:在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项
例如:
--tcp-flags SYN,ACK,FIN,RST SYN
表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0,第一次握手
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
表示第二次握手
--tcp-flags ALL ALL
--tcp_flags ALL NONE
bash
iptables -I INPUT -i ens33 -p tcp --tcp-flags FIN,RST,ACK SYN -j ACCEPT
#丢弃SYN请求包,放行其他包
---------------------------------------------------------------------------------------------------------------------------------
--source-port, --sport port[:port]
匹配报文源端口,可为端口连续范围
--sport 1000 匹配源端口是1000的数据包
--sport 1000:3000 匹配源端口是1000-3000的数据包
--sport**:3000** 匹配源端口是3000及以下的数据包
--sport 1000: 匹配源端口是1000及以上的数据包
注意: --sport和--dport 必须配合-p <协议类型>使用
bash
iptables -A INPUT -p tcp --sport 10000:30000 -j REJECT
#源端口10000到30000 全部拒掉
---------------------------------------------------------------------------------------------------------------------------------
icmp:允许本机ping其它主机,禁止其它主机ping本机
类型匹配: --icmp-type ICMP类型
ICMP类型(详细可见网络的icmp部分)可以写字符串、也可以写数字代码:
|------------------------------------|-------------|
| Echo-Request (代码为8) | 表示请求 |
| Echo-Reply (代码为0) | 表示回复 |
| Destination-Unreachable (代码为3) | 表示目标不可达 |
bash
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
#禁止其它主机ping本机
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
#允许本机ping其它主机
Ⅷ 显示扩展模块
显示扩展要用-m选项指明要调用的扩展模块名
multiport扩展(多端口扩展)
- --source-ports,--sports port[,port|,port:port]...
指定多个源端口,用逗号隔开
- --destination-ports,--dports port[,port|,port:port]...
指定多个目标端口,用逗号隔开
- --ports port[,port|,port:port]...
多个源或目标端口
例:
bash
iptables -A INPUT -s 172.16.234.10 -p tcp -m multiport --dports 22,80 -j REJECT
#阻止ip地址来自172.16.234.1,访问当前机器的tcp22,80端口。用-m指明模块
iprange扩展
--src-range from[-to]:源IP地址范围
--dst-range from[-to]:目标IP地址范围
例:
bash
iptables -A INPUT -m iprange --src-range 172.16.234.10-172.16.234.13 -j REJECT
#指明源地址为172.16.234.10-172.16.234.13的3个地址无法访问当前主机
mac地址
mac 模块可以指明源MAC地址,,适用于:PREROUTING, FORWARD,INPUT chains
-m mac [!] --mac-source XX:XX:XX:XX:XX:XX
!是取反
string 字符串
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore 算法
kmp:Knuth-Pratt-Morris 算法
--from offset 开始查询的地方
--to offset 结束查询的地方
bash
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "bilibili" -j REJECT
#注意 请求的包不带字符,回复的包带字符,所以要 output
time模块
根据将报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 开始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束日期
--timestart hh:mm[:ss] 开始时间
--timestop hh:mm[:ss] 结束时间
[!] --monthdays day[,day...] 每个月的几号
[!] --weekdays day[,day...] 星期几,1 -- 7 分别表示星期一到星期日
例:iptables -A INPUT -m time --timestart 14:00 --time 16:00 -j REJECT
connlimit扩展
根据每客户端IP做并发连接数数量匹配,可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
state状态
状态类型:
|-------------|----------------------------------------|
| NEW | 新发出请求 |
| ESTABLISHED | NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态 |
| RELATED | 新发起的但与已有连接相关联的连接 |
| INVALID | 无效的连接,如flag标记不正确 |
| UNTRACKED | 未进行追踪的连接,如:raw表中关闭追踪 |
例: 新用户不可以访问,旧用户可以访问
bash
ipatables -A INPUT -m state --state NEW -j REJECT
#新用户不可以访问
ipatables -A INPUT -m state --state ESTABLISHED -j ACCEPT
#旧用户可以访问
开机自动重载规则
用脚本保存各个iptables命令;让此脚本开机后自动运行
在etc/.bashrc文件中添加
在/etc/rc.d/rc.local文件添加