iptables 防火墙
功能:在网络边缘根据我们所定义的一些规则来对数据包进行过滤的
防火墙的类型:
1 包过滤型防火墙 基于3层过滤(网络层、传输层、数据链路层)
2 应用代理服务器防火墙(或着是应用级防火墙)7层过滤(OSI7层过滤)
3 1,2的混合型防火墙
1: 数据包过滤型防火墙
基于源ip、目标IP,端口,协议来过滤,一般在公司中用路由器来做
这样的防火墙。
2: 代理服务器防火墙
是工作在OSI的最高层,一般在公司内网和和外网之间是有一个代理服务器,外网的
用户想访问内网,代理服务器会先接到请求,然后检查其合法性,如果合法,代理服务器会代理
用户来访问内网,最终将数据返回给外网用户,有日志记录的功能,为管理员提供监控的功能
一般来说我们的防火墙都是硬件或者是软件来组成的!,但是这里我们主要讲的是
软件的防火墙。不过要记住我们的所有种类的防火墙都是由两段部分组成的,一部分用来定义访问
规则,这一部分是工作在用户空间,也就是用户是可以直接操作,看的见的,而一部分是用来在内
核中进行包过滤,这一部分是工作在内核中,计算机操作者不可见。
linux ipstables history:
kernel 2.0的时候 包过滤是ipfw(在内核中),工具是ipfwadm(在用户空间)
不过这个时候,我们重新定义防火墙的时候,必须要重新启动才能够生效,因为我们的内核在这个
版本的时候,在用户空间中定义的一些规则是无法直接进入内核空间使用的。
kernel 2.2,包过滤机制是ipchain(内核中) 定义规则:ipchains(用户空间中)
kernel 2.4, 包过滤机制是内核的netfilter(内核空间) 定义规则:iptables,(用户空间) 在这
种版本之后,因为我们的kernel有类似/proc /sys这样的伪文件机制,使得iptables可以和我们用户空间
和内核空间可以直接通信,在linux中类似/proc伪目录在iptables中内核管理、检测包的口的应用接口有:
1.input 2.output 3.forward 4.postrouting 5.prerouting
我们刚才提到的5种接口其实就是一些规则链:
规则链
规则的作用在于对数据包进行过滤或处理,根据处理时机的不同,各种规则被组织在不同的“链”中
规则链是防火墙规则/策略的集合
默认的5种规则链
INPUT:处理入站数据包,进入代理服务器
OUTPUT:处理出站数据包,从代理服务器中出来
FORWARD:处理转发数据包,也就是说这些数据包不需要进入我们的代理服务器内部,直接被转发
POSTROUTING链:在进行路由选择后处理数据包
PREROUTING链:在进行路由选择前处理数据包,无论数据包是否进入代理服务器内部,还是直接转发
都要先进行这条链的匹配
规则表
具有某一类相似用途的防火墙规则,按照不同处理时机区分到不同的规则链以后,被归置到不同的“表”中
规则表是规则链的集合
默认4种规则表
raw表:debug测试,确认是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中源地址和目标ip地址或端口,这是我们要学的重点,在nat表中定义的有
prerouting\postrouting\output 等链
filer表:对数据包进行过滤,准许什么数据包通过,不许什么数据包通过,并且这个规则表也是默认的
这也是重点 在filter中 有INPUT FORWARD OUTPUT等链
我们linux上的防火墙是分为两段的:
1.一段是工作在内核空间,是进行包过滤的,因为我们的tcp/ip是工作在内核中的,一般来说tcp/ip协议
在进如内核空间起作用之前,网卡硬件识别、网卡驱动的加载、网络功能的启用、检查路由表、检查数据包
进行包合法检验,等都是在内核中提前或在工作中完成的!由netfilter完成。
2.一段是在用户空间,我们在这里定义规则,使用iptables工具来定义,注意我们只有通过上面所讲到的
几个接口才可以实现iptables在用户空间定义的规则在内核空间中直接使用!
规则表,及其间的优先顺序
raw mangle nat(转换) filter(过滤)
nat 地址转换
源地址转换:从内网----->外网
目标地址转换:从外网---->内网
规则链间的匹配顺序
入站数据:PREROUTING、INPUT
出站数据:OUTPUT、POSTROUTING
转发数据:PREROUTING、FORWARD、POSTROUTING
规则链内的匹配顺序
按顺序依次进行检查,找到相匹配的规则即停止(LOG策略会有例外)
若在该链内找不到相匹配的规则,则按该链的默认策略处理,同时我们还可以自定义链,自定义的链必须
与默认5条链挂钩使用的
策略的方式:
“通”:对一些的地址进行阻截,而其他的地址可进
“堵”:对一部分地址准许进入,而其他的地址不可进
规则的匹配的顺序:
自上而下的匹配,匹配到的立刻停止,没有匹配到的直至最后的默认规则
一般来说我们通常是小的写在前,大范围写在后!
iptables的语法概述:
iptables [-t table] [链管理命令] <要操作的链> [匹配条件] [-j 匹配到以后的动作]
iptables
-t 指定要操作的表 (raw mangle nat filter),默认是使用filter表
链管理命令
-P 设定某个链的默认规则 iptables -P INPUT DROP 不过注意只有数据包没有被规则表中的任何规则
匹配到的时候时,才会按此默认规则处理!
-F 清空连 iptables -F INPUT 清空 filter 表 INPUT 链中的所有规则
]#iptables -t nat -F PREROUTING 清空 nat 表 PREROUTING 链中的所有规则
注意:
1、-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则
2、-P 设置了 DROP 后,使用 -F 一定要小心!!!
3、如果不写链名,默认清空某表里所有链里的所有规则
-N 创建新的连 iptables -N myfilter
-Z 清除计数器
-X 删除指定用户自定以的链,但是这个链必须没有被引用
-Z 清除计数器
规则管理命令
-A 新增规则 新增的规则是放在最后的 ]#iptables -t filter -A INPUT -j DROP 在 filter 表的 INPUT
链里追加一条规则,匹配所有访问本机 IP 的数据包,匹配到的丢弃
-I 插入规则 如果不指定,默认是插入在第一条上,
]#iptables -I INPUT 3 -j DROP ,在 filter 表的 INPUT 链里插入一条规则(插入成第 3 条)
注意: 1、-t filter 可不写,不写则自动默认是 filter 表
2、-I 链名 [规则号码],如果不写规则号码,则默认是 1
3、确保规则号码 ≤ (已有规则数 + 1),否则报错
-D 删除规则
iptables -D INPUT 3(按号码匹配) 删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)
iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配)
删除 filter 表 INPUT 链中内容为“-s 192.168.0.1 -j DROP”的规则(不管其位置在哪里)
注意:
1、若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
2、按号码匹配删除时,确保规则号码 ≤ 已有规则数,否则报错
3、按内容匹配删除时,确保规则存在,否则报错
-R 修改规则
iptables -R INPUT 3 -j ACCEPT 将原来编号为 3 的规则内容替换为“-j ACCEPT”
注意:
确保规则号码 ≤ 已有规则数,否则报错
-L 查看规则
iptables -L -n -v --line-numbers
-v显示详细的信息
-n显示端口或ip地址
-L 显示规则
--line-numbers 显示规则的序列号码
匹配规则:
来源、目的地址(-s、-d) 可以是 IP、NET、DOMAIN,也可空(任何地址)
iptables -t filter -A INPUT -S 192.168.1.1 -j ACCEPT
iptables -t filter -A INPUT -d www.abc.com -j ACCEPT
协议类型 (-p)可以是 TCP、UDP、ICMP 等,也可为空
-p tcp
-p udp
-p icmp --icmp-type 类型
-p --tcp-flags SYN,ACK,FIN,PSH,RST,URG
iptables -t filter -A INPUT -P tcp -j ACCEPT
来源、目的端口(--sport、--dport)可以是个别端口,可以是端口范围
--sport 1000 匹配源端口是 1000 的数据包
--sport 1000:3000 匹配源端口是 1000-3000 的数据包(含1000、3000)
--dport :3000 匹配目标端口是 3000 以下的数据包(含 3000)
--dport 1000: 匹配目标端口是 1000 以上的数据包(含 1000
注意:--sport 和 --dport 必须配合 -p 参数使用
iptables -t filter -R OUTPUT 3 -p udp --sport :2054 -j DROP
流入、流出接口(-i、-o) iptables -t filter -A INPUT -i eth0 -j ACCEPT
例子:
1、端口匹配
-p udp --dport 53 匹配网络中目的地址是 53 的 UDP 协议数据包
2、地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16 匹配来自 10.1.0.0/24 去往 172.17.0.0/16 的所有数据包
3、端口和地址联合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80 匹配来自 192.168.0.1,
去往 www.abc.com 的 80 端口的 TCP 协议数据包
注意:
1、--sport、--dport 必须联合 -p 使用,必须指明协议类型是什么
2、条件写的越多,匹配越细致,匹配范围越小
动作:
ACCEPT 接受
DROP 丢弃
REJECT 明确拒绝
SNAT
DNAT
MASQUERADE 地址伪装
REDIRECT 地址重定向的
MARK
RETURN
1.
-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 链)
源地址转换,SNAT 支持转换为单 IP,也支持转换到 IP 地址池
(一组连续的 IP 地址)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
-j SNAT --to 1.1.1.1
将内网 192.168.0.0/24 的原地址修改为 1.1.1.1,用于 NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
-j SNAT --to 1.1.1.1-1.1.1.10
同上,只不过修改成一个地址池里的 IP
2.
-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 链)
目的地址转换,DNAT 支持转换为单 IP,也支持转换到 IP 地址池
(一组连续的 IP 地址)
例如:
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \
-j DNAT --to 192.168.0.1
把从 ppp0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 \
-j DNAT --to 192.168.0.2:80
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \
-j DNAT --to 192.168.0.1-192.168.0.10
3.
-j MASQUERADE
动态源地址转换(动态 IP 的情况下使用)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
将源地址是 192.168.0.0/24 的数据包进行地址伪装
netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains 等以前的工具都无法提供的
一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪
状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,
名称分别为NEW, ESTABLISHED 、 INVALID 、 和 RELATED 。
NEW: SYN ACK SYN ACK tcp 3次握手
ESTABLISHED: 传输数据 开始
RELATED:姻亲关系的一些协议 如vsftpd
INVALID: 一些错误,如内存溢出
显示扩展和隐式扩展:
按状态进行匹配 (state)
按时间匹配 (time)
按包速率匹配 (limit)
按对象匹配 (nfgroup)
显示扩展:
-m state --state是显示的扩展
]#iptables -A INPUT -s 192.168.0.0/255.255.255.0 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
]#iptables -A OUTPUT -d 192.168.0.0/255.255.255.0 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
1.
-m limit --limit 匹配速率 [--burst 缓冲数量]
用一定速率去匹配数据包
例如:
iptables -A FORWARD -d 192.168.0.1 -m limit --\ limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
注意:
limit 仅仅是用一定的速率去匹配数据包,并非 “限制”
2。
-m time 设置在什么时间范围内,启用该规则
例如:
Iptables -t filter -A HFW_FILTER -m nfgroup --s ANY -m time --timestart 9:0 --timestop 12:0 --weekdays Mon,Tue -j ACCEPT
3.
-m nfgroup --s 匹配来源地址
--d 匹配目标地址
--sp 匹配来源端口
--dp 匹配目标端口
--tcp --udp 匹配协议
例如:
Iptables -t filter -A HFW_FILTER -m nfgroup --s ANY --d ANY --sp ALL --dp ALL --tcp -j ACCEPT
4.
-m state --state NEW,ENSTABLISHED
隐士扩展:
]#iptables -A INPUT -s 192.168.0.0/16 -d 192.168.5.3/24 -p tcp -j DROP
service ipstables save 就会把定义好的规则存放到/etc/sysconfig/iptables
本文出自 “近水楼台,向阳花木” 博客,转载请与作者联系!