iptables技能: 须要熟悉linux防火墙的表,链结构;理解数据包匹配的基本流程;会管理和设置iptbables规则;会使用防火墙脚本的通常方法。linux
linux防火墙功能是由内核实现的: 服务器
2.0版本中,包过滤机制是ipfw,管理工具是ipfwadm 网络
2.2版本中,包过滤机制是ipchain,管理工具是ipchainstcp
2.4之后的版本中,包过滤机制是netfilter,管理工具是iptables(本次介绍的就是iptables)ide
netfilter:工具
位于linux内核中的包过滤防火墙功能体系spa
称为linux防火墙的"内核态"rest
iptables:日志
位于/sbin/iptables,是用来管理防火墙的命令工具接口
为防火墙体系提供过滤规则和策略,决定如何过滤或处理到达防火墙主机的数据包(工做于TCP/IP的网络层)
称为linux防火墙的"用户态"
iptables的规则链,规则表结构
规则链:
规则的做用在于对举报进行过滤或处理,根据处理时机的不一样,各类规则被组织在不一样的链中
规则链是防火墙规则/策略的集合
默认的5种规则链:
INPUT 处理入站数据包
OUTPUT 处理出站数据包
FORWARD 处理转发数据包
POSTROUTING 在进行路由选择后处理数据包
PRERROUTING 在进行路由选择前处理数据包
规则表:
具备某一类类似类型的防火墙规则,按照不通的处理时机去分到不一样的规则链以后,被归置到不一样的表中
规则表是规则链的集合
默认的4张表:
raw 肯定是否对该数据包进行状态跟踪
managle 为数据包设置标记
nat表 修改数据包中的源,目标ip地址或者端口
filter 肯定是否放行该数据包(过滤)
数据包过滤匹配流程
规则表的优先顺序
raw --> managle --> nat --> filter
规则链间的匹配顺序
入站数据 PREROUTING --> INPUT
出站数据 OUTPUT --> POSTROUTING
转发数据 PREROUTING --> FORWARD --> POSTROUTING
规则链内的匹配顺序
按顺序依次进行检查,找到相匹配的规则即中止(log策略除外)
若找不到的匹配的规则,则按照默认策略处理
入站数据流:
来自外界的数据包到达防火墙 -->被PREROUTING处理(确认是须要修改数据包地址等)--->路由选择(判断数据包应该发往何处)---> 若是目标地址是防火墙自己,那么内核将其传递给INPUT链进行处理(决定是否经过)---> 经过之后则交给上层应用程序处理
转发数据流:
来自外界的数据包到达防火墙 -->被PREROUTING处理(确认是须要修改数据包地址等)--->路由选择(判断数据包应该发往何处)---> 若是目标地址是其余外部地址,那么内核将其传递给FORWARD链进行处理(是否转发或者拦截)---> 而后在交给POSTROUTING链(是否修改数据包地址等)进行处理
出站数据流:
防火墙本机向外部地址发送数据包--->先被OUTPUT链规则处理(是否放行)---> 路由选择 --->而后传递给POSTROUTING(是否修改数据包的地址等)进行处理
管理和设置iptables规则
iptables 命令的语法格式
iptables [-t 表名] 管理选项 [链名] [条件批匹配] [-j 目标动做或者跳转]
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动做
几个注意事项
不指定表名时,默认是的表是filter
不指定链名时,默认时该表内全部的链
除非设置规则链的缺省策略,不然都须要指定匹配条件
iptables命令的管理选项
-t<表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:建立新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-d<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
设置规则内容
iptables -t filter -A INPUT -p tcp -j ACCEPT 在input表末尾添加一条规则
iptables -I INPUT -p udp -j ACCETP 插入到input表第一行,原来第一行变为的第二行
iptables -I INPUT 2 -p icmp -j ACCEPT 插入到input表第二行,原来的第二行变为的第三行 iptables -P INPUT DROP 设置默认input表规则为DROP
iptables -L INPUT --line-number 显示input表规则以及行数
清除规则
iptables -D INPUT 2 清除INPUT第二条规则
设置匹配数据包的条件
通用条件匹配
可直接使用,不依赖其余的条件或者扩展模块
包括网络协议,ip地址,网络接口等匹配方式
隐含条件匹配
通常须要以特定的协议匹配做为前提
包括端口,tcp标记,icmp类型等匹配方式
显式条件匹配
须要使用"-m 扩展模块" 的形式明确指定匹配方式
包括多端口,mac地址,ip地址范围,数据包状态等匹配方式
eg.通用条件匹配
协议匹配
使用"-p 协议名"的形式
协议名可以使用在/etc/protocols 文件中定义的名称
经常使用协议有 tcp udp icmp
地址匹配
使用"-s 源地址","-d 目标地址" 的形式
iptables -I INPUT -p icmp -j REJECT 拒绝icmp协议
iptables -A FORWARD ! -p icmp -j ACCEPT 容许非icmp协议的转发
iptables -A FORWARD -s 192.168.1.11 -j REJECT 禁止转发来源地址是192.168.1.11的数据
iptables -A FORWARD -s 192.168.0.0/20 -j ACCEPT 容许192.168.0.0/20网段数据转发
iptables -A INPUT -i eth1 -s 192.168.0.0/20 -j DROP 丢弃192.168.0.0/20经过eth1访问的数据包
iptables -I FORWARD -o eth1 -d 192.168.3.114 -j DROP
iptables -I FORWARD -i eth1 -s 192.168.3.114 -j DROP
# 封堵网段2小时
iptables -I INPUT -s 172.16.10.0/24 -j DROP
iptables -I FORWARD -s 172.16.10.0/24 -j DROP
echo "iptables -D INPUT 1" >> /root/deliptables
echo "iptables -D FORWARD 1 " >> /etc/deliptables
at now +2 hours -f /etc/deliptables
eg. 隐含条件匹配
端口匹配
使用"--sport 源端口", "--dport 目标端口"的形式
采用 "端口1:端口2"的形式能够指定一个范围的端口
TCP标记匹配
使用 "--tcp-flaqs检测范围,被设置的的标记"的形式
1.只容许的192.168.3.114经过22端口
iptables -A INPUT -p tcp --dport 22 -s 192.168.3.114 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
2.防止tcp泛洪***
iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
3.禁ping(不容许别人ping,容许本身能够ping)
iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP # 拒绝ping请求也能够使用数据8
iptables -I INPUT -p icmp --icmp-type Echo-Reonly -j ACCEPT # 容许ping应答也能够使用数字0
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT #暂时不知道是什么鬼。等有时间研究下
4.开放服务器10000端口到10010端口
iptables -A INPUT -p tcp --dport 10000:10010 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 10000:10010 -j ACCEPT
eg. 显式条件匹配
mac地址匹配
使用"-m mac" 结合 "--mac-source mac地址"的形式
多端口匹配
使用"-m multiport" 结合 "--sports 源端口列表" 或者的是"--dports 目标端口列表"的形式
多个端口之间使用逗号","分隔,连续的端口使用冒号":"
1. 禁止转发来自mac地址为00:0C:BA:25:34:3B的主机的数据包
iptables -A FORWARD -m mac --mac-source 00:0C:BA:25:34:3B -j DROP
2. 开放防火墙本机的TCP端口:22,23,25,110,10000-10010
iptables -A INPUT -p tcp -m multiport --dports 22,23,25,110,10000:10010 -j ACCEPT
3.禁止转发源ip地址为192.168.3.100-192.168.3.110的tcp数据包
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.3.100-192.168.3.110 -j DROP
4.禁止转发与正常tcp链接无关的非--syn的包
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
5.拒绝访问主机的新数据包,可是容许访问已经创建链接的相关数据包
iptables -A INPUT -m state --state NEW -p tcp -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
数据包控制
常见的数据包处理方法(后面会详细说明这个)
ACCEPT 放行数据包
DROP 丢弃数据包
REJECT 拒绝数据包
LOG 记录日志,并传递给下一个规则处理
用户自定义的链名 传递给自定义的链内的规则处理
导入,导出防火墙规则
导出规则
iptables-save
结合重定向输出">"符号保存规则信息
导入规则
iptables-restore
结合重定向输入"<"符号恢复规则信息
iptables-save > /etc/sysconfig/iptables
iptables-save < /etc/sysconfig/iptables