您的位置:首页 > 其它

防火墙基础及iptables应用

2012-11-03 14:10 417 查看
对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的。因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的。

防火墙定义:
所谓防火墙是工作在网络或主机的边缘,对进出的数据包根据定义的规则进行检查,并做出相应处理的一套组件。
防火墙类型
根据工作的层次来划分,常见的防火墙工作在OSI模型的第三层,称为网络层防火墙,工作在OSI第七层的称为应用层防火墙

网络层防火墙又称为包过滤型防火墙,它内置于linux系统的内核,在网络层或传输层对经过的数据包进行筛选,筛选的依据是系统内设置的过滤规则。通过检查数据流中每个数据包的源地址、目的地址、所有的协议、端口号等因素,来决定是否允许该数据包通过。

应用层防火墙又称为代理服务器型防火墙,代理服务器实际上是运行在防火墙上的一种服务器程序。服务器监听客户机的请求,当内网的客户机请求与外网的真实服务器连接时,客户端首先连接代理服务器,然后再由代理服务器与外网的真实服务器连接,取得客户想要的信息,然后再把信息返回给客户。
防火墙工作模式:


在Linux系统中提供了一个非常优秀的包过滤型防火墙工具—netfilter/iptables。它功能强大、使用灵活、可以对流入和流出的信息进行细化控制,且可以在一台低配置机器上很好地运行。这里我们详细介绍下iptables的规则及其用法。

Netfilter/iptables最早是与2.4内核版本的Linux系统集成的IP信息包过滤系统。它由Netfilter和iptables两个组件组成。

Netfilter组件称为内核空间,它集成在Linux的内核中。主要由信息包过滤表(tables)组成,而表由若干个链组成,每条链中可以由一条或者多条规则组成。总的来说,Netfilter是表的容器,表是链的容器,而链又是规则的容器。

Netfilter本身并不对数据包进行过滤,而iptables就是在Netfilter之上建立了防火墙功能,iptables就是由一组有序的规则建立起来的,这些规则与包含共同特征的数据包进行匹配,根据规则来判定是放行或丢弃。

表(table):主要包含四种表,filter,nat,mangle,raw.
链(chain):主要有5种链,PREROUTING,INPUT,OUTPUT,FORWORD,POSTROUTING

filter表是iptables默认的表,主要用于数据包的过滤。
它包含的链有:
INPUT:处理进入的数据包
FORWORD:处理转发的数据包
OUTPUT:处理本地生成的数据包
nat表主要用于网络地址转换。
它包含的链:
PREROUTING:修改即将到来的数据包
OUTPUT:修改在路由之前本地生成的数据包
POSTROUTING:修改即将出去的数据包
mangle表主要用于对指定的包进行修改。
它包含的链:
在linux内核2.4.18之后包含了所有的链。
独立于netfilter连接跟踪子系统起作用的规则应用于raw表。
它包含的链:
PREROUTING和OUTPUT

具体匹配流程如图:




iptables命令的格式:
iptables [-t 表名] -命令 [链名] 匹配条件 目标动作
iptables [-t table] command CHAIN [NUM ] match criteria -j TARGET

对链(CHAIN)的操作:
-N:新建一条链
-X: 删除一条用户自定义的链
-F: 清空一条链,默认清空filter中的链
-Z:清空计数器,iptables中的每条规则默认有两个计数器,用于记录本条规则多匹配到的数据包的个数和大小
-P:定义链的默认处理策略
-E:重命名一条链

对规则的操作:
-A:追加,在链的最后追加一条规则
-I:插入,一般使用-I CHAIN num 指插入哪一条
-R:替换某条规则,-R CHAIN num 替换哪一条
-D:删除一条规则,可以指定num来指定删除哪条规则。

查看规则:
-L:列出链中所有的规则
-L还有许多辅助的子命令,可以和它一起使用
-n: 不要对地址和端口做反解,即只显示数字地址
-v:显示详细信息,-vv -vvv v表示详细程度
-x:显示计数器的精确值
--line-numbers 显示规则的行号

