首先,我么来简单了解下Firewall,简单的说防火墙是工作于网络边缘,在数据包得进出口处,按照管理员定义的规则对报文做策略控制的组件!
常见的两类防火墙:基于工作的层次的不同进行划分
网络层防火墙:工作在3,4层,也称为3层防火墙
7层防火墙:通常称代理服务器,应用层网关
从设计理论来说,7层防火墙更加安全,但效率也比较低。
从上面的简单介绍可以知道,在实际生产环境中,由于防火墙工作在网络的进出口处,因此防火墙的工作效率可能会成为整个网路系统的瓶颈,因此就要求对防火墙进行分布式负载均衡或其它复杂的防火墙连动系统,这是后话,本人尚未工作也无经验可谈,只能从理论的角度进行分析!下面还是谈谈今天的重点,iptables吧!
首先iptables到底是什么呢?
iptables是LINUX系统自带的一种纯软件防火墙,iptables的前身叫做ip firewall是从FreeBSD系统移植而来的,由于TCP/IP stack(TCP/IP协议栈)是位于内核中的,因此要实现对TCP/IP协议的策略控制,所有的过滤或者其它匹配规则都要定义在内核中,然而经过前面的学些我们知道为了保证系统的安全和稳定性,想要把这些规则直接定义在内核中是十分困难的(用户空间能通过中断和系统调用来访问内核,也可以通过两个伪文件系统向内核传递参数或查看内核运行状态/proc、/sys,然而这仍然很难实现上述的操作)这是1.0的时代,到了内核2.0时代ip firewalls有了极大的改进发展成为ip chains,ip chains可以一次定义多条规则并可以串联起来共同发挥作用,一直发展到今天的iptables。好的简单了解过这些之后,下面我们看看iptables是如何工作的以及简单介绍下相关命令的使用!
iptables自身并非防火墙,而是工作在用户空间让管理员写规则的工具,这些规则可以放在工作在内核的netfilter上,在内核空间中生效实现对数据包得过滤或其他匹配操作功能!因此netfilter才是在内核中实现这些规则的工具,两者相结合起来才是真正的防火墙,这也就是为什么说防火墙是一组工作组件的原因。
默认情况下NetFilter 位于内核中TCP/IP数据包流向的5个位置实现数据包检查:这5个位置是设计者精挑细选的5个位置!简单描述下这5个位置,上面说过了这5个位置是在数据包流向上挑选出来的,所以我们先来了解下数据包在本机中的流向有哪几种,一种是直接从本机转发出去的这个不会进入用户空间直接从内核空间转发出去,第二种是访问本机服务的要进入用户空间访问服务的,这也就比较容易理解这5个位置了,数据包得进出口处,转发处,进出用户空间的进出口处,如下图所示:
以上的5个位置在内核源码中被称之为5个钩子函数,这相当于5个内置的规则链!
下面就说说iptables的3表5链以及它们之间的对应关系:
5个内置的规则链 chains:
-->PREROUTING 路由前的端口
-->INPUT 流入接口
-->FORWARD 转发接口
-->OUTPUT 流出接口
-->POSTROUTING 路由后的端口
3个表对应防火墙的3种功能:
过滤功能:filter 过滤表
地址转换功能:nat 地址转换表
mangle 修改报文元数据,做防火墙标记
3表5链的对应关系:表中存放的是链 在链中写规则
filter过滤表 只能做在3个链上
-->INPUT,FORWARD,OUTPUT
nat地址转换表
-->PREROUTING,OUTPUT,POSTROUTING
mangle
-->PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
从上面的图中也可以看出表和链的关系以及命令的格式下面就介绍下iptables的命令的使用,在此之前要提醒下,在链中定义的规则是自上而下进行匹配的,匹配范围越小的规则越严格的规则应该放在上面,这应该不难理解吧!还有另外一点是,iptables写的规则是立即生效的,在redhat中将其模拟成服务,可以打开和关闭,下面看看这些命令是i如何使用的吧!
iptables定义规则的方法:
iptables [-t table] 指定表默认是filter CONMAND [chain] CRETIRIA匹配标注 -j ACTION指定处理动作(规则)
如:iptables -t filter -A INPUT
CONMAND:分为3类 链管理命令 规则管理命令 查看命令
链管理命令:
-P 设置默认策略
# iptables -P INPUT {DROP|ACCEPT}
-F 清空规则链
# iptables -t nat -F PREROUTING
-N 自定义规则链
# iptables -N inbound_tcp_web
-X 删除用户自定义的空链 删除之前要清空链中的规则
-E 重命名用户自定义的链
-Z 清空链中默认的规则链规则中的计数器
规则管理命令:
-A 在末尾插入一条规则
-I num 插入规则
-R 替换规则 要引用原规则进行替换 也可以跟数字表明替换那条规则
-D num 删除规则
查看命令
-L
-n 不做反向解析 以地址方式显示
-v 显示详细信息 -vv -vvv 这个不解释了
-x 精确值 不做单位换算
--line-numbers 显示行号
匹配标准两类:
通用匹配
-s,--src,--source
指定做源地址匹配 只能使用地址可以使用!取反(IP,NETWORK/NETMASK,0.0.0.0/0.0.0.0)
-d,--dst,--destnation
指定做目标地址匹配
-p 用于匹配协议{tcp|udp|icmp}
-i 数据的流入接口 后跟网卡如 eth0
-o 数据的流出接口
扩展匹配
隐含扩展(对协议的扩展)
-p tcp
--dport 目标端口 0-65535 只能指定连续端口
--sport 源端口
--tcp-flags 两个参数 检查的标志位 值必须为1的标志位SYN,ACK,FIN,PSH,RST,URG,CWR,ESE
--tcp-flags syn,ack,fin,rst syn = --syn 检查syn为1的数据包
-p udp 跟tcp相同
--dport
--sport
-p icmp
--icmp-type
echo-request 请求回显 8来表示
echo-reply 响应数据包 0来表示
显式扩展
使用iptables的扩展模块来实现的
-m 指定模块
-p tcp -m multiport --dports 21,13,80
ACCTION
-j ACCTION
DROP 丢弃 这个不会返回信息
REJECT 拒绝 明确回复拒绝的信息 这篇博客是补的如果有看过考试答案总结那篇的话,就应该知道在RHCE考试中就一定要用REJECT,然而在实际生产过程中大多时候用DROP
ACCETP 接受
转向自定义的链 custom_chain
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址伪装
REDIRECT 端口重定向
MARK 标志
RETURN 返回规则
规则的写法:如只允许172.16.0.0网段的客户端访问我的SSH服务
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/100 -p tcp --sport 22 -j ACCEPT
iptables还支持state状态检测,状态的分类有以下几种:
NEW 新发起的连接
ESTABLISHED 已建立的连接
INVALID 无法识别的连接
RELATED 具有关联关系的连接
service iptablew save 可以保存自己定义的规则默认保存在/etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables.2 保存到指定目录
iptables-restore < /etc/sysconfig/ipdables.2 使指定目录里的规则生效
地址转换在34层实现
SNAT 源地址转换
# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
当外网地址是动态获得的时候要用
MASQUERDE地址伪装
# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j
MASQUERDE
DNAT目标地址转换:
# iptables -t nat -A PREROUTING -d 192.18.10.18 -p tpc --dport 80 -j DNAT --to-destination 172.16.100.2
今天就总结到此!下一次有时间的话会对iptables的扩展模块进行一些扩展和练习!
好饿!
阅读(2409) | 评论(0) | 转发(0) |