我们知道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)