匹配条件:分2种
1、通用匹配
-s --src,--source 指定匹配的源地址
-d --dst,--destination 指定匹配的目标地址
地址的格式:
IP
NETWORK/MASK
地址前加!可以表示取反
-p {icmp| tcp|udp} 指定协议
-i 数据包的流入接口(INPUT,FORWORD,PREROUTING)
-o 数据包的流出接口(OUTPUT,FORWORD,POSTROUTING)

2、扩展匹配:扩展匹配中又分为隐式扩展和显示扩展
1),隐式扩展:是对协议的扩展
-p tcp
--sport PORT[-PORT2] 指定源端口
--dport PORT[-PORT2] 指定目标端口
--tcp-flags {SYN,ACK,URG,RST,PSH,FIN}指定要检查的位(需要跟2个标志位列表,中用空格隔开)
eg:--tcp-fiags SYN,ACK,RST,FIN SYN
第一个列表表示要检查的位,第二个列表该标志位必须为1
--syn :专门匹配第一次握手。
-p udp
--sport 指定源端口
--dport 指定地址端口
-p icmp
--icmp-type 指icmp类型
0:echo-reply 指给予回应
8:echo-request 指请求回应

2),显式扩展:由netfilter扩展模块引入的扩展,用于匹配条件
-m :指定模块 (只引用模块的名称),模块在/lib/iptables下
-m state :用于实现连接的状态检测
--state
NEW,通信者发送新的请求状态
ESTABLISHED,建立连接的状态
RELATED相关联的,指一个完整的连接,需要依赖另一个完整的连接
INVALID,非法的,无效的连接状态
-m multiport
--source-ports port1,port2.. 指定多个源端口
--destination-ports port1,port2.. 指定多个目标端口
--ports 无论是源还是目标都予以匹配
-m limit 用一令牌桶过滤器限定速率(每时间多少个)
--limit 后接速率 (3/second)
--limit-burst num 最大峰值
-m connlimit 限定连接并发速率
[!] --connlimit-above num 指定多于num才满足条件将被拒绝

-m iprange 用于指定连续的地址匹配
--src-range ip-ip 源IP的网段
--dst-range ip-ip 目标IP的网段

eg: -m iprange --src-range 172.16.100.1-172.16.100.100

-m mac mac地址的匹配
--mac-source XX:XX:XX:XX:XX:XX
只能用在PREROUTING,INPUT,FORWORD链中

-m string 根据一定的模式和一定的策略来匹配字符串
--algo bm|kmp 匹配算法
--string “pattern” 匹配模式

-m recent 动态指定一个ip地址列表,不让它们匹配
--name NAME
--set 把数据包源地址加到指定列表中
--rcheck 同常和--set 一起用
--remove 从列表中释放
--second 限定时间 和--rcheck/--update一起使用
--hitcount hits
-m time 基于时间的匹配
--datestart 开始日期
--datestop 结束日期
--timestart 开始时间
--timestop 结束时间
--weekdays 周几

目标动作都有哪些:(TARGET)
ACCEPT 接收
DROP 丢弃
REJECT 拒绝(给予拒绝回应)
REDIRECT 端口重定向
LOG 记录访问日志
SNAT:
源地址转换
隐藏内部网络及其主机
使得众多内网客户端能够使用有限IP地址访问互联网工作在nat表中的POSTROUTING
-j SNAT
--to-source

DNAT:
目标地址转换,将内部私有的服务公开给外部,工作在nat表中的PREROUTING
-j DNAT
--to-destination

PNAT: 端口转换,在DNAT中将用户访问的目标端口映射为内网服务器上的一个不同端口,实现方法只需要为--to-destination 的目标端口的主机添加':8080'式的端口即可。
PNAT本身并不是一个TARGET

下面举几个示例来具体看下iptables的用法:
例1:用iptables命令写一条规则,限制主机172.16.9.2对外部网络不能访问,别人也不可以访问该主机
[root@www ~]# iptables -t filter -A INPUT -d 172.16.9.2 -p icmp --icmp-type 8 -j DROP   #进来的数据包
[root@www ~]# iptables -t filter -A OUTPUT -s 172.16.9.2 -p icmp --icmp-type 0 -j DROP  #出去的数据包

