目录
什么是防火墙
原理
代理
防火墙的工具
4表5列
五链:控制流量的时机
四个表:如何控制流量
编辑
iptables 软件
格式
选项
跳转
查iptables 的规则
添加规则 A I
删除规则
清空规则
替换规则 R
修改默认规则(默认是允许通过 黑名单) P
设置黑名单
设置白名单
通用匹配 没有 指明模块
端口匹配: --sport 源端口、--dport 目的端口
ICMP
192.168.17.55 可以ping通192.168.17.25
192.168.17.25不能ping通192.168.17.55
编辑
iprange
mac地址
格式
实例
string 字符串
time模块
connlimit
stat
故障案例:启用了iptables state模块 用户访问有问题 查看日志 table full drop pket
什么是防火墙
防火墙是一种技术,它通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性。防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验
waf web网页 防火墙
原理
数据包
mac头部 ip头部 协议/端口 七层协议(http)真实数据 校验位
收包 拆包 检查没问题 装包
收包 拆包 检查有问题 隔离或者丢弃
4层原理 传输协议 端口号 开发者
7层原理 控制真实数据 http dns
四层防火墙 通过 协议 端口号 ip mac 控制流量
七层防火墙 可以控制真实数据
代理
正向代理: fq 代理的是(客户端)
作用: 绕开防火墙限制 加快访问速度
反向代理:代理的是(服务器 )
作用:负载均衡 (负担分担)
防火墙的工具
iptable firewalld nft 防火墙工具
[root@localhost~] # iptables --version
iptables v1.4.21
Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中
Netfilter 是Linux 2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统
netfilter 中的五个勾子函数
4表5列
表中有链,链中有规则
网卡------内核(netfilter)
五链:控制流量的时机
input: 进入本机的流量
output:出本机的流量
forward:转发数据包(流量)
pre-routing: 路由选择前
post-routing: 路由选择后
流量:发给你的 需要你转发的
选择合理的 链 做规则
表的作用是 存放链
链决定了在什么地方控制流量
表中链 链中有规则
四个表:如何控制流量
raw表:确定是否对该数据包进行状态跟踪 (跟踪)
mangle表:为数据包设置标记优先级 (标记)
nat表:修改数据包中的源,目标ip地址或端口 (地址转换)
filter表:确定是否放行该数据包(过滤) (是否允许流量通过)
iptables 软件
格式
iptables -t 指定表 子命令 指定链 规则 -j 跳转
iptables | table | conmmand | chain | parameter | target |
-t filter | -A -D -I -R -L -F -Z -N -X -P | INPUT FORWARD OUTPUT PREROUTING POSTROUTING | -p -s -d -i -o --sport --dport ...... ....... | -j ACCECT -j DROP -j REJECT |
选项
管理选项 | 用法示例 |
-A | 在指定链末尾追加一条 iptables -A INPUT (操作) |
-I | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作) |
-P | 指定默认规则 iptables -P OUTPUT ACCEPT (操作) |
-D | 删除 iptables -t nat -D INPUT 2(操作) |
-p | 服务名称 icmp tcp |
-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(查看) |
-v | 查看时显示更详细信息,常跟 -L 一起使用 (查看) |
--line -number | 规则带编号 iptables -t nat -L -n --line-number/iptables -t nat -L --line-number |
-F | 清除链中的所有规则 iptables -F (操作) |
-N | 新加自定义链 |
-X | 清空自定义链的规则,不影响其他链 iptables -X |
-Z | 清空链的计数器 (匹配到的数据包的大小和总和)iptables -Z |
-S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
[root@localhost/] # iptables -A INPUT -s 192.168.17.25 -j REJECT
跳转
DROP 跳转 (属于已读不回)
REJECT 拒绝 (有回应告诉你,拒绝)
ACCEPT 允许
LOG 日志
SNAT 源地址转换
DNAT 目的地址转换
查iptables 的规则
iptables -vnL [ -t 表名]
[root@localhost/] # iptables -vnL #[-t 表名] 不加默认filter
如果查看不是 filter 表需要指明表
iptables -vnL -t nat
[root@localhost/] # iptables -vnL -t nat
给规则加上序号:iptables -vnL --line-num
[root@localhost/] # iptables -vnL --line-num
添加规则 A I
iptables -A INPUT -s 192.168.17.0/24 -j ACCEPT 或DROP 或REJECT
A 在末尾追加
[root@localhost/] # iptables -A INPUT -s 192.168.17.25 -j REJECT #禁止192.168.17.25访问我
-I 需要指明序号 -I INPUT 1 在 INPUT 链的规则第一条前添加,我就变成第一条了
iptables -I INPUT 2 -s 192.168.17.0/24 -j ACCEPT
iptables -I INPUT 1 -s 192.168.17.0 -j ACCEPT #将该条命令变为第一条优先执行
删除规则
iptables -D 链 规则序号 iptables -t filter -D INPUT 1 //删除 filter 表中 INPUT 链 中的第2条规则
清空规则
iptables [-t 表名] -F
[root@localhost/] # iptables -F #清空所有规则
[root@localhost/] # iptables -vnL --line-num #查看规则
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 4 packets, 424 bytes)
num pkts bytes target prot opt in out source destination
替换规则 R
iptables -R INPUT 1 -s 192.168.17.1 -j ACCEPT
[root@localhost/] # iptables -R INPUT 1 -s 192.168.17.25 -j REJECT
修改默认规则(默认是允许通过 黑名单) P
iptables -P INPUT DROP #拒绝所有连接
iptables -P INPUT ACCEPT #允许所有连接
设置黑名单
[root@localhost~] # iptables -t filter -A INPUT ! -s 192.168.17.25 -j ACCEPT
设置白名单
iptables -P INPUT DROP #拒绝所有连接
iptables -A INPUT -s 192.168.91.1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j REJECT
保存防火墙规则
[root@localhost/etc/rc.d] # iptables-save > iptables_rules #保存规则
[root@localhost/etc/rc.d] # iptables-restore < iptables_rules #重新导入规则
iptables-save > 保存规则的文件 //保存规则
iptables-restore < 保存的规则文件 //重新导入规则
全局配置
[root@localhost/etc/rc.d] # chmod +x rc.local #写完需要加x赋权
[root@localhost/etc/rc.d] # cd /etc/rc.d
[root@localhost/etc/rc.d] # ls
init.d rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local
自定义链
类似函数 将类型
iptables -N web (自定义链)
iptables -E web WEB (重命名)
创建完之后将规则加入到一个ip上
删除自定义链
先清空自定义链 然后 iptables -x 自定义链名
通用匹配 没有 指明模块
模式匹配 -m 模块名 指定模块
不需要 -m时 -p的模块与-m重复 (iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块)
端口匹配: --sport 源端口、--dport 目的端口
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
[!] --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 第二次握手
iptables -A INPUT -p tcp --sport 10000:30000 -j REJEC #10000到30000 全部被拒
ICMP
192.168.17.55 可以ping通192.168.17.25
192.168.17.25不能ping通192.168.17.55
类型匹配: --icmp-type ICMP类型
#可以是字符串、数字代码
"Echo- Request" (代码为8)表示请求
"Echo- Reply" (代码为0)表示回复 "Dest ination-Unreachable" (代码为3)表示目标不可达
[root@localhost~] # iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost~] # iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iprange
指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
iptables -A INPUT -m iprange --src-range 192.168.17.25-192.168.91.28 -j REJECT
# 指定 源地址为192.168.91.25-192.168.17.28 3个地址无法访问 当前主机
mac地址
mac 模块可以指明源MAC地址,,适用于:PREROUTING, FORWARD,INPUT chains
格式
-m mac [!] --mac-source XX:XX:XX:XX:XX:XX
实例
ip -a #查看mac地址
iptables -A INPUT -m mac --mac-source 00:0c:29:00:e6:dd -j REJECT
#指定mac不可访问
string 字符串
[root@localhost ~]#echo "www.bilibili.com" > /var/www/html/index.html
#自建网页
[root@localhost ~]#echo "www.baidu.com" > /var/www/html/index1.html
#自建网页
[root@localhost ~]#iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "bilibili" -j REJECT
#注意 请求的包不带字符,回复的包带字符 所以要 output
time模块
根据将报文到达的时间与指定的时间范围进行匹配
[root@localhost ~]#date
#中国标准时间
2022年 08月 14日 星期日 22:26:07 CST
[root@localhost ~]#date -u
#美国标准时间
2022年 08月 14日 星期日 14:26:09 UTC
[root@localhost ~]#iptables -A INPUT -m time --timestart 14:00 --time 16:00 -j REJECT
#从14点到16点禁止访问本机
iptables v1.4.21: unknown option "--time"
Try `iptables -h' or 'iptables --help' for more information.
[root@localhost ~]#rpm -ql iptables|grep time
/usr/lib64/xtables/libxt_time.so
connlimit
根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
模拟攻击
[root@localhost3 ~]# gcc flood_connect.c -o flood
#编译安装 黑客文件
[root@localhost3 ~]# ./flood 192.168.17.55
#运行黑客脚本
[root@localhost 7-1]#ss
[root@localhost1 ~]#iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
stat
故障案例:启用了iptables state模块 用户访问有问题 查看日志 table full drop pket
后来研究发现 ,有一个内核选项的默认值 过低 netfilter/nf_conntrack_max 默认65536、
把这个值调大一点
ipatables -A INPUT -m state --state NEW #新发起 -j REJECT
ipatables -A INPUT -m state --state ESTABLISHED #已经连接 -j ACCEPT
新用户不可以访问 就用老的可以访问