iptables概述
1.Linux 系统的防火墙 :IP信息包过滤系统,它实际上由两个组件netfilter 和 iptables组成。
2.主要工作在网络层,针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上。
-netfilter/iptables关系:
netfilter:
属于"内核态"又称内核空间(kernel space)的防火墙功能体系。linux 好多东西都是内核态 用户态,那我们运维人员关注的是用户态, 内核我们关注不是很多,内核基本是我们开发人员关心的事情是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables :
属于"用户态"(User Space, 又称为用户空间)的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下。
netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
iptables的四表五链
五链:控制流量的时机
流量:有两种可能性:一种是发给你的,另一种是需要你转发的
五个规则链:
1.pre -routing :路由选择前处理数据包
2.post -routing:路由选择后处理数据包
3.input :处理进入本机的数据包
4.output :处理本机出去的数据包
5.forward :处理转发数据包
四个规则表:(按优先级排列)如何控制流量
raw > mangle > nat > filter
1.raw表:确定是否对该数据包进行状态跟踪
2.mangle表:为数据包设置标记
3.nat表:修改数据包中的源、目标ip地址或端口
4.filter表:确定是否放行该数据包(实际上就是过滤)
总结:
- 表的作用:容纳各种规则链
- 表的划分依据:防火墙规则的作用相似
- 链规则的作用:对数据包进行过滤或处理
- 链的作用:容纳各种防火墙规则
- 链的分类依据:处理数据包的不同时机
内核数据包的传输过程
1.当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要 转送出去
2.如果数据包是进入本机的,数据包就会到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达
3.如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
iptables的安装
centos7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙,必须先关闭firewalld防火墙,再安装iptables
yum -y install ptables iptables-services #安装后再开启
iptables的基本语法:
iptables [-t 表名] 管理选项 [规则链] [匹配条件] [-j 控制类型]
管理选项 | 用法示例 |
---|---|
-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 | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
匹配条件
匹配条件 | 含义 |
---|---|
-s | 源地址 |
-d | 目的地址 |
--sport | 输入端口 |
--dport | 输出端口 |
-i | 代表从哪个网卡进来 |
-o | 代表从哪个网卡出去 |
数据包的常见控制类型
控制类型 | 含义 |
---|---|
DROP | 丢弃 |
REJECT | 拒绝 |
ACCEPT | 允许 |
LOG | 日志,添加备注 |
SNAT | 源地址转换 |
DNAT | 目的地址转换 |
查询: -vnL
iptables [-t 表名(默认filter)] -vnL :
v:显示详细信息
n:所有字段以数字化形式显示
L:防火墙列表
显示行号: iptables -vnL --line-num
如果查看的不是filter表需要指明表:
iptables -vnL -t nat
添加规则:-A -I
-A:追加规则
iptales -A INPUT -s ip/掩码 -j ACCEPT或REJECT或REJECT
示例:
iptables -A INPUT -p icmp -j REJECT
#不允许任何主机ping本主机
#形成白名单:
iptables -A INPUT -s 192.168.116.30 -j ACCEPT #允许192.168.116.30通过
iptables -A INPUT -i lo -j ACCEPT #允许本机的网卡通过
iptables -A INPUT -j REJECT #最后一条加入拒绝全部,白名单形成
#黑名单则反之
-I (大写的i)需要指明序号:
iptables -I INPUT 2 -s 192.168.116.0 /24 -j ACCEPT
#允许主机ssh端口通过我
语法:ipatble [-t fil] I或A 链(INPUT) 规则 -j 跳转
删除、清空规则:-D -F
-F:清空规则
iptables -F
-D:删除
iptab -D 链 规则序号
示例:
iptables -t filter -D INPUT 2
#删除 filter 表中 INPUT链中的 第2条规则
修改默认规则:-P
-F只会清空链中的规则,并不影响-P的默认规则,默认规则需要手动修改
语法:iptables [-t 表名] -P 链名 控制类型
默认是允许通过(黑名单)
iptaples -P INPUT -j ACCEPT
修改默认不允许通过(白名单)iptaples -P INPUT -j REJECT
替换规则:-R
iptables -R INPUT 1 -S 192.168.116.30 -j ACCEPT
#将序号的内容替换为192.168.116.30
通用匹配和模块匹配
通用匹配:没有指明模块
模块匹配:写规则的时候要 -m 指定模块名
-m 模块名 如-m time 指定时间模块
通用匹配
直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
1.协议匹配: -p协议名
2.地址匹配: -s 源地址、-d目的地址 #可以是IP、网段、域名、空(任何地址)
3.接口匹配: -i入站网卡、-o出站网卡
iptables -A FORWARD ! -p icmp -j ACCEPT #使用了icmp协议
iptables -A INPUT -s 192.168.91.101 -j DROP #使用源地址
iptables -I INPUT -i ens33 -s 192.168.116.0/24 -j DROP
#进入的网卡口为ens33,源地址为192.168.116.0/24
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT
#感叹号"!"表示取反
扩展模块的使用
隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类 型等条件。
端口匹配: --sport 源端口、--dport 目的端口,可以是个别端口、端口范围
注意:
--sport和--dport 必须配合-p <协议类型>使用
端口可以使用的范围 0-65535
TCP标记匹配: --tcp-flags TCP标记
ICMP类型匹配:--icmp-type ICMP类型,可以时字符串、数字代码
示例题:
100能ping通101,101ping不通100
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
#禁止其它主机ping本机
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
#允许本机ping其他主机
icmp 协议的扩展选项
语法:--icmp-type {类型编号(0或8) |协议名}
0/0 = echo-reply icmp应答
8/0 = echo-request icmp请求
显示 扩展模块
要求以"-m扩展模块"的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
多端口匹配
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
iptables -A INPUT -P tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -P udp -m multiport --dport 53 -j ACCEPT
IP范围匹配
iptables -A INPUT -m iprange --src-range 192.168.91.101-192.168.91.103 -j REJECT
指定 源地址为192.168.91.101-192.168.91.103 3个地址无法访问 当前主机
MAC地址匹配适用于:PREROUTING, FORWARD,INPUT chains
-m mac --mac-source XX:XX:XX:XX:XX:XX(MAC地址)
iptables -A FORWARD -m --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发
状态匹配
state
状态类型:
-
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
-
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
-
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
-
INVALID:无效的连接,如flag标记不正确
-
UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
格式:
-m state --state连接状态
ipatables -A INPUT -m state --state NEW(新发起的) -j REJECT ipatables -A INPUT -m state --state ESTABLISHED(已存在) -j ACCEPT
新用户不可以访问 老用户可以访问
故障案例:
state示例题:
规则优化、实践
-
安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
-
谨慎放行入站的新请求
-
有特殊目的限制访问功能,要在放行规则之前加以拒绝
-
同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
-
不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
-
应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
-
设置默认策略,建议白名单(只放行特定连接)
A:iptables -P,不建议,容易出现"自杀现象"
B:规则的最后定义规则做为默认策略,推荐使用,放在最后一条