-t table:指定选择执行哪个表的功能,可以选择的表包括:raw,mangle,nat及filter,如果省略此选项,则表示使用默认表——filter表;
-m matchname:通常是配置显式扩展的匹配条件时,必须书写;如果省略则表示要配置基本匹配条件或隐式扩展匹配条件;
-j targetname:指定所有匹配条件的数据包的处理动作;
-t table:
COMMAND
链:-P, -N, -E, -X, -F
规则:-A, -I, -D, -Z, -R, -L
COMMAND:
链的操作命令;
-P, --policy chain target
用于定义指定链的默认策略;通常有两种动作选择,即:ACCEPT和DROP;
-N, --new-chain chain
创建一条新的自定义的规则链;新建的链上的规则必须要被内建链上的规则调用才能生效;
-X, --delete-chain [chain]
删除被内建链调用次数为0的自定义链;
-E, --rename-chain old-chain new-chain
重命名被内建链调用次数为0的自定义链;
-F, --flush [chain]
清除指定链(表中所有链)上的规则;
规则的操作命令:
-A, --append chain rule-specification
在指定的链的末尾追加一条规则;
-D, --delete chain rule-specification
-D, --delete chain rulenum
从指定的链上删除一条规则,可以指明具体规则,也可以指明规则在链上的编号;
-I, --insert chain [rulenum] rule-specification
在指定的链上插入一条规则,默认是将新规则插入至链的第一条规则,也可以指定规则编号,是的插入的规则称为指定链上的第rulenum条规则;
-R, --replace chain rulenum rule-specification
用命令行中的规则替换指令链上的第rulenum条规则;并不是修改规则中某个具体条件,而是完全替换整条规则;
-L, --list [chain]
列表显示指定表指定链(所有链)上的所有规则;
可以使用的其他常用选项:
-v, --verbose:显示更详细格式的信息,还有-vv;
-n, --numeric:将规则中的所有信息都进行数字化显示;包括主机名和端口号等信息;
-x, --exact:精确的显示计数器的结果;
每个规则都有两个计数器:
1.规则所匹配的报文的个数;
2.规则所匹配的报文的字节总数;
--line-numbers:显示指定链上各个规则的编号;
其他的命令:
-Z, --zero [chain [rulenum]]
将指定链的规则计数器置0;
-m matchname:
-p {tcp|udp|ip|icmp}
multiport --dports --sports --ports
iprange
time
connlimit
limit
state
mac
string
显示扩展(multiport扩展、iprange扩展、string扩展、time扩展、state扩展、mac扩展、connlimit扩展、limit扩展)
1.multiport扩展:
一次性的写入多个离散端口或多组连续端口,最大的上限15组端口,每一个端口范围占用两个端口;
可以支持的协议:tcp, udp, udplite, dccp, sctp.
相关选项:
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
--dports 22,80,3306 -j ACCEPT
示例:
~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
~]# iptables -I FORWARD -d 192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
2.iprange扩展:
以连续的任意数量的IP地址访问作为匹配条件;
相关选项:
[!] --src-range from[-to]
[!] --dst-range from[-to]
-m iprange --src-range 192.168.100.1-192.168.100.100
示例:
~]# iptables -I FORWARD -m iprange --src-range 192.168.100.1-192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
~]# iptables -I FORWARD -m iprange --dst-range 192.168.100.1-192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
3.string扩展:
对数据报文中的应用层数据做字符串匹配检测;
相关选项:
--algo {bm|kmp}
--string "STRING"
示例:
~]# iptables -I FORWARD -s 172.16.69.2 -m string --algo bm --string "dafa" -j REJECT
4.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...]
定义每个月中各个天;取值1-31
[!] --weekdays day[,day...]
定义每个星期中的星期几;
取值:Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7, or Mo, Tu, etc.
示例:
~]# iptables -I FORWARD -m time --timestart 08:00:00 --timestop 17:59:59 ! --weekdays 6,7 -o eno16777736 -j REJECT
5.state扩展
连接状态检测;基于连接追踪机制实现;
conntrack
相关选项:
[!] --state state
iptables对连接状态的定义:
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED;
INVALID:无法识别的连接状态,无效的通信状态; SYN,FIN
ESTABLISHED:已经建立连接的状态;连接态;
NEW:尚未建立连接的状态;新连接态;
RELATED:与其他已经建立的连接有相互关联的连接状态;关联态或衍生态;
UNTRACKED:未追踪的状态;
内核中用于保存连接追踪状态数据的位置:/proc/net/nf_conntrack
能够被追踪到的最大的连接数:/proc/sys/net/nf_conntrack_max
注意:此处记录的最大连接数的数值,建议必要时可以调整其大小到足够大;
为了能够尽可能的高效利用内存资源,缓存的连接追踪的状态不能无限期保存,因此设置了相应的超时时间;
/proc/sys/net/netfilter/nf_conntrack*timeout*
利用连接追踪设置FTP服务器的访问控制:
~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
~]# iptables -A INPUT -d 172.16.69.2 -p tcp -m multiport --dports 21,22,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -A INPUT -j DROP
注意:需要装载nf_conntrack_ftp内核模块;
~]# modprobe nv_conntrack_ftp
设置nf_conntrack_ftp模块的自动装载:
设置/etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
利用连接追踪可以设置OUTPUT链上的通用规则:
~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -j DROP
6.mac扩展
实现mac地址匹配检测;用于PREROUTING, FORWARD or INPUT链;
相关选项
[!] --mac-source address
匹配源mac地址;其形式必须是:XX:XX:XX:XX:XX:XX
7.connlimit扩展:
根据每个客户端IP地址做并发连接数的匹配检测;
相关选项:
--connlimit-upto n
当客户端当前的并发连接数小于或等于n时,可以匹配此条件;此条件通常和ACCEPT动作配合使用;
--connlimit-above n
当客户端当前的并发连接数大于n时,可以匹配此条件;此条件通常和DROP或REJECT动作配合使用;
8.limit扩展:
基于服务器端收发数据报文的速率来进行匹配检测;
相关选项:
--limit rate[/second|/minute|/hour|/day]
服务器端最大单位时间内能够接收的报文速率;
--limit-burst number
初始时所能接收的数据报文的最大数量;
隐式扩展
-p {tcp|udp|icmp}
tcp: --sport, --dport, --tcp-flags, --syn
--syn === --tcp-flags SYN,RST,ACK,FIN SYN
udp:--sport, --dport
icmp:--icmp-type {echo-request(8) | echo-reply(0)}
tcp协议(tcp模块):
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
用于指定源端口和/或目标端口的匹配条件;每次只能指定一个端口或一组连续的端口范围,而不能指定离散端口;
[!] --tcp-flags mask comp
用于指定在TCP协议首部中各标志位的匹配条件;
URG, SYN, RST, PSH, ACK, FIN, ALL, NONE
mask:设定要检测的标志位的列表,各标志位之间使用","进行分隔;
comp:必须被置"1"的标志位列表,剩余的在mask列表中的标志位必须置"0";
[!] --syn
相当于:--tcp-flags SYN,RST,ACK,FIN SYN
udp协议(udp模块):
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
用于指定源端口和/或目标端口的匹配条件;每次只能指定一个端口或一组连续的端口范围,而不能指定离散端口;
icmp协议(icmp模块):
[!] --icmp-type {type[/code]|typename}
常用的icmp-type:
echo-request,代码为8;
echo-reply,代码为0;
-j targetname:指定所有匹配条件的数据包的处理动作;
ACCEPT
DROP
REJECT
SNAT --to-source ipaddr[:port]
MASQUERADE
DNAT --to-destination ipaddr[:port]
REDIRECT --to-ports port
LOG --log-level --log-prefix
RETURN
常用的TARGETS:
LOG:对于匹配的数据报文的流动情况进行日志记录,并不会影响数据报文本身的传输;
MARK:对于匹配的数据报文进行防火墙标记的设置;
MASQUERADE:源地址伪装,一种特殊的源IP地址转换;
REDIRECT:目标IP地址和端口的重定向;
REJECT:阻止数据报文传输并向数据报文的源头返回消息;
SNAT:源IP地址转换;
DNAT:目标IP地址转换;
ACCEPT:对于匹配的数据报文进行放行;
DROP:对于匹配的数据报文进行阻止;
RETURN:在规则链之间跳转
原文:http://blog.51cto.com/weidehong/2120432