iptables学习总结

关键词:iptables,路由,端口映射
作者:BIce 创建时间:2011-12-18 01:23:00

参考文档:
          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

  1. filter:用于对信息包进行过滤,它的链(chains)有:INPUT/OUTPUT/FORWARD
  2. nat:网络地址翻译,用于对包进行转发,它的链(chains)有:PREROUTING/OUTPUT/POSTROUTINGnat中可执行的操作有DNATSNAT,分别为目标地址转换和源地址转换。
  3. mangle:是一些用户可以自定义的包处理方式,它的链(chains)有:INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING.比较高级的功能,一般不需使用。

对于表的操作可用-t 选项指定,如果不指定的话默认操作表是filter.

  1. chain

链,是表中处理规则的方式,一个链中可以有很多用户定义的规则,包的处理会沿着链一个一个进行处理,当遇到一个匹配项,就会按照指定的规则进行包的处理,进入下一个chain.三种表有不同的chains,下面我们一一介绍:

  1. filter .INPUT:用于处理进入的包
  2. filter .FORWARD:用于处理通过的包
  3. filter .OUTPUT:用于处理本地生产的包
  4. nat .PREROUTING:修改到来的包
  5. nat .OUTPUT:修改路由之后的包
  6. nat .POSTROUTING:修改准备出去的包
  7. mangle有上述五种包,具体功能见图

另外在转发包经过FORWARD链之后,也要经过服务器的ROUTING部分,经过路由之后才进入POSTROUTING链的

  1. command
  2. 的命令有很多,常用的有:
  1. –A 将规则加入chain的尾部
  2. –D 删除指定的规则,可以使用规则的chain中位置编号或者用匹配方式删除
  3. –P 指定chain的缺省策略,目标,即找不到匹配规则时候需要进行的操作
  4. –N 创建一个新的chain,以指定名称(用户自定义的链可由-j命令跳转,类似方法调用的处理逻辑.
  5. –F 删除指定chain的所有规则
  6. –L 列出指定chain中的所有规则
  1. match

iptables命令要作用到的包,由match指定。符合match部分匹配的包才会被响应命令所处理,匹配分为通用匹配和基于协议的匹配,下面是常用的通用匹配:

  1. -p:按照某个协议进行匹配,如TCPUDPICMP等等
  2. -s:用源地址IP信息进行匹配,形式可为xx.xx.xx.xx/24(指定一个网段)
  3. -d:用目的地址IP信息进行批评,形式与-s相同

d)         --sport:指定源端口匹配(要与具体协议一同使用)

e)         --dport:指定目的端口匹配(同上)

f)          –i:与入口匹配,像eth0

g)         -o:与出口匹配,像eth1

基于协议的匹配由-p或者-m开启,-m -p会导致matching module的加载和执行,后面还可以接很多参数(module 相关)方便匹配,可以在-m modulename 后面加上-h开启具体参数的说明。

  1. target

目标即为规则制定的操作,即匹配的包进行的操作,可以自定义目标,默认的常用目标有:

  1. ACCEPT:当包与规则完全匹配时,会被接受,(允许到目的地,并不在本chain的遍历运行,可能还会进入其他的chain)
  2. DROP:当包与规则匹配,阻塞包,不做处理。(不向对方发送任何拒绝信息)
  3. REJECT:与DROP运行方式类似,但是与其不同的是REJECT不会在服务器和客户机上留下死套接字,而且REJECT会将错误消息发送给包的发送方。
  4. RETURN:让匹配的包停止遍历包含该规则的chain,如果chainINPUT之类的主链,则会使用该链的缺省策略处理包。如果当前chain是其它chain的子chain则返回它的调用方chain的调用位置继续执行。
  5. DNATnat中以参数—to-destination来修改目标地址(包括端口),在PREROUTING chainOUTPUT chain
  6. SNATnat中以—to-source命令来修改包的源地址信息,在POSTROUTING chain
  7. 的指定由 –j方式来指定。

2.2命令书写

Iptables 的一般命令格式iptables [-t table] command [match] [target],由上面的介绍可见使用iptables命令,首先我们要确定加入(或修改)规则(command)的所在table,匹配的包要求match,和对匹配执行的操作target

由此上面列出的四项,我们就可以写出具体的iptables命令,下面将根据具体的例子给出iptables的使用方法。

三、Iptables实例

接下来用一个例子来说明Iptables的实际使用

通用部分

使用iptables首先要启动iptables服务,要用命令service iptables start开启iptables

保存现有的iptables,可以使用iptables-save > ~/iptables_backup 命令来执行。而恢复则可用iptables-restore  ~/iptables_backup来完成.

