iptables防火墙
防火墙相关概念
防火墙的种类(从物理角度)
-
-
- 硬件防火墙
- 软件防火墙
-
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。

iptables防火墙
iptables防火墙就属于软件防火墙,iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
-
-
- 网络地址转换(Network Address Translate)
- 数据包内容修改
- 以及数据包过滤的防火墙功能
-
所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

包过滤防火墙
包的概念
在数据传输过程中,将数据分成若干个数据包,一点一点的传输,可以减少对网络的负担
包过滤防火墙的实现
通过iptables中的netfilter这个安全框架,来实现对数据包的过滤,从而达到防火墙的效果
itables中的四表五链
链的概念
现在,我们想象一下,这些”关卡”在iptables中为什么被称作”链”呢?我们知道,防火墙的作用就在于对经过的报文匹配”规则”,然后执行对应的”动作”,所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了”链”,所以,我们把每一个”关卡”想象成如下图中的模样 ,这样来说,把他们称为”链”更为合适,每个经过这个”关卡”的报文,都要将这条”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。

有哪些链
PREROUTING:主机外报文进入位置,允许的表mangle,nat(目标地址转换,把本机地址转换成真正的目标机地址,通常指响应报文)
INPUT : 报文进入本机用户空间位置,允许的表filter,mangle
FORWORD : 报文经过路过,单目标不是本机时,允许的表filter,mangle
OUTPUT : 报文从本机用户空间位置出去的,允许的表filter,mangle,nat
POSTOUTING: 报文经过路由被转发出去,允许的表 mangle,nat
表的概念
一系列功能的集合,就称之为表
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw
iptables流程图
① 从A流出
A——> OUTPUT——>POSTOUTING

② 从B流入
——>PREROUTING——>INPUT——>B

③ 从A流出经过C流向B
A——> OUTPUT——>POSTOUTING——>PREROUTING——>INPUT——>B

iptables的使用
安装与启动
①下载iptables
yum install iptables*
②启动iptables
systemctl start iptables
③关闭firewalld防火墙(不需要有两个防火墙)
systemctl disable --now firewalld
PS:systemctl status iptables :查看iptables是否启动

