Iptables 主机防火墙规则
1.概述 内外网防火墙 软硬件分类
Firewall:防火墙,工作在主机或网络的边缘。进出本主机或网络段的数据报文,根据规则做匹配,根据匹配的结果做处理。一种隔离技术,实现内网以及外网传输控制,最大限度阻止黑客破坏企业网络,加强企业网络安全。基于本机内核中的TCP/IP协议栈内核
防火墙根据作用对象分类
主机型防火墙:单台主机上设置防火墙,保护主机数据安全。控制的是网络用户 对服务器数据的访问
网络型防火墙:管理整个企业的网络安全,内部主机也要设置防火墙 内网外网沟通是一定经过防火墙
防火墙根据软硬件分类
硬件防火墙:通过硬件的方式实现防火墙
软件防火墙:通过软件的形式实现防火墙
2.分为两部分iptables Netfilter 四表五链 匹配规则
iptables分为两部分为iptables/netfilter
1.iptables是属于应用程序,完成规则设置命令行工具,是一个防火墙的设置命令,/sbin/iptables,用于管理防火墙规则。
2.Netfilter:位于内核中的包过滤功能体系,是实现防火墙的功能模块。
3.iptables 工作在网络层,通过规则对数据“包”进行过滤
注意:
CentOS 7之前,默认启动的防火墙是iptables,CentOS 7之后默认启动的是firewalld,
firewall是iptables的外壳,是基于iptables工作
1.)iptables规则链 规则定义:设置条件,进行数据包的匹配,依据匹配进行处理
规则的集合体 --规则链
对数据包进行过滤或处理。--规则的作用
容纳各种防火墙的规则--链的作用
处理数据包的不同时机--链的分类依据:
默认的5种规则链(分类依据按照时机来划分的)对数据包处理的不同时间
1、在进行路由选择前处理数据包--PREROUTING 路由选择前执行的规则 判别路由之前(NAT)
2、处理入站数据包--INPUT 处理发给本机的数据包
3:处理出站数据包 --OUTPUT 本机发出去的数据包
4、处理转发数据包--FORWORD 本机相当于转发路由,
5、在进行路由选择后处理数据包--POSTROUTING 路由判断选择之后,处理数据包
2.)规则表:容纳各种规则链
(表是链的分类) 根据链对数据不同的操作,分为表
4个功能表:
filter对数据包进行过滤,确认是否放行该数据包。
natnetwork address translation 网络地址转换(修改数据包中的源、目标IP地址或端口。)
Mangle拆解报文,做出修改,封装报文,主要为数据包设置标记
raw关闭nat表上启用的连接追踪机制,确定是否对该数据包进行状态跟踪
各个链的包含的功能、实现的位置:数据包 从左往右 一个表一个表流动
3.)总结:iptables 四表五链 规则匹配 编写顺序
1.四表:Raw(跟踪)、mangle(标记)、nat(修改)、fliter(过滤)
2.五链:PREROUTING、INPUT、OUTPUT、FORWORD、POSTROUTING
3.规则链之间的顺序
流入:PREROUTING---> INPUT
流出:OUTPUT ---> POSTROUTING
转发:PREROUTING ---> FORWARD ---> POSTROUTING
优先级次序:Raw(跟踪)>mangle(标记)>nat(修改)>fliter(过滤)
4.规则匹配:
按顺序从上往下依次检查,匹配即停止。
若找不到匹配规则,按照该链的默认策略处理。
5.链上规则编写次序注意事项:
1.规则编写的时候,同类(同一应用)规则,匹配范围小的放在上面。
2.不同类规则,访问频率较大的放最上面
3.设置默认策略
4.尽量将可以由一条规则描述的多个规则合并为一条规则
4.)iptables命令的使用 启动安装
rpm -qa | grep iptables检查是否安装:
yum -y install iptables iptables-services --安装软件安装:
从firewall转为iptables:
systemctl unmask iptables---解覆盖,即显现iptables
systemctl mask firewalld ---覆盖firewalld
systemctl stop firewalld
systemctl disable firewalld
systemctl restart iptables
systemctl enable iptables
iptables -v -L -n --line-numbers --查看默认filter表上 的所有链的信息
1.)iptables格式规则:
Iptbales [-t表名] 选项 [链名] [条件] [-j控制类型]
在什么表的 什么链 的哪个地方(选项) 添加一条防火墙规则(条件) 满足条件后执行 J
注意!
1.不指定表名时,默认指定filter表
2.不指定链名时,默认指定表内的所有链
3.除非设置链的默认策略,否则必须指定匹配条件
4.选项、链名、控制类型使用大写字母 其余均为小写
2.) 4个功能表:过滤,地址转换,标记,跟踪
filter对数据包进行过滤,确认是否放行该数据包。
nat(network address translation) 网络地址转换(修改数据包中的源、目标IP地址或端口。)
Mangle拆解报文,做出修改,封装报文,主要为数据包设置标记
raw关闭nat表上启用的连接追踪机制,确定是否对该数据包进行状态跟踪
3.) 5种规则链 (默认) 分类依据 对数据包处理的不同时间
1、在进行路由选择前处理数据包--PREROUTING 路由选择前执行的规则 判别路由之前(NAT)
2、处理入站数据包--INPUT 处理发给本机的数据包
3:处理出站数据包 --OUTPUT 本机发出去的数据包
4、处理转发数据包--FORWORD 本机相当于转发路由,
5、在进行路由选择后处理数据包--POSTROUTING 路由判断选择之后,处理数据包
5.)查看表 规则 -L -n -v --line-numbers
查看规则
-L:列出指定链上的所有规则,后面紧跟要查看的链
-n:以数字格式显示地址和端口号(不反解)
-v: 显示详细信息 -vv:更加详细信息
--line-numbers 行号
iptables -v -L -n --line-numbers --查看默认filter表上 的所有链的信息
iptables -t nat -n -L PREROUTING --查看 nat表上的 PREROUTING链信息
因为没有配置,所有为空
列表中的内容chain
police ACCEPT默认允许的意思
target控制类型
port端口类型
source源地址
destination目的地址
6.)链管理 设置远程登录 -F清除规则 -Z 重新计数-P链默认规则
-F 清除所有规则
-P(大写)为指定的链设置 默认规则,
-Z 栈内流量数据,重新计数
iptables -t filter -P INPUT DROP -- -P设置默认类型为DROP直接丢弃
iptables -L -n -v --line-numbers --查看所有防火墙
iptables -P INPUT ACCEPT --设置可以远程登录
这样可以远程登录
7..)链规则管理 -A末尾追加 -I 开头插入 -D删除 -R替换
-A 在链的末尾追加一条规则
-I 在链的开头或指定行插入一条规则
(在链名后面(例如INPUT)可以添入数字代表把写入的规则插入第几行。省略默认为第一行)
-D 删除指定链上的指定规则
-R 修改或替换指定链上的指定规则
1.在末尾增加一条规则 -A
iptables -A INPUT -s 192.168.10.100 -d 192.168.10.200 -j ACCEPT
在末尾增加规则 收到来自10.100的数据包 发到10.200 做ACCEPT接受的动作
在增加一个 不接受DROP
iptables -A INPUT -s 192.168.10.111 -d 192.168.10.200 -j DROP
2.删除一条 规则 -D
iptables -D INPUT 2 删除INPUT的第二条规则
3.更改一条规则
iptables -R INPUT 1 -s 192.168.10.0/24 -d 192.168.10.200 -j ACCEPT
更改什么链第几条
例如下列例子:
iptables -t filter -P FORWARD DROP(要把转发关掉保证安全)
iptables -t filter -n -L --line-numbers(查看filter表的相关规则内容)
iptables -L FORWARD -n -v(查看指定规则链的内容)
iptables -P OUTPUT ACCEPT(一般默认出站不过滤)
iptables -D INPUT 1(删除INPUT链的第一条规则)
一般情况下 设置默认规则INPUT和FORWARD要设置成DROP,OUTPUT一般设置为ACCEPT
8.)数据包的常见控制类型
ACCEPT:允许通过
DROP直接丢弃, 不给出任何回应
REJECT:拒绝通过, 必要时会给出提示
REDIRECT端口 重定向
LOG记录日志信息, 然后传给下条规则 继续匹配
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE地址伪装
例如:
iptables -t filter -I INPUT -d 192.168.22.13 -p icmp -j DROP
设置规则 来自filter表的 input链 到目的地址22.13 -p端口协议为icmp DROP不通过
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
设置规则 来自filter表的 input链 端口为22的 则通过
iptables -A INPUT -p tcp --sport 22 -j ACCEPT
设置规则 在filter表的 input链插入一个规则 端口协议为tcp 来源地址端口为22的包 通过
9.)匹配条件 ! -s d p i o 取非 ping
-s IP|NETADDR 数据包的来源地址ip或网段 检查报文中源IP是否属于此处指定的地址范围
-d IP|NETADDR 到目标ip或网段 检查报文中目标IP是否属于此处指定的地址范围
-p {tcp|udp|icmp}支持三种协议 检查报文中的协议,即IP首部中protocols所标识的协议
-i {eth0/eth1/ens33} 从那个网卡进来 仅用于PREROUTING,INTPUT,FORWARD链
-o {eth0/eth1/ens33} 从那个网卡出去 仅用于FORWARD,OUTPUT,POSTROUTING链
例如:
1.使客户能连接22端口 input连接22 output回复
iptables -I INPUT -s 192.168.10.1 -d 192.168.10.200 -p tcp --dport 22 -j ACCEPT
I插入filter表的input链 来自10.1 到10.200 的ip 协议为tcp 目的端口为22 则通过
iptables -I OUTPUT -s 192.168.10.200 -d 192.168.10.1 -p tcp --dport 22 -j ACCEPT
-I插入 filter表的output链 来自10.200 到10.1 的ip 协议为tcp 目的端口为22 则通过
2. 10.100 和10.150 可ping
iptables -A INPUT -s 192.168.10.100 -d 192.168.10.150 -p icmp -j ACCEPT
在input表 最后插入规则 来源10.100 目的10.150 协议为icmp 通过 进
iptables -A OUTPUT -s 192.168.10.150 -d 192.168.10.100 -p icmp -j ACCEPT
在input表 最后插入规则 来源10.150 目的10.100 协议为icmp 通过 出
3. -R 修改第一个
iptables -R INPUT 1 -s 192.168.10.1 -d 192.168.10.200 -p tcp --dport 22 -i ens33 -j ACCEPT
R修改filter表的input链 来自10.1 到10.200 的ip 协议为tcp 目的端口为22 从ens33进来的 则通过
iptables -R OUTPUT 1 -s 192.168.10.200 -d 192.168.10.1 -p tcp --dport 22 -o ens33 -j ACCEPT
R修改 filter表的output链 来自10.200 到10.1 的ip 协议为tcp 目的端口为22 从ens33进来的 则通过
4. 可以 ping
iptables -A INPUT -p icmp -s 192.168.10.0/24 -d 192.168.10.20 -j ACCEPT
在input链最后加入 来源10.0/24网段 目的ip 10.20 icmp的协议 即可ping 通 进
iptables -A OUTPUT -p icmp -s 192.168.10.20 -d 192.168.10.0/24 -j ACCEPT
在output链最后加入 来源10.20 目的ip10.0/24 icmp协议 可通 出
iptables -L -查看
iptables -A INPUT -p icmp -s 192.168.10.20 -j ACCEPT
(允许192.168.10.20主机能Ping本机)
iptables -I INPUT -p tcp -d 192.168.22.13 -j ACCEPT
(允许所有主机能基于TCP访问192.168.22.13)
10.针对网卡接口流入限制匹配 网卡-i ens33 进入 -o出去
-i ens33:流入ens33网卡的数据流 -o ens33:流出ens33网卡的数据流
例如:
iptables -A INPUT -d 192.168.10.0/24 -i ens33 -j ACCEPT
在最后插入 从ens33进来的 目标网段使10.0网段的 通过
(所有22网段主机数据流入本机ens33网卡数据流允许)
iptables -A OUTPUT -s 192.168.10.0/24 -o ens33 -j ACCEPT
(响应22网段主机数据流出本机ens33网卡数据流允许)
11.)扩展匹配
iptables支持的扩展模块
Centos7:/usr/lib64/xtables/模块xxx.so
centos-6 :/lib64/xtable/xxx.so
显示扩展
必须指明扩展模块
获取扩展帮助文档的方式:①centos-6 man iptables
②Centos-7 man iptables-extensions
1.例如 --d /s port PORT目标端口 源端口
--dport PORT 目标端口,可以单个端口,可以是连续的端口(不能离散)
--sport PORT 源端口,
例如:
iptables -I OUTPUT -s 192.168.10.20 -d 192.168.10.0/24 -p tcp --sport 22 -j ACCEPT 出
在output链第一条前增加 当数据包来源ip10.20 目的10.0网段 协议为tcp 端口22 则通过
iptables -I INPUT -s 192.168.10.0/24 -d 192.168.10.20 -p tcp --dport 22 -j ACCEPT 进
在input链第一条前增加 当数据包来源ip10.0网段 目的10.20 协议为tcp 端口22 则通过
iptables -L 查看 22端口为ssh协议
2.三次握手--tcp-flags LIST1 LIST2
--tcp-flags LIST1 LIST2(较少使用):SYN 连接请求 ACK 应答 RST 重置 PSH数据传输
例如:
iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
--syn:检查TCP握手的第一次(其中只有SYN是1)
在filter表 input链中 在第一行插入 如果有数据包从 eth0 接口来 协议为tcp 启动隐式模块
检查tcp三次握手的这些标志SYN,RST,ACK 如果只要SYN=1 其他为0 则不通过
3.Ping -p icmp --icmp-type 0/8
-p icmp --icmp-type 0/8
0:ping响应
8:请求应答, Ping请求
例如:
iptables -A INPUT -s 192.168.10.0/24 -p icmp --icmp-type 8 -j ACCEPT 请求
在input链最后加入 来源网段10.0 ping请求 为8 则通过
iptables -A OUTPUT -s 192.168.10.10 -d 192.168.10.0/24 -p icmp --icmp-type 0 -j ACCEPT
在input链最后加入 来源10.10 目的网段10.0 ping请求 为0 则通过 回应
12.)显示扩展 隐式扩展 -m(注意:如指明了协议可以省略-m)
1.)multiport 端口扩展:-m multiport --sports s源端口 d目的端口
使用离散方式指明多个端口(最多15个)
多端口匹配: -m multiport --sports 源 端口列表
-m multiport --dports 目的 端口列表
例如:
iptables -I INPUT -s 192.168.10.0/24 -d 192.168.10.50 -m multiport -p tcp --dport 22,23,80 -j ACCEPT
Input链 源网段10.0 目的网段10.50 tcp协议 访问 目的端口22.23.80 则通过 进
iptables -I OUTPUT -s 192.168.10.50 -d 192.168.10.0/24 -m multiport -p tcp --sport 22,23,80 -j ACCEPT
Output链 源网段10.50 目的网段10.0 tcp协议 访问源端口22.23.80 则通过 出
2.)iprange 连续ip扩展:指明连续的IP地址 -m iprange --src-range
-m iprange --src-range 指明连续的 源IP地址范围
-m iprange --dst-range 指明连续的 目的IP地址范围
例如:
iptables -I INPUT -d 192.168.30.10 -p tcp -m multiport --dport 22:25,80,514 -m iprange --src-range 192.168.30.11-192.168.30.30 -j ACCEPT
Input链 目的地址30.10 协议为tcp 源端口为22.25.80.514 来源地址范围30.11-30满足则通过
iptables -I OUTPUT -s 192.168.30.10 -p tcp -m multiport --sport 22:25,80,514 -m iprange --dst-range 192.168.30.11-192.168.30.30 -j ACCEPT
Output链 目的地址30.10 协议为tcp 目标端口为22.25.80.514 目的地址范围30.11-30满足则通过
iptables -I INPUT -d 192.168.10.10 -p tcp -m multiport --dport 22:25,80,514 -m iprange --src-range 192.168.10.11-192.168.10.254 -j ACCEPT
iptables -I OUTPUT -d 192.168.10.10 -p tcp -m multiport --sport 22:25,80,514 -m iprange --dst-range 192.168.10.11-192.168.10.254 -j ACCEPT
3.)time 日期时间扩展:根据时间进行匹配 -m time --timestart
--datestart 日期开始
--datestop 日期结束
--timestart时间开始 时分
--timestop时间结束 时分
iptables -I INPUT -s 192.168.10.100 -d 192.168.10.200 -m time --timestart 15:30 --timestop 15:50 -m multiport -p tcp --dport 22,23,80 -j ACCEP
来源于10.100 目的ip10.200 数据包在15.30-50发过来 协议tcp 目的端口22.23.80 则通过
iptables -I OUTPUT -s 192.168.10.200 -d 192.168.10.100 -m time --timestart 15:30 --timestop 15:50 -m multiport -p tcp --sport 22,23,80 -j ACCEPT
来源于10.200 目的ip10.100 数据包在15.30-50发过来 协议tcp 源端口22.23.80 则通过
iptables -L -n -v
4.)string 字符串模块扩展:只能对明文编码协议生效 根据7层字符进行匹配
--algo {bm|kmp}:指定字符串匹配的算法
[!] --string 参数
[!] --hex-string 参数
例如:
iptables -I INPUT -d 192.168.10.20 -m multiport -m string --algo kmp --string "kkk" -p tcp --dport 80 -j ACCEPT
Input链 目的ip10.20 启动multiport模块 目的端口80 启动匹配字符串模块 匹配kkk通过
iptables -I OUTPUT -d 192.168.10.20 -m multiport -m string --algo kmp --string "kkk" -p tcp --sport 80 -j ACCEPT
Input链 目的ip 10.20 启动multiport模块 源端口80 启动匹配字符串模块 匹配kkk通过
Iptables -L -v -n --查看信息
5.)connlimit 限制请求数量扩展:限制单个IP并发请求数量进行匹配过滤
--connlimit-upto : 请求数小于等于阈值时执行操作(centos-6不支持)
--connlimit-above: 请求数大于3时执行操作
例如:
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
(限制ssh并发连接最多3个)
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-upto 3 -j ACCEPT
(限制ssh并发连接最多3个)
6.)limit 速率模块扩展:对响应 速率 进行过滤匹配
--limit-burst:空闲峰值数量
--limit #/minute:单位时间的速率
例如:
iptables -I INPUT -d 192.168.10.20 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
input链 目的ip10.20 ping模块 8进 启动limit 速率模块 空闲峰值为5 一分钟30的频率 允许通过
iptables -I OUTPUT -s 192.168.10.20 -p icmp --icmp-type 0 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
Output链 源ip10.20 ping模块 0出 启动limit 速率模块 空闲峰值为5 一分钟30的频率 允许通过
7.)state 连接状态扩展:检查连接的状态-m state --state ESTABLISHED,RELATED
所有的可追踪的连接状态:
NEW:与任何连接 无关的(新来的)
ESTABLISHD:响应请求 或已建立连接的
RELATED:与已有连接 有相关性的
INVALID:不被允许的类型
UNTRACKED:没有被跟踪的(不常用的)
例如:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
13.) iptables规则保存 和重载
iptables的配置文件:/etc/sysconfig/iptables-config
1.保存在某个文本中,在需要的时候进行重载规则
iptables-save > /root/iptabls-rule 将规则保存至/root/iptabls-rule
cat /root/iptabls-rule
iptables -F
iptables -L
iptables-restore < /root/iptabls-rule 重新加载
2.永久修改和保存
service iptables save(centos-6) (相当于iptables-save > /etc/sysconfig/iptables)
service iptables save
service iptables restart 生效