iptables防火墙
防火墙解析
1.什么是防火墙
防火墙是指一种将内部网和公众访问网分开的方法,它是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
防止别人恶意访问。
2.防火墙的种类
硬件防火墙
F5
软件防火墙
iptables
firewalld
安全组
3.包过滤防火墙
包的概念:在数据传输过程,并不是一次性传输完成的;而是将数据分成若干个数据包,一点一点的传输,减少网络负担
包过滤防火墙:过滤数据包的防火墙。
如何实现:通过iptables中的netfilter这个安全框架,来实现对数据包的过滤,从而达到防火墙的效果。
4.Iptables基本介绍
iptables防火墙就属于软件防火墙,iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
-
网络地址转换
-
数据包内容修改
-
以及数据包过滤的防火墙功能
所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。
5.Iptables的四表五链
1.什么叫链
我们想象一下,这些“关卡”在iptables中为什么被称作“ 链 ” 呢?我们知道,防火墙的作用就是在于对经过的报文匹配规则,然后执行对应的 “动作” ,所以,当报文经过这些关卡的时候,必须匹配这些关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了 “ 链 ” ,所以,我们把每一个 “关卡” 想象成下图的模样,这样来说,把他们称为 “链” 更为合适,每个经过这个 “关卡” 的报文,都要将这条 “ 链 ” 上的所有的规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。
2.链的种类
名称 | 作用位置 |
---|---|
PREROUTING: | 主机外报文进入位置,允许的表mangle, nat(目标地址转换,把本机地址转换为真正的目标机地址,通常指响应报文) |
INPUT | 报文进入本机用户空间位置,允许的表filter, mangle |
OUTPUT | 报文从本机用户空间出去的位置,允许的表filter, mangle, nat |
FOWARD | 报文经过路由并且发觉不是本机决定转发但还不知道从哪个网卡出去,允许的表filter, mangle |
POSTROUTING | 报文经过路由被转发出去,允许的表mangle,nat(源地址转换,把原始地址转换为转发主机出口网卡地址) |
3.表的种类
作用:具备某种功能的集合叫做表。
名称 | 功能 | 被哪些链作用 |
---|---|---|
filter | 负责做过滤功能 | INPUT、OUTPUT、FORWARD |
nat | 网络地址转换 | PREROUTING、INPUT、OUTPUT、POSTROUTING |
mangle | 负责修改数据包内容 | PREROUTING、INPUT、OUTPUT、POSTROUTING、FORWARD |
raw | 负责数据包跟踪 | PREROUTING、OUTPUT |
6.Iptables流程图
一共有3中情况.
从A流出:
流入B:
从A途径VPN到B:
流入本机: A ---> PREROUTING ---> INPUT ---> B
流出本机:OUTPUT ---> POSTROUTING ---> B
A流出途径VPN流入B: A ---> OUTPUT ---> POSTROUTING | ---> PREROUTING ---> FORWARD ---> POSTROUTING ---> C ---> PREROUTING ---> INPUT ---> B
可以用表来解释:
7、Iptables的使用
使用iptables之前的准备工作
1、安装Iptables
[root@m01 ~]# yum install iptables*
2、启动Iptables
[root@m01 ~]# systemctl start iptables
3、关闭firewalld
[root@m01 ~]# systemctl disable --now firewalld
参数
格式: iptables -t 表名 -A/I 链名称 -p 协议 -m 模块名(可省) 条件(可以跟-s/-d/--sport/--dport) -i/-o/-m/-j 动作
参数 | 作用 |
---|---|
-t | 指定操作的表 |
-L | 列出当前的规则 |
-v | 显示数据包和数据包大小 |
-n | 不反解地址 |
-A | 追加一条规则到链中(相当于append) |
-I | 顶部插入一条规则(insert) |
-F | 清空规则 |
-Z | 清空计数器(包数量 、包大小) |
-D | 删除链中的规则 |
-R | 修改 |
-S | 列出所有的规则 |
-N | 创建一个自定义 链 |
-X | 删除一个自定义链 |
-P | 指定链的默认策略 |
动作
ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链。
REJECT 拦阻该数据包,并传送数据包通知对方。
DROP 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其它规则。
基本协议
TCP(http)协议
UDP协议
ICMP(ping)协议
ALL(所有的)
地址
参数 | 描述 |
---|---|
-s(源地址) | 发送请求的地址 -s |
-d(目标地址) | 访问的地址 -d |
端口
参数 | 描述 |
---|---|
--sport(源端口) | 发送请求的端口 |
--dport(目标端口) | 访问的端口 |
规则
参数 | 描述 |
---|---|
-i | 进来的网卡 |
-o | 出去的网卡 |
-m | 指定模块 |
-j | 指定动作 |
-p | 指定协议 |
案例1:只允许22端口可以访问,其他端口全部无法访问。
iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
案例2:只允许22,80,443端口可以访问,其他端口全部无法访问。
iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
案例3:只允许22,80,443端口可以访问,其他端口全部无法访问,但是本机可以访问百度。
案例4:要求使用192.168.15.81能够通过22端口链接,但是其他的不行
iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
案例5:只允许192.168.15.71能够通过22端口链接,其他的不行。
iptables -t filter -A INPUT -p TCP -s 192.168.15.71 -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
案例6:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
iptables -t filter -I INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 22 -j DROP
知识储备:
查看本机端口占用的命令:
netstat -nutlp
案例7:要求192.168.15.71对外部不可见
iptables -t filter -A INPUT -p TCP -d 192.168.15.71 -j DROP
案例8:要求使用eth0网卡的所有请求全部拒绝
iptables -t filter -A INPUT -p TCP -i eth0 -j DROP
案例9: 使用172.16.1.71登录进来的窗口,不允许访问百度。
iptables -t filter -I OUTPUT -p TCP -o eth1 -j DROP
案例10:要求访问服务器的8080端口转发至80端口
iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80
模块
1、连续匹配多个端口(multiport)
--dports : 指定多个端口(不同端口之间以逗号分割,连续的端口使用冒号分割)。
案例:
要求将22,80,443以及30000-50000之间所有的端口向外暴露,其他端口拒绝
iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT
iptables -f filter -A INPUT -p TCP -j DROP
2、指定一段连续的ip地址范围(iprange)
--src-range from[-to]: 源地址范围
--dst-range from[-to] 目标地址范围
案例:
要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝
iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT
iptables -f filter -A INPUT -p TCP -j DROP
3、匹配指定字符串(string)
--string pattern # 指定要匹配的字符串
--algo {bm|kmp} # 匹配的查询算法
案例:
要求访问数据包中包含HelloWorld的数据不允许通过。
iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP
4、根据时间段匹配报文(time)
--timestart hh:mm[:ss] # 开始时间
--timestop hh:mm[:ss] # 结束时间
--monthdays day[,day...] # 指定一个月的某一天
--weekdays day[,day...] # 指定周 还是 周天
案例:
要求每天的12到13之间,不允许访问
iptables -t filter -A INPUT -p TCP -m time --timestart 4:00 --timestop 5:00 -j DROP
# 必须使用UTC时间!!! 所以现在的时间要减8
5、禁ping, 默认本机无法ping别人 、别人无法ping自己
--icmp-type {type[/code]|typename}
echo-request (8) 请求
echo-reply (0) 回应
案例:
要求别人不能ping本机,但是本机可以ping别人
iptables -t filter -A INPUT -p TCP -m ICMP --icmp-type "echo-request" -j DROP
6、限制链接数,并发连接数(connlimit)
--connlimit-upto n # 如果现有连接数小于或等于 n 则 匹配
--connlimit-above n # 如果现有连接数大于n 则匹配
案例:
要求主机连接最多有2个
iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP
7、针对 报文速率 进行限制。 秒、分钟、小时、天
--limit rate[/second|/minute|/hour|/day] # 报文数量
--limit-burst number # 报文数量(默认:5)
案例:
要求限制速率在500k/s左右
iptables -t filter -A INPUT -p TCP -m limit --limit 333/s -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
开机自启动iptables
systemctl enable --now iptables