查看已有iptables表况,可以使用iptables --list -t tableName进行。接下来将对具体iptables命令进行解释,其中$IPTABLES变量代表iptables命令

         在默认情况下,主机在接收到不是自己ip为目的ip的包的时候会直接丢弃,但是网络服务器由于其特殊功能,它必须能接收不是自己IP为目的IP的包,而且必须能进行转发包的功能,这样就要通过echo “1” >/proc/sys/net/ipv4/ip_forward的方式,使系统允许转发功能,使包进入FORWARD chain(包含 mangle .FORWARDfilter .FORWARD)中。

         下面的三个指令是将表 filter/nat/mangle的数据清楚,防止历史数据对现有数据有影响

以上三条指令指定了filter. INPUT/OUTPUT/FORWARD的默认策略为丢弃包。

上面建立了5iptables链,分别用于处理不同的包。

检查在NEW状态下发送的包SYNACK状态位,如果SYNACK都设置了则REJECT,并发送tcp-resetREJECT(-m state –state xxx指定所在状态,reject-with指定发回reject包的类型)

NEW状态下的非syn tcp数据包进行抛弃并记录日志。(--syn代表tcp syn数据包)

指定allowed chain的内容,syn包接受,ESTABLISHRELATED状态下的包直接接受,其余包DROP掉。

指定tcp_packets的规则,由任何地址发到22端口的包都直接转向allowd链,发送到15114端口的包接受

 

将从外网网卡进入的,向外网IP 135/139端口UDP发送的广播包抛弃

3.1filter.INPUT chain设置

首先将INPUTtcp包抛向bad_tcp_packets处理,进行过滤(相当于方法调用)然后对内部网卡而来的源地址是内部网段的包直接接受,然后对DHCP使用的从68端口发到67端口的内部包直接接受

首先对于外部网的在ESTABLISTHEDRELATED的包直接接受,对于tcp ,udp,icmp的包分别分发给对应的chain进行处理。将发送到224的包丢掉(MS Network)的原因。

其中limit match是用来限制匹配数据包的速率和频率,其中--limit单位时间允许通过的包数,--limit-burst是设置的触发limit限制的次数,上面的意思是每分钟最大有3个包可以通过,超过3个的话今入LOG进行记录

filter.INPUT的流程图:

3.2filter.FORWARD chain设置

首先过滤坏的tcp包,从内网网卡发出的包之间接受,在ESTABLISHRELATED的包之间接受(允许确认包和管理包通过),如果不满足上述要求的包,则进入limit限制模块对它进行限制。

3.3filter.OUTPUT chain设置

首先过滤坏的tcp包,然后对本地地址,LAN网卡地址,WAN网卡地址发送的包直接接收,对于不满足的包进入limit模块。

3.4nat.PREROUTING设置

WAN网卡发出的到6681tcp包修改目标地址到$SPECIAL_IP处,发送到WAN IP8090端口的包修改目标地址到192.168.11.189:8080端口上(端口转发)

3.5nat.POSTROUTING设置

首先将发送到WAN网卡的包源地址都该车WAN外网IP,将发送到192.168.11.189的到8080的包源地址改为LAN网卡IP,向FORWARD chain中加入由WAN网卡IP发出的到192.168.11.1898080端口的包直接接受(端口转发)

关于Mangle

         实验室的服务器上为了加速路由效率,使用了大量的Mangle表规则,其中主要使用了MARK 目标来控制包在Netfilter中的优先级,加速访问速度。过于复杂不进行讨论。

3.6端口转发例子

给出一个端口转发的例子以说明iptables的简单使用,设计Iptables时一定要考虑好,因为发送的包进、出LAN都需要进入iptables进行处理,所以两方面都要考虑,假设我们把外网IP80端口映射到内网192.168.1.198080上,需要进行的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 -d 192.168.1.19 --dport 8080 -j SNAT --to LAN网关IP

(将发送到59.72.109.127 80的包发送到192.168.11.238并将其源置成LAN网关)

 

另外可能还有加一条允许WAN网卡访问192.168.1.19 8080端口的条目

iptables –A INPUT –p tcp –d 192.168.1.19 –dport 8080 –i ethWAN –j ACCEPT

参考:http://linux.chinaunix.net/techdoc/net/2006/10/31/943077.shtml

 

Linuxnat解说:

http://wiki.yfang.cn/bin/view/MyTech/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8A%E7%9A%84NAT

3.7链接跟踪

我们最开始时说过iptables实际上有两个部分iptablesnetfilternetfilter工作在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.6 dst=192.168.1.9 sport=32775 \

     dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 \

     dport=32775 use=2

    

首先显示的是协议,这里是tcp,接着是十进制的6tcp的协议类型代码是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返回信息时则可以用反推的方式完成。(求验证。)

附:TCP协议状态图

留言功能已取消,如需沟通,请邮件联系博主sunswk@sina.com,谢谢:)