iptables基本知识
防火墙可分为
网络防火墙
主机防火墙
大致定义:工作在网络或主机边缘,对于进出的报文,根据事先定义好的规则做检查,将那些能够匹配到的报文做出相应处理的组件。组件既可以是硬件也可以是软件。
Iptables是应用程序
Iptables:编写规则的工具(检查语法送往netfilter)
Netfilter:网络过滤器,内核中工作在TCP/IP网络协议栈上的框架。工作在内核中的框架,真正起到防范功能作用的
PS:要防火的关键是规则,而不是这些组件,组件根据规则来进行工作
路由发生时刻:
1、 报文进入本机,判断目标地址
2、 报文离开本机,判断经由那个接口发出
Hooks function 钩子函数,即5个链
Prerouting:进入本机后,路由发生前
Input:到达本机内部
Output:由本机发出
Forwar:由本机转发
postrouting:路由功能发生之后,离开本机之前
报文流向经由的位置
1、 到本机内部:prerouting、input
2、 由本机发出:output、postrouting
3、 由本机转发:prerouting、forward、postrouting
规则的功能(表)
过滤 filter
地址转换 NAT
mangle 修改报文中的某些信息(除地址之外)
raw 关闭NAT表上启用的连接追踪功能
每个表发生在不同的链上
filter:input、output、forward
NAT:prerouting、output、postrouting
mangle:prerouting、input、forward、output、postrouting
RAW:prerouting、output
Iptables:每个钩子上可放置N条规则,对应每个钩子上的多条规则称之为链(chain)
每个功能由多个链组成,称之为表
链:链上的规则次序即为检查次序,因此有一定规律
同类规则,匹配小的放上面
不同规则,匹配报文几率较大的放上面
应该设置默认规则
Iptables的四表五链添加规则时的考量点
实现的功能,判断在那个表上
报文的流向及经由路由,判断在哪个链上
功能优先级,从高到低
raw --> mangle --> NAT --> filter
规则的组成部分:报文的匹配条件,匹配如何处理
匹配条件:基本匹配、扩展匹配
如何处理:内建机制处理、自定义处理机制(自定义的链)
Iptables是规则管理工具,能够自动检查规则语法
规则和链有计数器:
pkts:由规则或链匹配到的数据报文个数
bytes:由规则或链匹配到的数据报文大小总和
通过iptables命令生成规则送往netfilter
规则通过内核接口送往内核,因此会立即生效,但不会永久生效
期望永久生效,需要保存在配置文件中,此文件需开机自动加载或手动加载
语法格式:
iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
TARGET:
-j jump跳转目标,内置:
ACCEPT 允许数据报通过
DROP 直接丢弃
REJECT 拒绝并发包通知对方
-t TABLE:
默认是filter,四表:filter nat mangle raw
SUBCOMMAND:
链:
-F flush,清空指定表上指定链的规则,省略链名时,则清空指定表上所有规则
-N new,新建一个用户自定义链,自定义链只能作为默认链的引用
-X drop,删除用户自定义的链(内容为空),内置链不可删除
-Z zero,清空计数器,每个链上的每条规则都有计数器,记录匹配到的报文数量、大小
-P policy,设置默认规则,当所有规则都无法匹配或匹配到无法做出有效处理机制,则按默认规则处理
-E rename,自定义链重命名,已经被引用的自定义链无法被重命名
规则:
-A append,链尾追加规则
-I insert,在指定位置插入一条规则
-D delete,删除指定规则
-R replace,替换指定规则
查看:
-L list,列出链上所有规则
-n numeric,以数字格式显示地址和端口号,即不反解
-v verbose,详细格式,显示规则的详细情况,包括计数器等
-vv 更加详细
-vvv 比vv还要详细
--line-numbers 显示规则编号
-x exactly 显示计数器的精确值
pkts bytes target prot opt in out source destination
pkts 匹配到的报文数量
bytes 匹配到的所有的数据报大小之和
target 处理目标,(目标可以是自定义的链)
port 协议{tcp udp icmp}
opt 可选项
in 数据报流入接口
out 数据报流出接口
source 源地址
destination 目的地址
CRETERIA匹配条件
检查IP首部,检查tcp、udp或ICMP首部
基于扩展机制,也可以基于额外的机制,如连接追踪
注意:可以同时制定多个条件,意味着同时匹配多个条件才行
匹配条件:
通用匹配
扩展匹配
隐式扩展
显示扩展
通用匹配:
-s 检查报文中的源IP地址; ! 取反
-d 检查报文中的目标IP地址
-p 检查报文中的协议,TCP UDP ICMP
-i 数据报文流入接口,通常用在prerouting input forward链上
-o 数据报文流出接口,通常用在forward output postrouting链上
扩展匹配:使用iptables的模块实现扩展检查机制
隐式扩展:如果在通用匹配上使用-p 指定协议的话,那么-m选项指明扩展则变得可有可无
TCP
--dport 目标端口
--sport 源端口
--tcp-flags LIST1 LIST2 ;LIST1是要检查的标志位,LIST2是LIST1中出现过的,其标志位为1,其他的全都为0
如:--tcp-flags syn,ack,fin,rst syn 意思就是检查syn,ack,fin,rst几个标志位,其中syn要为1,ack,fin,rst全都为0。即第一次建立连接,有一个专门选项—syn
--syn 三次握手低第一次,即新建连接
UDP
--dport
--sport
ICMP
--icmp-type
8 echo request 请求
0 echo reply 响应
如:
iptables -A INPUT -s 192.168.202.0/24 -d 172.20.1.10 -p tcp --dport 80 -j ACCEPT
显示扩展 必须指明使用的扩展机制
-m 模块名称,-m必须写
查看有哪些模块可用rpm -ql iptables ,消息.so结尾的都是扩展模块
multiport扩展:以离散端口匹配多端口,最多可同时制定15个端口
专用选项:
--sports --source-ports PORT[,PORT…]
--dports --destination-ports PORT[,PORT…]
-ports PORT[,PORT…]
如:
iptables -A INPUT -d 172.20.1.10 -p tcp -m multiport --dports 80,22,443 -j ACCEPT
iprange扩展:指定连续的IP范围,用于匹配非整个网络
专用选项:
--src-range IP[-IP]
--dst-range IP[-IP]
如:
iptables -A INPUT -d 172.20.1.10 -p tcp –dport 23 -m multiport --src-range 192.168.1.50-192.168.1.100 -j REJECT
string扩展:检查报文中出现的字符串,与给定的字符串做匹配
字符串匹配检查算法:kmp bm
专用选项:
--algo {kmp|bm} 指定算法
--string “STRING” 搜索指定字符串
--hex-string “HEX_STRING” 编码成16进制的字符
如:
iptables -I OUTPUT -s 172.20.1.10 -p tcp --dport 80 -m string –string “sex” --algo kmp -j REJECT
time扩展:基于时间区间做访问控制
专用选项:
--datestart YYYY[-MM][-DD][hh[:mm[:ss]]]
--datestop YYYY[-MM][-DD][hh[:mm[:ss]]]
--timestart
--timestop
--weekdays DAY1,[DAY2,…]
如:
iptables -I INPUT -d 172.20.1.10 -p tcp –dport 80 -m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fir -j REJECT
connlimit扩展:基于连接数做限制,对每个IP能够发起的并发连接数做限制(单个IP)
专用选项:
--connlimit-above [N]
如:(限制连接1.10 的22端口4个连接,如果到5个或超过5个连接则被拒绝)
iptables -I INPUT -d 172.20.1.10 -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT
limit扩展:基于发包速率做限制
专用选项:
--limit N[/second|/minute|/hour|/day] 每个时刻最多几个包
--limit-burst N 限制某一时刻突发量最多有几个包(像一个令牌桶)
如:每分钟允许10个ping包,突发5个包被允许,超出的按别的规则或默认策略
iptables -I INPUT -d 172.20.1.10 -p icmp --icmp-type 8 -m limit 10/minute –limit-burst 5 -j ACCEPT
实现的效果是:前四个包正常,从第五个开始,我们每6秒钟收到一个正常的回应
stat扩展:启用连接追踪模板记录连接,并根据连接匹配连接状态的扩展
启用连接追踪功能之前,只能称之为简单的包过滤防火墙,开启了连接追踪之后则成为带状态监测的包过滤防火墙
connection template 连接追踪模板,用于记录各连接及相关状态,基于IP实现,与协议无关,通过倒计时的方式删除条目
记录连接的状态:
NEW:新建连接,连接追踪模板中无相对应的条目时,客户端第一次发出请求
ESTABLISHED:NEW状态之后,距追踪模板中的条目删除之前所进行的通信都是established状态
RELATED:相关的连接。入FTP协议中命令连接与数据连接就是相关联的连接
INVALIED:无法识别的状态
专用选项:
--stat {NEW|ESTABLISHED|RELATED|INVALIED}
如:
iptables -I INPUT -d 172.20.1.10 -p tcp -m multiport --dports 21,22,80,443 -m stat --stat NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 172.20.1.10 -m stat --stat RELATED,ESTABLISHED -j ACCEPT
启用stat模块连接追踪,占用的是系统内核的内存,可以存放最大条目数:
/proc/sys/net/nf_conntrack_max
调整连接追踪模板中存放的最大条目数
echo “N” > /proc/sys/net/nf_conntrack_max或sysctl -w net.nf_conntrack_max=”N”
永久生效则需要写入/etc/sysctl.conf
查看当前追踪的所有连接
cat /proc/net/nf_conntrack
lsmod命令可以显示已经加载到内核中的所有模块信息,如果不想启用连接追踪,则需要卸载模块(modprobe)
不同协议或连接类型默认的追踪时长
/porc/sys/net/netfilter/*
放行被动模式下的FTP服务
1、装载内核模块
modprobe nf_conntrack_ftp (ftp的追踪模块)
2、放行请求报文
放行入站请求端口为21的请求报文
放行所有状态为ESTABLISHED和RELATED的入站报文
3、放行出站报文
放行所有状态为ESTABLISHED的出站报文
一旦启用连接追踪功能nf_conntrack模块则会自动装载;不过nf_conntrack_ftp模块需手动装载
保存iptables规则
1、service iptables save
/etc/sysconfig/iptables(默认保存位置)
2、iptables-save > /PATH/TO/SOMEFILE
载入规则
1、service iptables reload
2、iptables-relstore < /PATH/TO/SOMEFILE
原文地址:http://wangkunpeng.blog.51cto.com/1538469/1904789