一 前言
防火墙是一种位于内部网络与外部网络之间的网络安全系统,可以是硬件也可以是软件。
防火墙一般分为工作在网络层的网络防火墙和工作在应用层的应用网关(代理网关)。
二 iptables工作原理
主机处理数据包的过程:当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。
iptables在数据包经过内核的过程中有五个钩子函数,PREROUTING(路由前),INPUT(数据包进入),OUTPUT(数据包流出),FORWARD(转发),POSTROUTING(路由后)。iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理。
iptables中的表,分别表示提供的功能:filter表(实现包过滤),nat表(实现网络地址转换),mangle表(实现包修改),raw表(实现数据跟踪)
filter在3个链上设置规则:INPUT ,FORWARD ,OUTPUT;nat也只能在3个链上设置规则:PREROUTING ,OUTPUT ,POSTROUTING;而mangle5个链都可以设置规则:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
Created with Raphaël 2.1.0 数据包进入 mangle PREROUTING nat PREROUTING 数据包转发 mangle FORWARD filter FORWARD mangle POSTOUTING nat POSTOUTING 数据包传出 mangle INPUT filter INPUT 本机资源 路由判断 mangle OUTPUT nat OUTPUT filter OUTPUT yes no yes
三 iptables格式
基本语法:iptables [-t 表] [操作命令] [链][规则匹配器][-j 目标动作]
- 操作命令
参数 | 作用 |
-t 表 | 针对某表,默认filter |
-L 链名 | 显示链的配置 |
-F [链名] | 刷新(删除)所选链(不指定为所有链) |
-N 链名 | 创建新链 |
-Z [链名[行数]] | 将所有链中的分组和字节计数器归零,或仅归零给定链,或只有链中的给定规则 |
-X [链名] | 删除用户定义的链,链必须为空 |
-E [新链名] [旧链名] | 修改链的名字 |
-v | 详细信息 |
-n | 不进行IP和HOSTNAME反查 |
#显示nat的规则,同时不进行IP和HOSTNAME反查
iptables -t nat -L -n
#在filter表上创建一个新链,叫oldLink
iptables -t filter -N oldLink
#filter表上oldLink链名修改为newLink
iptables -E newLink oldLink
#清除filter表所有规则
iptables -F -X -Z
- 默认策略
防火墙有白名单和黑名单2种过滤方式,这里只介绍下白名单。白名单就是拒绝多数,允许少数
参数 | 作用 |
-P [链名] [目标动作] | 给指定链(只能是内置链)设置默认指定动作 |
常用动作有3种:ACCEPT(接受),DROP(丢弃),LOG(记录到日志中)
#iptables filter表白名单的定义:
# 1. 进来的数据包全部拒绝
# 2. 出去的包全部允许通过
# 3. 转发的包也允许通过
ipatbles -P INPUT DROP
ipatbles -P OUTPUT ACCEPT
ipatbles -P FORWARD ACCEPT
- 规则制定
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前。检查规则的时候,是按照从上往下的方式进行检查的,只要满足条件就不进行匹配了,执行对应的动作,所有在写防火墙时应格外注意,反正出现匹配漏洞
参数 | 作用 |
-A 链名 规则 | 在指定链尾部添加规则 |
-I 链名 [行号] 规则 | 在指定行数下进行插入,默认是1 |
-i 网卡名 | 指定数据包进来的网卡,在-A INPUT中用 |
-o 网卡名 | 指定数据包出去的网卡,在-A OUTPUT中用 |
-p 协议名 | 指定针对的协议名,all为所有协议.!参数在协议反转测试之前 |
–sport 端口号[:端口] | 数据包来源的端口[-端口] |
–dport 端口号[:端口] | 数据包要访问的端口[-端口] |
-s 地址[掩码] | 数据来源地址,可以是主机名,但会被DNS检测 |
-d 地址[掩码] | 数据目的地址 |
-j 目标动作 | 有ACCEPT,DROP,REJECT,LOG或用户定义的链 |
#环回口的包允许通过
iptables -A INPUT -i lo -j ACCEPT
#允许来自内网192.168.60.0/24所有主机的数据包通过eth0
iptables -A INPUT -i eth0 -s 192.168.60.0/24 -j ACCEPT
#拒绝192.168.80.0/24网段的主机发送给192.168.60.0/24
iptables -A INPUT -i eth0 -s 192.168.80.0/24 -d 192.168.60.0/24 -j DROP
#禁止192.168.80.0/24访问本机80到100端口
iptables -A INPUT -i eth0 -s 192.168.80.0/24 -p tcp --dport 80:100 -j DORP
想一想: 禁止192.168.90.3访问本机80端口,允许192.168.90.0/24访问本机,谢谢能不能写的顺序变换下
- 操作规则其他命令
参数 | 作用 |
-C 链名 规则 | 检测链的配置规则是否规范 |
-D 链名 [规则|行号] | 删除配置的规则 |
-R 链名 行号 规则 | 替换指定行数的规则 |
#删除nat表INPUT链第3个规则
iptables -t nat -D INPUT 3
- 扩展模块
参数 | 作用 |
-m 模块名 | 使用iptables的扩展功能 |
扩展模块有:state(连接状态),ttl(数据包的生成时间),time(特定时间),mac(物理地址),limit(限制),multport(离散的多端口)等等
1. state
后面接长选项: --state 状态
状态有以下4种:
INVALID: 无效的数据包,例如数据破损的数据包
ESTABLISHED:已经连接成功的连接状态
NEW:想要新建立连接的数据包状态
RELATED:数据包是与主机发送出去的数据包有关
#已建立连接或已发送请求有关的数据包就允许通过,非法的数据包丢弃
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
2. ttl
此模块后面有3种可选的长选项:
--ttl-eq value: 匹配数据包的生成周期等于value的数据包
--ttl-gt value: 匹配数据包的生成周期大于value的数据包
--ttl-lt value: 匹配数据包的生成周期小于value的数据包
#数据包的生成周期小于30就记录
iptables -A INPUT -i eth0 -m ttl --ttl-lt 30 -j LOG
3. time
--monthdays day1[,day2...]: 匹配每个月特定几天
--timestart hh:mm:ss: 指定每天几点开始匹配
--timestop hh:mm:ss: 指定每天几点结束匹配
--weekdays day1[,day2..]: 指定每星期哪些工作日匹配
#如每天早上9点到下午5点拒绝数据包通过
iptables -A INPUT -p all -m time --timestart 09:00:00 --timestop 17:00:00 -j DROP
4. mac
--mac-source mac地址: 匹配源mac地址
--mac-destination mac地址: 匹配目的mac地址
#拒绝广播包通过
iptables -A INPUT -m mac --mac-destination ff:ff:ff:ff:ff:ff -j DROP
5. limit
--limit-burst 包的数量: 指定数据包最大通过量,每过一个减1;当为0时,数据包将无法通过
--limit 数量/时间单位:每隔一段时间包池+1
#一开始能匹配的数据包数量为15个,每匹配到一个,limit-burst的值减1,所以匹配到15个时,该值为0,以后每过12s,limit-burst的值会加1,又能允许1个数据包通过
ipatbles -A INPUT -m limit --limit 5/m --limit-burst 15 -j ACCEPT
6. multport
--sports port1[,port2...]: 匹配源端口
--dports port1[,port2...]: 匹配目的端口
--ports port1[,port2...]:匹配源端口或目的端口
除已上这些模块外,iptables还有想多扩展的模块,有兴趣的可以去搜搜
- 针对协议的详细过滤选项
iptables还提供了很多针对某种协议的详细过滤选项,下面来稍稍介绍下tcp和icmp这2中协议的一些额外选项
icmp有个长选项–icmp-type可以让我们匹配特定类型的icmp包
如: -p icmp –icmp-type 8 -j ACCEPT 就能让ICMP数据包类型是8的通过
tcp有–tcp-flags这个长选项,可以匹配某种标记的tcp数据包 - DAT的配置
路由时只检查数据包的目的ip地址,所以必须在路由之前就进行目的PREROUTING DNAT
-j DNAT –to [IP范围[:端口]]: 重写包的目的IP地址
-j SNAT –to [IP范围[:端口]] : 重写包的源IP地址
-j MASQUERADE: 用于外网口是动态获取的IP地址
#把数据包到200.10.0.3:21转换成192.168.60.253
iptables -t nat -A PREROUTING -d 200.10.0.3 -p tcp --dport 21 -j DNAT --to 192.168.60.253
DAT地址转换就简单带过,除了地址转换还能进行地址映射。iptables还有个mangle表,但这个表用的不多,就不做介绍,大家可以进行谷歌或者去看iptables手册