创建时间: 2016-06-27
最近修改时间: 2016-06-27因个人水平有限,文章中存在不足,错误之处,还望指正
目录
简介
相关文件
表和链
选项
匹配扩展
操作实例
简介
相关文件
/etc/sysconfig/iptables
iptables防火墙的规则文件,iptables/netfilter服务在启动时会去读取该文件的内容
/etc/sysconfig/iptables-config
iptables的配置文件
表和链
raw
mangle
此表主要用来mangle数据包,可以用mangle匹配来修改包TOS,TTL,MARK等特性
nat
此表用于NAT(Network Address Transfer),网络地址转换,可分为SNAT,DNAT和MASQUERADE。
filter
用于对数据包进行过滤(ACCEPT或DROP等)
PREROUTING
路由前,数据包从网卡进入,但是还没有进行路由选择
INPUT
数据包从内核空间流向用户空间
FORWARD
路由后,数据包流向网卡(并未准备发送出去)
OUTPUT
数据包从用户空间流向内核空间
POSTROUTING
路由后,数据包流向网卡准备发送出去
选项
规则追加 | 删除
``# iptables [-t table] -[AD] chain rule-specification [options]
规则插入
# iptables [-t table] -I chain [rulenum] rule-specification [options]
规则替换
# iptables [-t table] -R chain rulenum rule-specification [options]
v
列出 | 清空规则 | 清零计数器
# iptables [-t table] -[LFZ] [chain] [options]
为非自定义链添加默认策略
# iptables [-t table] -P chain target [options]
新建自定义空链
# iptables [-t table] -N chain
重命名自定义规则链
# iptables [-t table] -E old-chain-name new-chain-name
删除自定义规则链
# iptables [-t table] -X [chain]
-A, –append chain rule-specification
追加规则到指定链中
-D, –delete chain rulenum
删除指定链中的规则
-I, –insert chain [rulenum] rule-specification
在指定规则前插入一条规则
-R, –replace chain rulenum rule-specification
替换指定规则
-L, –list [chain]
列出指定链中的所有规则
-n 不解析ip地址成域名,这样可加快显示速度
-x
-v 显示详细信息
-vv 显示更加
--line-number 显示行号
-S, –list-rules
列出指定链中的所有规则,可查看规则链的默认策略
-F, –flush [chain]
清空指定链中的所有规则
-Z, –zero [chain [rulenum]]
清零指定规则上的计数器
-P, –policy chain target
指定规则链的默认策略(处理动作),ACCEPT 、DROP等
-N, –new-chain [chain [rulenum]]
创建自定义空链
-E, –rename-chain old-chain new-chain
重命名自定义链,不可用于非自定义链
-X, –delete-chain [chain]
删除自定义链,该链必须为空且不被其他规则链所引用
-j, –jump target
指定匹配规则后要执行的动作
ACCEPT 放行/接受
DROP 丢弃
REJECT 拒绝
RETURN 返回调用链,在自定义链中使用
LOG 日志记录
REDIRECT 端口重定向,将某一端口的请求转发到另一个端口
SNAT 源地址转换,在nat POSTROUTING中使用
DNAT 目标地址转换,在nat PREROUTING中使用
MASQUERADE 地址伪装,用于源地址转换
MARK 打标签
匹配扩展
扩展匹分为隐含扩展和显式扩展,隐含扩展在使用-p时就会自动引入扩展模块,而显式扩展就需要使用-m指定引用的模块
隐含扩展
不需要使用-m指定引用的模块,使用-p就会自动引入相关的模块
[!] -s, –protocol address[/mask][,…]
指定匹配的源主机地址,可以是单台主机,也可以是一个网段,若想按范围匹配,请参考 -m iprange
[!] -d address[/mask][,…]
指定匹配的目标主机地址
[!] -i, –protocol name
指定匹配数据包流入的网卡
[!] -o, –protocol name
指定匹配数据包流出的网卡
[!] -p, –protocol protocol
指定匹配的协议,tcp,udp,icmp,esp,udplite,ah,sctp或all,指定匹配的协议后又可跟不同的选项
-p tcp
--tcp-flags mask comp
匹配tcp报文中的标志位(URG,PSH,RST,SYN,ACK,FIN | ALL NONE),mask表示要匹配的标志位(多个标志位用逗号隔开),comp表示在mask中出现的标志位为1,不指定的为0
--syn
[!] --sport port[:port]
匹配数据包的源主机及地址
[!] --dport port[:port]
匹配数据包的目标地址
-p udp
-p icmp
--icmp-type {type[/code]|typename}
指定icmp报文的类型/类型码/类型名称,常用的是类型码,可用iptables -p -h 来查看类型名称
icmp报文类型code
0 ping响应
8 ping请求
显式扩展
使用显示扩展时需要用-m来指定要引用的扩展模块
-m 扩展模块 选项
multiport
多端口匹配,多用于匹配离散端口
[!] --sports port[,port|,port:port]...
指定匹配数据包的源主机地址端口,多个离散端口之间用逗号隔开(,),连续端口之间使用冒号(port1:port2),最多可指定15个离散端口
[!] --dports port[,port|,port:port]...
指定匹配数据包的目标主机端口
[!] --ports port[,port|,port:port]...
指定匹配数据包的源、目标主机端口
iprange
地址范围匹配
[!] --src-range from[-to]
匹配指定的源ip地址范围,from为起始地址,to为结束地址
[!] --dst-range from[-to]
匹配指定的目标ip地址范围
time
时间范围匹配,可用于限制某个时间段内的访问
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
匹配指定日期范围,默认的开始时间为1920-01-01,结束时间为2038-01-19
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
匹配指定日期范围,有效范围为00:00:00-23:59:59
[!] --monthdays days[,days...]
匹配一个月中的第几天/几号,有效范围为1-31
[!] --weekdays days[,days...]
匹配星期几,有效值为Mon,Tus,Wed,Thu,Fri,Sat,Sun或1-7
connlimit
并发请求控制
[!] --connlimit-above n
指定每个客户端主机的连接上限
limit
报文流量控制,常见的流控机制有令牌桶控制机制
--limit-burst number
指定数据包控制峰值/最多一次性能容纳几个(数据包队列的容量大小)
--limit rate[/second|/minute|/hour|/day]
指定数据包的速率,默认为3/hour
string
字符串匹配,在做字符串匹配时需要指定使用的算法(–algo),需要内核2.4.16及以上版本
--algo {bm|kmp}
指定所用的匹配算法,有bm和kmp两种(:有兴趣可以去了解一下)
--from offset
指定要匹配字符串的起始位置,默认为0
--to offset
指定要匹配字符串的结束位置,默认为数据包的长度(最后一位)
[!] --string pattern
指定要匹配的内容
[!] --hex-string pattern
指定要匹配的十六进制格式内容,此种方式匹配速度由于--string
state
状态匹配,用于对数据包进行状态追踪。基于ip_conntrack、 nf_conntrack来维持会话表,对于非常繁忙的服务器不建议使用此功能
[!] --state state
匹配数据包的状态,多个状态之间用逗号(,)隔开
state有以下几种,NEW,ESTABLISHED,RELATED,INVALID
NEW
新连接状态,数据包已经开始一个新的连接,但在双方的传输中不能看到
ESTABLISHED
建立状态,数据包已经关联到某个连接上,并且在双方的传输中都能看考
RELATED
关联状态,数据包已经开始了一个新连接,但新连接关联到一个已存在的连接,如TCP数据传输和ICMP错误
INVALID
无效状态,由于某些错误导致数据包不能被识别,如内存溢出错误,icmp错误
调整iptables连接追踪功能
#查看连接追踪模块能容纳的最大会话数
cat /proc/sys/net/nf_conntrack_max
#查看当前所有的追踪连接
cat /proc/net/nf_conntrack
#查看连接追踪允许ESTABLISHED状态会话的时间(秒)
cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
layer7
操作实例
操作环境:Red Hat Enterprise Linux 6.3
本地主机地址 192.168.15.4
规则保存与恢复
#将规则保存到iptables的默认规则文件中(/etc/sysconfig/iptables)
service iptables save
#将规则保存到指定文件中
iptables-save > /path/file
#从指定文件中恢复规则
iptables-restore < /path/file
#允许本机到本机的通讯
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#拒绝恶意报文(TCP报文标记位全0或全1)
iptables -A INPUT -d 192.168.15.4 -p tcp --tcp-flag ALL ALL -j DROP
iptables -A INPUT -d 192.168.15.4 -p tcp --tcp-flags ALL NONE -j DROP
#对192.168.15.0/24网络开放ssh服务
iptables -A INPUT -s 192.168.15.0/24 -d 192.168.15.4 --dport 22 -j ACCEPT
iptables -A OUTPUT -s 192.168.15.4 -d 192.168.15.0/24 --sport 22 -j ACCEPT
#– 放行被动模式下的ftp服务
#1.放行ftp命令连接,包括INPUT链和OUTPUT链
#2.放行INPUT链中RELATED,ESTABLISHED状态下的请求
#3.放行OUTOUT链中ESTABLISHED状态下的请求
#4.装载ip_nat_ftp模块和ip_conntrack_ftp模块
#放行ftp命令连接,包括INPUT链和OUTPUT链
iptables -I INPUT 1 -d 192.168.15.4 -p tcp --dport 21 -j ACCEPT
iptables -I OUTPUT 1 -s 192.168.15.4 -p tcp --sport 21 -j ACCEPT
#放行INPUT链中RELATED,ESTABLISHED状态下的请求
iptables -A INPUT -d 192.168.15.4 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
#放行OUTOUT链中ESTABLISHED状态下的请求
iptables -A OUTPUT -d 192.168.15.4 -p tcp -m state --state ESTABLISHED -j ACCEPT
#装载ip_nat_ftp模块和ip_conntrack_ftp模块
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
如果想在开机时自动装载该模块,可以把其配置到iptables的配置文件中
# vim /etc/sysconfig/iptables-config
#放行tftp服务
iptables -A INPUT -d 192.168.15.4 -p udp --dport 69 -j ACCEPT
iptables -A OUTPUT -s 192.168.15.4 -p udp --sport 69 -j ACCEPT
#放行dns服务
#客户端查询 UDP 53
#dns服务器之间域传输 TCP 53
#放行对本地主机的dns查询请求
iptables -A INPUT -d 192.168.15.4 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.15.4 -p udp --sport 53 -j ACCEPT
#放行本地dns服务器对上级服务器的递归查询
iptables -A INPUT -d 192.168.15.4 -p tcp --sport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.15.4 -p tcp --dport 53 -j ACCEPT
#放行本地主机对其他dns服务器的查询请求
iptables -A INPUT -d 192.168.15.4 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.15.4 -p udp --dport 53 -j ACCEPT
#放行其他dns服务器的递归查询请求
iptables -A INPUT -d 192.168.15.4 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.15.4 -p tcp --sport 53 -j ACCEPT
#限制本地主机的web服务器在周一不允许访问:新请求的速率不能超过100个每秒:web服务器包含了admin字符串的页面不允许访问:web服务器仅允许响应报文离开本机
iptables -A INPUT -d 192.168.15.4 -p tcp --dport 80 -m time --weekdays Mon -j DROP
iptables -A INPUT -m state --state NEW -m limit --limit 100/second --limit-burst 100 -j ACCEPT
iptables -I OUTPUT 1 -s 192.168.15.4 -p tcp --sport 80 -m string --algo kmp --string admin -j DROP
iptables -A OUTPUT -s 192.168.15.4 -p tcp --sport 80 -m state ESTABLISHED -j ACCEPT
#在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给192.168.0.0网络中的主机访问:数据下载请求的次数每分钟不得超过5个
iptables -A INPUT -d 192.168.15.4 -p tcp --dport 80 -m time --weekdays Mon -j DROP
iptables -A INPUT -s 192.168.0.0/16 -s 192.168.15.4 -p tcp --dport 21 -m time --weekdays WED,TUS,Mon,Tue,Wed,Thu,Fri --timestart 08:30 --timestop 18:00 -m limit --limit 5/second --limit-burst 5 -j ACCEPT
iptables -A OUTPUT -s 192.168.15.4 -d 192.168.0.0/16 -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -d 192.168.0.0/16 -d 192.168.15.4 -p tcp -m state RELATED,ESTABLISHED -j ACCEPT
iptables -I OUTPUT 1 -s 192.168.15.4 -d 192.168.0.0/16 -p tcp -m state -ESTABLISHED -j ACCEPT