iptables的用法
基本用法:
iptables [-t table] [subcommand] chain [rulenum] [options...] [match] [target]
iptables [-t 表名] <-A|-I|-D|-R> 链名 [规则编号][-i|o 网卡名称][-p 协议类型][-s 源ip地址][源子网][--sport 源端口号][-d 目标ip地址|目标子网][--dport 目标端口号][-j 处理动作]
详细用法说明:
1)table
filter:一般的过滤功能,包含input,forward,output。默认选项
nat:用于地址转换、映射、端口映射等,包含prerouting,postrouting
mangle:用于对特定数据包的修改,包含prerouting,output,forward,input,postrouting
raw:一般是为了不再让iptables做数据包的连接跟踪处理,从而提供性能,包含prerouting,output
2)subcommand选项
1》链管理
-N :new, 自定义一条新的规则链
-X :delete ,删除自定义的空的规则链
-P :Policy ,设置默认策略;对filter 表中的链而言,其默认策略有:ACCEPT :接受,DROP :丢弃
-E :重命名自定义链;引用计数不为0 的自定义链不能够被重命名,也不能被删除
2》查看:
-L :list, 列出指定鏈上的所有规则,本选项须置后
-n :numberic ,以数字格式显示地址和端口号
-v :verbose ,详细信息
-vv:更详细
-x :exactly ,显示计数器结果的精确值, 而非单位转换后的易读值
--line-numbers :显示规则的序号
-S :selected, 以iptables-save命令格式显示链上规则
常用组合:
--vnL
--vvnxL --line-numbers
3》规则管理:
-A :append,追加
-I :insert,插入,要指明插入的规则编号,默认为第一条。
-D :delete,删除。(1)指明规则序号,(2)指明规则本身
-R :replace ,替换指定链上的指定规则编号
-F :flush ,清空指定的规则链
-Z :zero ,置零
iptables 的每条规则都有两个计数器
(1)匹配到的报文的个数
(2)匹配到的所有报文的大小之和
3)链chain:
INPUT:通过路由表判断后目的地是本机,然后进入本机内部资源
OUTPUT:有本机产生的数据向外部转发
FORWARD:通过路由表判断后目的地不是本机,然后通过路由转发到其他地方
PREROUTING:流入的数据包进入路由表之前
POSTROUTING:传出的数据包到达网卡出口之前
4)match,匹配条件
基本:通用的,parameters
扩展:需加载模块,match extentions
1》基本匹配条件:
无需加载模块,由iptables/netfilter 自行提供
[!] -s, --source address[/mask][,...] :源IP 地址或范围
[!] -d, --destination address[/mask][,...] :目标IP 地址或范围
[!] -p, --protocol protocol :指定协议,可使用数字如0(all),protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp,mh or “all“ 参看:/etc/protocols
[!] -i, --in-interface name :报文流入的接口;只能应用于数据报文流入环节,只应用于 INPUT 、FORWARD 、PREROUTING 链
[!] -o, --out-interface name :报文流出的接口;只能应用于数据报文流出的环节,只应用于 FORWARD 、OUTPUT 、 POSTROUTING 链
2》扩展匹配条件:
需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效,是对某一种功能的扩展,经由扩展模块引入的匹配机制。
查看帮助:man iptables-extensions
1>隐式扩展 :对某一种协议的扩展
在使用-p 选项指明了特定的协议时,无需再用-m 选项指明扩展模块的扩展机制,不需要手动加载扩展模块。
-p做协议匹配,协议有:tcp,udp,icmp,icmpv6,ah,esp,sctp,mh,all
1.tcp 协议,-m tcp,扩展选项
[!] --source-port, --sport port[:port] :匹配报文tcp首部源端口,可为端口范围
[!] --destination-port,--dport port[:port] :匹配报文目标端口,可为范围
[!] --tcp-flags mask comp:mask需检查的标志位列表,用逗号分隔,如 SYN,ACK,FIN,RST,PSH,URG,ALL,NONE.comp在mask列表中必须为1的标志位列表,无指定则必须为0,用逗号分割
[!] --syn :用于匹配第一次握手。相当于:--tcp-flags SYN,ACK,FIN,RST,SYN
2.udp 协议,-m udp,扩展选项
[!] --source-port, --sport port[:port] :匹配报文udp首部的源端口;可以是端口范围
[!] --destination-port,--dport port[:port] :匹配报文udp首部的目标端口;可以是端口范围
3.icmp
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。)
-m icmp:专有选项
[!] --icmp-type {type[/code]|typename}:type/code为 0/0 echo-reply表示icmp 应答,type/code为8/0 echo-request表示icmp 请求
2>显式扩展 :
额外附加的更多的匹配规则,功能性扩展
必须使用-m 选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块,即[-m matchname [per-match-options]
-m 模块名称
每个模块会引入新的匹配机制
可以通过rpm -ql iptables 来获得那些模块可用,模块是以.so结尾的。
使用帮助:
man iptables (centos6)
man iptables-extensions(centos7)
1. multiport扩展
以离散方式定义多端口匹配, 最多指定15 个端口
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口
[!] --ports port[,port|,port:port]...:多个非连续的源或目标端口
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
2. iprange扩展
指明连续的(但一般不是整个网络)ip 地址范围
[!] --src-range from[-to]:源IP 地址范围
[!] --dst-range from[-to]:目标IP 地址范围
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
3. mac 扩展
指明源MAC 地址
适用于:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:
iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
iptables -A INPUT -s 172.16.0.100 -j REJECT
4. string 扩展
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} :字符串匹配检测算法,bm :Boyer-Moore,kmp :Knuth-Pratt-Morris
--from offset :开始偏移
--to offset :结束偏移
[!] --string pattern :要检测的字符串模式
[!] --hex-string pattern :要检测字符串模式,16 进制格式
示例:
iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
5. time扩展
根据将报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:开始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:停止日期
--timestart hh:mm[:ss]:开始时间
--timestop hh:mm[:ss]:停止时间
[!] --monthdays day[,day...]:每个月的几号
[!] --weekdays day[,day...]:星期几
--kerneltz :内核时区,不建议使用,CentOS7 系统默认为UTC
注意:centos6 不支持kerneltz,--localtz 指定本地时区( 默认)
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
6. connlimit 扩展
根据每客户端IP 做并发连接数数量限制,即每个客户端最多可同时发起的连接数量,通常分别与默认的拒绝或允许策略配合使用,可防止CC(Challenge Collapsar 挑战黑洞) 攻击
--connlimit-upto n :匹配,限定并发连接数的上限
--connlimit-above n :匹配,限定并发连接数的下限
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
7. limit扩展
基于收发报文的速率做匹配,使用令牌桶过滤器
--limit rate[/second|/minute|/hour|/day]:数率限定
--limit-burst number:突发数率限定
示例:
iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
8. state 扩展
状态检测扩展,根据“连接追踪机制”去检查连接的状态,较耗资源。
追踪本机上的请求和响应之间的关系,状态有如下几种:
NEW :新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED :NEW 状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED :新发起的但与已有连接相关联的连接,如:ftp 协议中的数据连接与命令连接之间的关系
INVALID :无效的连接,如flag 标记不正确
UNTRACKED :未进行追踪的连接,如raw
[!] --state:state就是NEW等状态
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
1>
以上连接追踪功能内核会在内存中开辟一段专用的空间用于存储连接的状态等,由于此段内存空间是有限的,因此就必须对连接追踪功能进行一些调整限制。
有关的内核参数由以下提供:
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max
不同的协议的连接追踪时长
/proc/sys/net/netfilter/
注意:CentOS7 需要加载模块: modprobe nf_conntrack
2>
iptables 的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max ,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时
解决方法两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout 时间
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
iptables -t nat -L -n
3>
开放被动模式的ftp服务
(1)装载ftp 连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=" nf_conntrack_ftp "
modproble nf_conntrack_ftp
(2)放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
iptables –I INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
(3)放行响应报文:
iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
5)terget,处理动作
-j targetname [per-target-options]:跳转目标
简单:
ACCEPT :接受
DROP :丢弃
扩展:
REJECT :明确拒绝,默认
RETURN :返回调用链
REDIRECT :端口重定向
LOG :记录日志,dmesg
MARK :做防火墙标记
DNAT :目标地址转换
SNAT :源地址转换
MASQUERADE :地址伪装
...
自定义链:
LOG:非中断target, 本身不拒绝和允许, 放在拒绝和允许规则前并将日志记录在/var/log/messages 系统日志中
--log-level level:级别有emerg, alert, crit, error,warning, notice, info or debug
--log-prefix prefix:日志前缀,用于区别不同的日志,最多29个字符。
示例:
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multimport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: