一,前言
本来想起个名字叫做“小白都是怎么学习iptables的?”或者“你为什么还不了解iptables?”等等,就像简书上的头条文章,虽然被说成“标题党”也是名副其实,但是的确能吸引别人去阅读,提升阅读量(那些大V也确实是这么干的)。不过转念一想,我这小白所写的文章,稚不成书,还是少些人看的好:)。。。故改名iptables初探。意在记录自己学习iptables的过程,轻喷!
首先,iptables是防火强的一种,防火墙分为三大类:包过滤、代理和状态检测防火墙。在linux系统中大都采用包过滤技术来做防火墙,根据发展的先后又分为静态防火墙和动态防火墙,静态防火墙修改规则后需要重新启动防火墙,而动态不需要,修改即生效。今天我所学习的iptables就属于静态防火墙的一种,在REHL7中新纳入的firewall防火墙就属于动态防火墙。在实际应用中,iptables可以用来封包过滤、封包重定向以及NAT隐藏背后真实的服务器,起到保护的作用。
二,iptables原理
1,简介:
iptables其实应该叫做netfilter/iptables,由netfilter和iptables两部分组成,netfilter也称为内核空间,用来存储策略及响应策略,iptables是存在于用户空间的一种工具,用来编写策略。
2,表与链:
整个iptables策略的编写围绕着表(tables)和链(chains)的分层结构来进行,一张表下可以包含多条链。目前内置于iptables中的表有mangle、nat和filter三张,而我们常用的就是nat和filter,所以我这里就主要学习这两张表。两张表与其各自的链的功能如下表所示:
| 表(tables) | 链(chains) | 解释(explanation) | 
| nat | prerouting | 在路由决策前由这个链来处理 | 
| output | 从本地发送的数据由这个链处理 | |
| postrouting | 用于转发和送出数据包 | |
| filter | input | 用于过滤进入本机的数据包 | 
| forward | 处理经过本系统的报文(转发、路由等) | |
| output | 用于过滤从本机发出的报文 | 
当一个数据包需要来到配置有iptabls的主机时,会经过如下过程:
1) 路由决策前,经过NAT的prerouting来处理;
2) 判断此数据包是否发送给本机,如果是,则经过FILTER的input来过滤,如果否,则通过FILTER的forward来路由转发;
3) 对于发送给本机的数据包,通过处理后,进入NAT的output链进行再处理,然后进入FILTER链的output进行过滤出,最后经由NAT的postrouting链送出数据包;
4) 对于不是发送给本机的数据包,通过forwar链处理后,由postrouting链送出。
数据流向大致如下图所示:
 
所以我们做的就是在表和链这里设置一些规则,让数据包来匹配这些规则,规则从上到下是一个表的样式,而数据包会一条一条的过滤,直到符合匹配,就同行,否则就按照默认规则处理。
三,通过实验验证iptables命令
1) 在centos7.2上安装iptables
挂载镜像,编写yum源
yum install iptables-services
systemctl unmask iptables
请确保firewalld为关闭状态(会与iptables冲突)
2) 验证iptables相关命令
命令格式:iptables [-t 表名] 选项 [链名] [条件] [-j 策略]
对表名来说,本实验中就是filter和nat表,默认情况下是filter
对选项来说存在以下的常用选项:
| -L | iptables -L 查看当前规则策略,没有指定表时,默认filter表 | 
| -F | iptables -F 清空指定链规则 | 
| -A | iptables -A 在指定链后面添加一条新规则 | 
| -D | iptables -D 1 删除指定链第一条规则 | 
| -R | 替换指定链中的规则 | 
| -Z | 清空指定链中的所有计数 | 
| -N | 自定义一条链 | 
| -X | 删除自定义链 | 
| -P | 设定默认策略(将整个链DROP等 | 
| -E | 修改链的名字(只能修改自己添加的链) | 
| -I | 在指定链某一条规则前插入一条新规则 | 
对策略来说,有如下策略:
| ACCEPT | 允许该包通过 | 
| DROP | 丢弃该包,不做任何操作 | 
| REJECT | 拒绝该包,并返回消息 | 
| DNAT | 目标地址转换 | 
| SNAT | 源地址转换 | 
| REDIRECT | 重定向到另一个端口 | 
| MASQUERADE | 地址伪装 | 
| LOG | 将封包信息记录到日志/var/log | 
试验环境:
| 主机名 | IP | 角色 | 
| 01 | 192.168.1.2 | 公网IP | 
| 02 | 192.168.1.1 192.168.2.1 | 防火墙,边缘路由 | 
| 03 | 192.168.2.2 | 服务器 | 
1)03上做了http服务,现在要求01不能访问03的web服务,在02上配置iptables:
iptables -A FORWARD -s 192.168.1.2 -d 192.168.2.2 -p tcp -dport 80 -j REJECT
 
此时,01不能访问03的WEB服务,其他服务正常
2)我们想做一个源地址的转换, 内网多个客户端共用一个外网IP去访问服务器:
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 192.168.1.0/24 -j SNAT --to-source 192.168.1.1
 
此时,再用01去访问03时,在03的httpd访问日志中,显示的不是01的地址,而是通过已经转换的192.168.1.1:
 
3) 目标地址转换,通常用于隐藏内部服务器的IP地址。比如在本例中,03是内部服务器,现在想实现的目标是用户通过02上的192.168.2.1来访问03的web服务,在02上配置NAT:
iptables -t nat -A PREROUTING -s 192.168.2.0/24 -d 192.168.2.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2

此时:elinks 192.168.2.1就是访问03的192.168.1.2这台服务器了。很好的将03进行隐藏。
【注】源地址转换必须在POSTROUTING上做,目标地址转换必须在PREROUTING上做。
四,结语
在企业中,会经常用到iptables来做NAT,已达到内网安全的目的。在本篇中,学到了iptables的命令格式及SNAT和DNAT的用法。在后续的文章中,会继续学习其他用法,并分析各种用法的原理。
原文:http://www.cnblogs.com/rongtangzi/p/6618939.html