IPtables学习总结
参考文档:http://linux.ccidnet.com/art/737/20040317/96576_1.html
http://secyaher.blog.163.com/blog/static/389557720102265324236/
http://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html
http://linux.chinaunix.net/techdoc/net/2006/08/11/938001.shtml
http://iptables.org/projects/iptables/index.html
http://linux.vbird.org/linux_server/0250simple_firewall.php
对iptables进行学习,分析以便理解实验室路由,了却一桩心事,如有错误欢迎拍砖。
一、Iptables 简介
1.1什么是Iptables
Linux 为我们提供了一个非常优秀的防火墙框架netfilters/iptables,它完全免费、功能强大,可以对流入和流出的信息进行细化控制,并且可以在一台低配的机器上很好的运行。其中netfilter在内核内部工作,而iptables则可让用户配置规则结构,我们一般接触的命令就是iptables,它在User mode下操作,但是内部会调用netfilter,相当于netfilter的用户API。一般将netfilters/iptables简单称为iptables。(由于netfilter是对包头进行分析,所以可以分析mac层和它之上所有层)
1.2Iptables能做什么
Iptables是基于网络包进行分析来达到控制功能,它只对包报头进行读取分析,不会增加流量负担,它可以完成的工作有:
1) 网络防火墙工作:保护内部网络安全
2) 网络路由:充当内部网络的路由器
3) 端口转发(路由中工作的一种,因其作用单拿出来):允许内部服务被外部访问
二、Iptables命令
2.1基本概念
1) 所有以上iptables功能的实现基本原理:对包头信息的读取,处理和对包转发。
2) 一般执行网络路由或网络防火墙的服务器(也就是运行iptables的主机)需要有两个网卡,一个负责外部信息处理WAN,一个负责内部信息处理LAN(一般就是内部网的网关)。
3) Iptables的一般命令语法 iptables [-t table] command [match] [target]
下面给出从网上找到的iptables包处理的流程:图(感谢linux私房菜鸟哥),当一个包进入iptables处理过程中时,它会被沿着这个处理链进行传递,在每个chain中,如有匹配的规则,包就会被按照规则制定的方式(目标)进行处理,如果没有匹配规则,则会按照chain的默认策略处理。
其中菱形路由判断部分,如果目标地址是本机的,会按照向上的处理过程进行,否则则会按照向右的处理部分进行.
由上图我们可以看到一个包经过iptables需要被处理的过程,由上图我们先说明一些基本概念(即命令中的部分):
1) table
表是iptables组织规则的一种方式,一共有三种iptables表
a) filter:用于对信息包进行过滤,它的链(chains)有:INPUT/OUTPUT/FORWARD
b) nat:网络地址翻译,用于对包进行转发,它的链(chains)有:PREROUTING/OUTPUT/POSTROUTING,nat中可执行的操作有DNAT和SNAT,分别为目标地址转换和源地址转换。
c) mangle:是一些用户可以自定义的包处理方式,它的链(chains)有:INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING.比较高级的功能,一般不需使用。
对于表的操作可用-t 选项指定,如果不指定的话默认操作表是filter.
2) chain
链,是表中处理规则的方式,一个链中可以有很多用户定义的规则,包的处理会沿着链一个一个进行处理,当遇到一个匹配项,就会按照指定的规则进行包的处理,进入下一个chain.三种表有不同的chains,下面我们一一介绍:
a) filter .INPUT:用于处理进入本机的包
b) filter .FORWARD:用于处理通过本机的包
c) filter .OUTPUT:用于处理本地生产的包
d) nat .PREROUTING:修改到来的包
e) nat .OUTPUT:修改路由之后的包
f) nat .POSTROUTING:修改准备出去iptable的包
g) mangle有上述五种chain,具体功能见图
另外在转发包经过FORWARD链之后,也要经过服务器的ROUTING部分,经过路由之后才进入POSTROUTING链的。
3) command
iptables的命令有很多,常用的有:
a) –A 将规则加入chain的尾部
b) –D 删除指定的规则,可以使用规则的chain中位置编号或者用匹配方式删除
c) –P 指定chain的缺省策略,目标,即找不到匹配规则时候需要进行的操作
d) –N 创建一个新的chain,以指定名称(用户自定义的链可由-j命令跳转,类似方法调用的处理逻辑.)
e) –F 删除指定chain的所有规则
f) –L 列出指定chain中的所有规则
4) match
iptables命令要作用到的包,由match指定。符合match部分匹配的包才会被响应命令所处理,匹配分为通用匹配和基于协议的匹配,下面是常用的通用匹配:
a) -p:按照某个协议进行匹配,如TCP,UDP,ICMP等等
b) -s:用源地址IP信息进行匹配,形式可为xx.xx.xx.xx/24(指定一个网段)
c) -d:用目的地址IP信息进行批评,形式与-s相同
d) --sport:指定源端口匹配(要与具体协议一同使用)
e) --dport:指定目的端口匹配(同上)
f) –i:与入口匹配,像eth0
g) -o:与出口匹配,像eth1
基于协议的匹配由-p或者-m开启,-m 和-p会导致matching module的加载和执行,后面还可以接很多参数(module 相关)方便匹配,可以在-m modulename 后面加上-h开启具体参数的说明。
5) target
目标即为规则制定的操作,即匹配的包进行的操作,可以自定义目标,默认的常用目标有:
a) ACCEPT:当包与规则完全匹配时,会被接受,(允许到目的地,并不在本chain的遍历运行,可能还会进入其他的chain)。
b) DROP:当包与规则匹配,阻塞包,不做处理。(不向对方发送任何拒绝信息)
c) REJECT:与DROP运行方式类似,但是与其不同的是REJECT不会在服务器和客户机上留下死套接字,而且REJECT会将错误消息发送给包的发送方。
d) RETURN:让匹配的包停止遍历包含该规则的chain,如果chain是INPUT之类的主链,则会使用该链的缺省策略处理包。如果当前chain是其它chain的子chain则返回它的调用方chain的调用位置继续执行。
e) DNAT:nat中以参数—to-destination来修改目标地址(包括端口),在PREROUTING chain和OUTPUT chain
f) SNAT:nat中以—to-source命令来修改包的源地址信息,在POSTROUTING chain
target的指定由 –j方式来指定。
2.2命令书写
Iptables 的一般命令格式iptables[-t table] command [match] [target],由上面的介绍可见使用iptables命令,首先我们要确定加入(或修改)规则(command)的所在table,匹配的包要求match,和对匹配执行的操作target。
由此上面列出的四项,我们就可以写出具体的iptables命令,下面将根据具体的例子给出iptables的使用方法。
三、Iptables实例
接下来用一个例子来说明Iptables的实际使用
通用部分
l 使用iptables首先要启动iptables服务,要用命令service iptables start开启iptables
l 保存现有的iptables,可以使用iptables-save> ~/iptables_backup 命令来执行。而恢复则可用iptables-restore ~/iptables_backup来完成.
l 查看已有iptables表况,可以使用iptables --list-t tableName进行。接下来将对具体iptables命令进行解释
在默认情况下,主机在接收到不是自己ip为目的ip的包的时候会直接丢弃,但是网络服务器由于其特殊功能,它必须能接收不是自己IP为目的IP的包,而且必须能进行转发包的功能,这样就要通过echo “1” >/proc/sys/net/ipv4/ip_forward的方式,使系统允许转发功能,使包进入FORWARD chain(包含 mangle.FORWARD和filter .FORWARD)中。
3.1端口转发例子
给出一个端口转发的例子以说明iptables的简单使用,设计Iptables时一定要考虑好,因为发送的包进、出LAN都需要进入iptables进行处理,所以可能两方面都要考虑(一般考虑单向完备即可,数据会由连接追踪机制保持哪来的回哪去原则。),假设我们把外网IP的80端口映射到内网192.168.1.19的8080上,需要进行的iptables设置是
iptables -t nat -A PREROUTING-p tcp -d WANIP --dport 80 -j DNAT --to 192.168.1.19:8080
iptables -t nat -A POSTROUTING -p tcp -d192.168.1.19 --dport 8080 -j SNAT --to LAN网关IP
(将发送到WANIP 80的包发送到192.168.1.19并将其源置成LAN网关)
另外可能还有加一条允许WAN网卡访问192.168.1.19 8080端口的条目
iptables –A FORWARD –p tcp –d 192.168.1.19 –dport8080 –i ethWAN –j ACCEPT
参考:http://linux.chinaunix.net/techdoc/net/2006/10/31/943077.shtml
Linux的nat解说:
http://wiki.yfang.cn/bin/view/MyTech/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8A%E7%9A%84NAT
3.2链接跟踪
我们最开始时说过iptables实际上有两个部分iptables和netfilter,netfilter工作在linux内核中,而iptables就是用户操作netfilter的接口。
Netfilter主要采用了以下几种技术完成防火墙功能:
(http://baike.baidu.com/view/490561.htm)
1) 链接跟踪
是所有功能的基础,核心会维护一个链接跟踪表来保持链接的信息
2) 包过滤
3) 地址转换(NAT)
4) 包处理
连接追踪使得管理员可以根据以下的状态对连接进行操作(就算链接协议是无状态的):
1) NEW —请求新连接的分组,如 HTTP 请求。
2) ESTABLISHED —属于当前连接的一部分的分组。
3) RELATED —请求新连接的分组,但是它也是当前连接的一部分,如消极 FTP 连接,其连接端口是 20,但是其传输端口却是 1024 以上的未使用端口。
4) INVALID —不属于连接跟踪表内任何连接的分组
(有助减少一些情况下对于双向链接的控制)
如下面的例子显示的规则使用连接跟踪来只转发与已建立连接相关的分组:
iptables -A FORWARD-m state --state ESTABLISHED,RELATED -j ALLOW
链接跟踪表是netfilter的一个重要组件,它会记录在nat里面修改前的源、目的 IP,以及修改后的源、目的 IP,并以 hash 结构存储.(iptables nat命令每次的对一个包的修改都会建立连接追踪项),可在/proc/net/ip_conntrack文件查看(如何查看文件内容参见http://www.panwenbin.com/2010/09/05/procnetip_conntrack/)
每一个表项conntrack类:
tcp 6 117 SYN_SENT src=192.168.1.6dst=192.168.1.9 sport=32775 \
dport=22 [UNREPLIED] src=192.168.1.9dst=192.168.1.6 sport=22 \
dport=32775 use=2
首先显示的是协议,这里是tcp,接着是十进制的6,tcp的协议类型代码是6之后的117是 这条conntrack记录的生存时间,它会有规律地被消耗,直到收到这个连接的更多的包。那时,这个值就会被设为当时那个状态的缺省值。接下来的是这个连接在当前时间点的状态。上面的例子说明这个包处在状态 SYN_SENT,这个值是iptables显示的,以便我们好理解,而内部用的值稍有不同。SYN_SENT说明我们正在观察的这个连接只在一个方向发送了一TCP SYN包。再下面是源地址、目的地址、源端口和目的端口。其中有个特殊的词UNREPLIED,说明这个连接还没有收到任何回应。最后,是希望接收的应答包的信息,他们 的地址和端口和前面是相反的
而当进行nat时候,nat将会对这个conntrack项进行修改,以端口转发为例,需要进行两次的nat,这两次nat都会在ip_conntrack中留下保存记录,而这样,在服务器发回包的时候,Linux会根据ip_conntrack中的记录进行两次变化(匹配返回包的源目的地址),变换回外部包的形式,这样就可以交互了。
RequestHost.Port-> WANIP.Port =====WANIP.PORT RequestHost.Port
RequestHost.Port->WANIP.Port=====ServerIP.Port->WANIP.Port(PREROUTING)
WANIP.Port->ServerIP.PORT======ServerIP.PORT->LANIP.Port(POSTROUTING)
查了好久也不清楚到底ip_conntract是如何保存维护记录的,遂猜测了一种可能的执行方法,左边是源目的地址,右边是期待的地址信息。给出的是请求建立时的猜想conntrack,在server返回信息时则可以用反推的方式完成。(求验证。)
注:知识体系中有短板,关于Linux核心路由相关知识不是很了解,对netfilter的核心机制也没有研究,所以无法对整体的包处理机制有比较好的了解,有时间补上