语法格式
iptables -t 表名 选项 链名称 条件 动作
参数说明
-t :指定需要操作的表
-L :列出规则链中已有的规则(默认列出filter的规则)
-S/--list-rules :列出规则链中所有的已有的规则
-n :不反解地址(以数字的形式显示ip地址)
-v :显示数据包数量与数据包大小
-A/--append : 添加一条规则到表中,添加到末尾
-I/--insert :插入一条规则到表中,添加到开头
-F/--flush :清空规则链中的已有条目
-Z/--zero :清空计数器(包的数量与大小)
-D/--delete :删除链中的规则
-R/--replace :修改链中的规则
-N/--new-chain :创建一个自定义链
-X/--delete-chain :删除一个自定义链
-P/--policy :指定默认的策略
-i :进来的网卡
-o :出去的网卡
-m : 指定模块
-p:指定协议
-s :源地址
-d :目标地址
--sport:源端口
--dport:目标端口
基本的条件匹配
参数 -p
协议 :①TCP(http属于TCP)
②UDP
③ICMP(PING属于TCP)
④ALL(以上全部的条件)
动作
参数 -j
① ACCPET(允许数据包通过)
② REJECT(拒绝数据包通过,并通知给目标方)
③ DROP(丢弃数据包,不给任何信息)
④ REDIRECT(将包导向到另一个端口)
模块
iptables中的模块是为了拓展iptables的功能的,为了更方便的使用iptables的功能
参数 -m
① multiport模块
使用multiport模块,可以匹配多个端口,不同的端口之间用逗号分割,连续的端口之间使用冒号分割
参数 :--dports (多个目标端口)
② iprange模块
指定一段连续的IP地址范围,可以使用iprange扩展模块。
参数 :--src-range from [-to] (源地址范围)
--dst-range from [-to] (目标地址范围)
③string模块
使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。
参数:--string pattern(指定匹配的字符)
--algo bm/kmp (指定匹配的查询算法)
④time模块
可以使用time扩展模块,根据时间段匹配报文,如果报文到达的时间在指定的时间范围内,则符合条件。
参数:--timestart hh:mm:[ss](指定开始的时间,秒数ss可以省略)
--timestop hh:mm : [ss](指定结束的时间,秒数ss可以省略)
--weekdays day[,day] (指定一个星期的某一天,有多天用逗号隔开)
--monthsday day[,day] (指定一个月的某一天,有多天可以用逗号隔开)
注意:时间必须是UTC时间
⑤icmp模块
禁ping,默认本机无法ping别人,别人无法ping本机
参数:--icmp{type[/code]|typename}
echo-request(8) 请求
echo-reply (0) 响应
⑥connlimit模块
connlimit模块可以限制每个IP地址同时链接到server端的链接数量,不指定IP,其默认就是针对每个客户端IP,即对单个IP的并发连接数限制。
参数:--connlimit-upto n(限制连接数量小于或等于n)
--connlimit-above n (连接数量大于n)
⑦limit模块
limit模块是对“报文到达速率”进行限制;限制单位时间内流入的包的数据。
参数 --limit rate[/second|/minute|/hour|/day]
--limit-burst number (报文数量,默认是5)
测验
案例1:只允许22,80,443端口可以访问,其他端口全部无法访问。
① [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443 -j ACCEPT (允许22,80,443端口通过)
②[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP (过滤其他条件直接丢弃)

案例2:只允许22,80,443端口可以访问,其他端口全部无法访问,但是本机可以访问百度。
①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,40,443 -j ACCEPT(允许22,80,443端口通过)
②[root@m01 ~]# iptables -t filter -A INPUT -p ICMP -m icmp --icmp-type "echo-request" -j DROP(将对自己发起的请求过滤丢弃)

案例3:要求使用192.168.15.81能够通过22端口链接,但是其他的不行
①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22 -j ACCEPT(过滤目标ip是192.168.15.81的ip并且还是使用端口22的允许通过)
②[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP(过滤其他条件的并丢弃)

案例4:只允许192.168.15.81能够通过22端口链接,其他的不行。
①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -s 192.168.15.71 -d 192.168.15.81 --dport 22 -j ACCEPT(允许源地址为192.168.15.71并且目标地址为192.168.15.81且端口为22号的通过)
②[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP(不允许其他的通过)

案例5:要求192.168.15.81对外部不可见
①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 -j DROP(将公网的ip过滤并丢弃)


案例6:要求使用eth0网卡的所有请求全部拒绝
[root@m01 ~]# iptables -t filter -A INPUT -i eth0 -j DROP


案例7:使用176.16.1.81登录进来的窗口,不允许访问百度。
[root@m01 ~]# iptables -t filter -A OUTPUT -p TCP -o eth01 -j DROP
案例8:要求访问服务器的8080端口转发至80端口
[root@m01 ~]# iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80
案例9:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT(只允许Windows的ip允许经过22端口通过)
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP(将其他情况拒绝)
案例10:要求将22,80,443以及30000-50000之间所有的端口向外暴露,其他端口拒绝
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT

案例11:要求访问数据包中包含HelloWorld的数据不允许通过。
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP
案例12:要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝
①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT(允许192.168.15.1-192.168.15.10范围内的ip能够连接)
②[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP(过滤其他IP并拒绝)
案例13:要求每天的12到13之间,不允许访问
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m time --timestart 4:00 --timestop 5:00 -j DROP
案例14:要求别人不能ping本机,但是本机可以ping别人
[root@m01 ~]# iptables -t filter -A INPUT -p ICMP -m icmp --icmp-type "echo-request" -j DROP
案例15:要求主机连接最多有2个
[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m connlimit --connlimit-above 2 -j DROP
案例16:要求限制速率在500k/s左右
①iptables -t filter -A OUTPUT -p TCP -m limit --limit 333/s -j ACCEPT
②iptables -t filter -A OUTPUT -p TCP -j DROP

浙公网安备 33010602011771号