自己也ping不出去的
[root@www ~]# ping 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
From 172.16.9.2 icmp_seq=1 Destination Host Unreachable
From 172.16.9.2 icmp_seq=2 Destination Host Unreachable
From 172.16.9.2 icmp_seq=3 Destination Host Unreachable

在这里会检测到别人ping进来的匹配的包
[root@www ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 345 packets, 27474 bytes)
pkts bytes target     prot opt in     out     source               destination
3   252 DROP       icmp --  *      *       0.0.0.0/0            172.16.9.2          icmp type 8

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 217 packets, 21320 bytes)
pkts bytes target     prot opt in     out     source               destination
0     0 DROP       icmp --  *      *       172.16.9.2           0.0.0.0/0           icmp type 0

[root@www ~]# iptables -F   #删除规则,默认是删除filter表中的规则也可以用-t TABLE 指定删除哪个表中的规则。

例2、从172.16.9.2这台主机出去的已经建立连接的数据包都予以放行
[root@www ~]# iptables -A OUTPUT -s 172.16.9.2 -m state --state ESTABLISHED -j ACCEPT

例3、在INPUT链中插入第一条规则,表示新建立tcp和已经建立tcp连接的主机远程连接以及访问172.16.9.2的网页的都予以放行
[root@www ~]# iptables -I INPUT 1 -d 172.16.9.2 -p tcp -m multiport --destination-ports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

例4、从接口eth0请求访问172.16.9.2的主机5分钟内不超过3次请求的都予以放行,超过3次的都丢弃
[root@www ~]# iptables -A INPUT -i eth0 -d 172.16.9.2 -p icmp --icmp-type 8 -m limit --limit 300/second  --limit-burst 3 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth0 -d 172.16.9.2 -p icmp --icmp-type 8 -j DROP

例5、在OUTPUT链中新增一条规则,表示从172.16.9.2的80端口出去的里面包含"sex"字符串的数据包予以丢弃
[root@www ~]# iptables -I OUTPUT 1 -o eth0 -s 172.16.9.2 -p tcp --sport 80 -m string --algo kmp --string "sex" -j DROP

iptables还可以限制很多功能的,可以自己摸索下哦。

下面我们来演示源地址转换功能:
假设这样一种场景,假设192.168.10.2是外网的一台WEB服务器,中间的那台是NAT服务器,假设有2块网卡不再同一地址段内,我们在其上面添加iptables规则,可以实现地址转换的功能,以使172.16.0.2的pc机能够连接通过该服务器访问到WEB服务器上来。




1、搭建的环境:172.16.9.0 网段使用虚拟网卡的仅主机功能
192.168.10.0网段使用桥接功能

2、设置:PC机的网关设为192.168.10.1,WEB服务器的网关设为172.16.9.1,打开中间NAT服务器的转发功能,PC机就可以访问web服务器了。
















这时看下http的访问日志,源地址即是pc机的地址:
tail /var/log/httpd/accecc_log




我们在NAT服务器上添加一条iptables转换规则:




再去通过192.168.10.2访问该WEB服务器(规则会自动生效的,不用重启服务)




再次打开访问日志,源地址就会改变的哦:




规则里面就会有访问该服务器所匹配到的包了:




我们还可以通过远程访问下WEB服务器看下源地址是否改变了。




再来看下web服务器登录的效果:




源地址已经改变了~~
这就是我们所说的源地址转换了,只需要一条规则即可,很简单吧。

由于我的电脑性能不好,开了3台虚拟机已经卡的不能工作了,暂时只给大家提供源地址转换的操作,目标地址转换原理和源地址转换是一样的,您可以自己动手操作下哦。^_^
补充:

iptables规则在电脑重启后就会消失不见的,如果想要永久保存规则的话,可以使用 service iptables save 命令,规则就会被保存在/etc/sysconfig/iptables 文件中了。

再次用到的时候可以用命令直接恢复即可:

iptables-restore < /etc/sysconfig/iptables

保存时还可以保存到指定的文件中:

iptables-save > /PATH/TO/FILE

iptables-restore < /PATH/TO/FILE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  防火墙 基础