1.规则的编写格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]
-t table:
默认为filter;其它可用的有raw, mangle, nat;
COMMAND:
(1)链:
-P:policy,策略,定义默认策略; 一般有两种选择,ACCEPT和DROP;
-N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效;[-j chain_name];
-X:drop,删除自定义的引用计数为0的空链;
-F:flush,清空指定的链;
-E:重命名自定义的引用计数和为0的链;
(2)规则:
-A:append,追加,在指定链的尾部追加一条规则;
-I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;
-D:delelte,删除,删除指定的规则;
-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全 替换;
(3)查看:
-L:list,列出表中的链上的规则;
-n:numeric,以数值格式显示;
-v:verbose,显示详细格式信息;
-vv, -vvv:更加详细;
-x:exactly,计数器的精确结果;
--line-numbers:显示链中的规则编号;
(4)计数器:
-Z:zero,置0;
chain:
(1) 内建链;
(2) 自定义链;
匹配条件:多重条件逻辑关系为“与”;
(1)基本匹配条件:
① -s,[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
② -d,[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
③ -p :protocol:{tcp|udp|icmp}
④ -i :数据报文的流入接口;INPUT, FORWARD and PREROUTING
⑤ -o :数据报文的流出接口; FORWARD, OUTPUT and POSTROUTING
(2)扩展匹配条件
①隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;
-p tcp:隐含了-m tcp;
a.--source-port,--sport port[:port]:匹配报文中传输层的源端口;
b.--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
c.--tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔;
comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;
d.--syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隐含了-m udp:
a.--source-port,--sport port[:port]:匹配报文中传输层的源端口;
b.--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
-p icmp:隐含了-m icmp:
a.--icmp-type {type[/code]|typename}
8:echo-request
0:echo-reply
②显式扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;
multiport扩展:以离散或连续的方式定义多端口匹配条件;
a.--source-ports,--sports port[,port|,port:port]...:指定多个源端口;
b.--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
c.--ports port[,port|,port:port]...:指定多个端口;
iprange扩展:以连续的ip地址范围指明连续的多地址匹配条件;
a.--src-range from[-to]:源IP地址;
b.--dst-range from[-to]:目标IP地址;
string扩展:对报文中的应用层数据做字符串匹配检测;
a.--string pattern:要检测字符串模式;
b.--hex-string pattern:要检测的字符串模式,16进制编码;
c.--algo {bm|kmp}
time扩展:根据报文到达的时间与指定的时间范围进行匹配度检测;
a.--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
b.--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
c.--timestart hh:mm[:ss]
d.--timestop hh:mm[:ss]
e.--monthdays day[,day...]
f.--weekdays day[,day...]
示例:~]# iptables -I INPUT -d 172.16.100.67 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT
connlimit扩展:根据每客户端IP做并发连接数匹配;
a.--connlimit-upto n:连接数数量小于等于n,此时应该允许;
b.--connlimit-above n:连接数数量大于n,此时应该拒绝;
示例:~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
limit扩展:基于收发报文的速率进行匹配;
a. --limit rate[/second|/minute|/hour|/day]:平均速率
b.--limit-burst number:峰值速率
state扩展:状态检测;连接追踪机制(conntrack);
a. --state STATE
INVALID:无法识别的状态;
ESTABLISHED:已建立的连接;
NEW:新连接;
RELATED:相关联的连接;
UNTRACKED:未追踪的连接;
tips:追踪到的连接:/proc/net/nf_conntrack文件中;能追踪的最大连接数量定义在/proc/sys/net/nf_conntrack_max;此值可自行定义,建议必要时调整到足够大;不同的协议的连接追踪的时长:/proc/sys/net/netfilter/
示例:如何开放被模式的ftp服务:
(1) 装载追踪ftp协议的模块;
# modprobe nf_conntrack_ftp
(2) 放行命令连接
~] # iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -j ACCEPT
~] # iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW -j ACCEPT
(3) 放行数据连接
~] iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT
处理动作(目标)
-j targetname [per-target-options]
argetname:
ACCEPT:接受;
DROP:丢弃;
REJECT:拒绝;
2.保存和重载规则:
CentOS 7:
iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/FROM/SOME_RULE_FILE
CentOS 6:
保存规则:
service iptables save 自动保存规则至/etc/sysconfig/iptables文件中;
重载规则:
server iptables restore 从/etc/sysconfig/iptables文件中重载规则;
3.iptables规则优化:
(1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
(2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;
(3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;
(4) 设置默认策略;
(a) 最后一条规则设定;
(b) 默认策略设定;