我们知道IPTABLES是连接内核和用户空间,用于控制网络功能的一个工具,在iptalbes中真正起到防火墙功能的是一系列规则,那么怎样去编写这些规则?实现防火墙功能呢?

    IPTABLES基本使用格式:


iptables  [-t  TABLE]  COMMAND  CHAIN  [ num ]  匹配标准  -j  处理动作

    其中,TABLE为表名,COMMAND为命令,CHAIN 为链名,num为链号, -t  TABLE 是可以省略的,默认表是Filter。

    从上面的基本使用格式中,可以看到规则是由 匹配标准 和 处理动作 组成,要编写规则,就要了解熟悉各个选项。

 一、COMMAND命令:

管理规则的命令
-A:附加一条规则,添加在链的尾部
-I CHAIN [num]: 插入一条规则,插入为对应CHAIN上的第num条;
-D CHAIN [num]: 删除指定链中的第num条规则;
-R CHAIN [num]: 替换指定的规则;
管理链的命令:
-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
-P (大写policy)CHAIN: 设定指定链的默认策略;
-N:自定义一个新的空链
-X: 删除一个自定义的空链
-Z:置零指定链中所有规则的计数器;
-E: 重命名自定义的链;
查看类命令:
-L: 显示指定表中的规则;(默认会将主机IP地址反解为主机名,将端口号反解为服务名(会很慢))
-n: 以数字格式显示主机地址和端口号;
-v: 显示链及规则的详细信息
-vv: 
-x: 显示计数器的精确值
--line-numbers: 显示规则号码


二、匹配标准(条件):匹配标准又分为通用标准和扩展标准


通用匹配
-s, --src: 指定源地址  IP(指定地址), NET(指定网络)
-d, --dst:指定目标地址
-p (小写){tcp|udp|icmp}:指定协议 
-i  INTERFACE: 指定数据报文流入的接口
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o  INTERFACE: 指定数据报文流出的接口
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD


扩展匹配:
隐含扩展:
-p tcp
      --sport PORT[-PORT]: 源端口
      --dport PORT[-PORT]: 目标端口
      --tcp-flags mask comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
      --syn = --tcp-flags  SYN,FIN,ACK,RST  SYN (表示TCP三次握手的第一次)
-p icmp
      --icmp-type 
         0: echo-reply响应报文(本机ping进来的)
         8: echo-request请求报文(本机ping出去的)
-p udp
      --sport --dport
 
显式扩展: 使用额外的匹配机制
-m EXTESTION --spe-opt (-m指定扩展名称,而后指定这个扩展自己独有的选项) 
    -m state:状态扩展 结合ip_conntrack追踪会话的状态(不是TCP的状态)
             --state NEW: 新连接请求
                     ESTABLISHED:已建立的连接
                     INVALID:非法连接(例如SYN=1,FIN=1)
                     RELATED:相关联的(例如由命令连接激活的其他连接)设计ftp规则
    
例如:-m state --state  NEW,ESTABLISHED  -j ACCEPT
 
    -m multiport: 离散的多端口匹配扩展
            --source-ports
            --destination-ports  --ports
 
    -m  iprange  指定一段范围内的IP地址
            --src-range  ip-ip
            --dst-range  ip-ip
 
    -m connlimit: 连接数限制(限制特定IP地址的连接数)用于限定同一个客户端地址最多发起多少个请求 
         ! --connlimit-above n 连接数的上限(该选项一般取反,用于表示允许通过低于上限标准的报文)

    -m limit
           --limit RATE 限制响应速度
           --limit-burst  一批请求的最高峰值 (当一批请求进来时,前limit-burst个会被迅速响应)
    -m string  限定用户所访问内容中的字符串,屏蔽特殊的字符串 
           --algo {bm|kmp} 选择匹配算法
           --string "STRING"  支持正则表达式

注意:以上所有的条件都可以取反:!  例如 -s ! 172.16.100.6

 

三、动作(target)【-j 指定】:

ACCEPT:放行(允许报文通过)
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
SNAT:源地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装(主要用于NAT表的POSTROUTING链上实现源地址转换)
LOG:日志
MARK:给报文打标记
NOTRACK:用于raw表,对指定的报文不做任何追踪
 
LOG与其他的动作一起用时,一定放在其他动作的前面(避免报文被其他动作先行处理,而得不到记录)
--log-prefix  “string” 在记录日志时加上标志前缀信息

最后,如果对任何选项有疑问,都可以在linux下man iptables 查看帮助。(当然,前提是已经安装了iptables)