ITPub博客

首页 > Linux操作系统 > Linux操作系统 > IPtables 详解

IPtables 详解

原创 Linux操作系统 作者:杨奇龙 时间:2011-03-12 17:51:40 0 删除 编辑

Linux 的内置firewall机制,是通过kernel中的netfilter模块实现的(www.netfilter.ort)。Linux kernel使用netfilter对进出的数据包进行过滤,netfilter由三个规则表组成,每个表又有许多内建的链组成。通过使用iptables命令可以对这些表链进行操作,如添加、删除和列出规则等。

一、Netfilter规则表—filter nat mangle

filter,用于路由网络数据包。是默认的,也就是说如果没有指定-t参数,当创建一条新规则时,它会默认存放到该表内。

INPUT 网络数据包流向服务器

OUTPUT 网络数据包从服务器流出

FORWARD 网络数据包经服务器路由

nat,用于NAT表.NAT(Net Address Translation )是一种IP地址转换方法。

PREROUTING 网络数据包到达服务器时可以被修改

OUTPUT 网络数据包由服务器流出

POSTROUTING 网络数据包在即将从服务器发出时可以被修改

mangle,用于修改网络数据包的表,如TOS(Type Of Service),TTL(Time To Live),等

INPUT 网络数据包流向服务器

OUTPUT 网络数据包流出服务器

FORWARD 网络数据包经由服务器转发

PREROUTING 网络数据包到达服务器时可以被修改

POSTROUTING 网络数据包在即将从服务器发出时可以被修改

1.配置Iptables

当数据包进入服务器时,Linux Kernel会查找对应的链,直到找到一条规则与数据包匹配。如果该规则的target是ACCEPT,就会跳过剩下的规则,数据包会被继续发送。如果该规则的target是DROP,该数据包会被拦截掉,kernel不会再参考其他规则。

Note:如果从始至终都没有一条规则与数据包匹配,而且表末尾又没有drop all的规则,那末该数据包会被accept。Cisco则相反,在表末尾会因含deny all的规则。

1.) Iptables的命令选项

iptables [-t tables] command option parameter target

-A 在链尾添加一条规则

-C 将规则添加到用户定义链之前对其进行检查

-D 从链中删除一条规则

-E 重命名用户定义的链,不改变链本身

-F 清空链,删除链上的所有规则

-I 在链中插入一条规则

-L 列出某个链上的规则,如iptables –L INPUT 列出INPUT链的规则

-N 创建一个新链

-P 定义某个链的默认策略

-R 替换链上的某条规则

-X 删除某个用户相关的链

-Z 将所有表的所有链的字节和数据包计数器清零

2.) Iptables的命令参数

-p –protocol

应用于数据包的协议类型,可以是TCP UDP ICMP或ALL。!也可使用。

当使用-p tcp时,还可使用其他可以选项,以便允许进一步定义规则。选项包括:

——sport 允许指定匹配数据包源端口.port1:port ,表示port1和port2之间的所有端口

——dport 目的端口,和——sport雷同。

当使用-p !udp时,也有特殊的选项供使包括:

——sport,——dport,与-p tcp 相同,只不过用以用于UDP包。

使用-p icmp参数时,只有一个选项可用。

——icmp-type,允许在过滤规则中指定icmp类型。

-s –source 指定数据包的源地址。该参数后跟一个IP地址,一个带有sub-net mask的网络地址,或一个主机名。(不建议使用主机名)

-d,- - destination 数据包的目的地址,同-s.

-j,——jump 用于指定一个target,告诉规则将该匹配的数据包发送到该 target。Target可以是ACCEPT,DROP,QUEUE,RETURN.如果没有-j,那么不会对数据包进行任何操作,只是将计数器加1。

-i - - in-interface ,对于INPUT FORWARD PREROUTING链,该参数指定数据包到达服务器时所使用的端口。

-o - - out-interface,对于OUTPUT FORWARD POSTROUTING链,该参数指定数据包离开服务器时使用的端口。

3.) Iptables的命令target

创建规则的最后一步是指定Iptables对数据包的操作。只要某一规则匹配该数据包,就不会再有别的规则的操作。内建的target有:ACCEPT DROP QUEUE RETURN。

ACCEPT:允许数据包通过,到达目的地。

DROP:拒绝数据包通过,丢弃该包。

QUEUE:将数据包发送回到用户应用程序处理。

RETURN:不再根据当前链的其他规则来检查数据包,而是直接返回,继续被发送到其目的地址,或下一个链。

2.应用Iptables规则 示例

允许WWW

iptables –A INPUT –p tcp –dport 80 –j ACCEPT

该规则被添加到filter表的INPUT链,允许目的端口是80的数据包。

在内部接口上允许DHCP

iptables –A INPUT –i eth0 –p tcp - - sport 68 - -dport 67 ACCEPTiptables –A INPUT –i eth0 –p ucp - -sport 68 - -dport 67 ACCEPT

以上同时允许TCP和UDP协议。

3.保存和恢复Iptables

保存Iptables

使用iptables-save可将现行的iptables规则保存,

iptables-save > iptables保存路径,如# iptables-save > /etc/iptables.up.rule

恢复Iptables

使用iptables-restore 可从配置文档恢复iptables表到现行iptables表.

iptables-restore < /etc/iptables.up.rule

二、Ubuntu Server中的Iptables

Ubuntu Server6.06中已经默认安装iptables,版本是1.3.3.默认状态是关闭。

通过修改/etc/network/interfaces可将iptables打开:

auto loIface lo inet loopbackauto eth0iface eth0 inet dhcp

#添加以下内容

pre-up iptables-restore < /etc/iptables.up.rule#call the restored rule when active the eth0post-down iptables-save > /etc/iptables.up.rule#restore the iptables rule when shutdown the interface eth0

然后重新激活eth0即可。

另外,可随时修改/etc/iptables.up.rule配置文件,来更改iptables的规则Iptables.up.rul格式如下: 行与行之间不能有空行。三.Summary

iptables表链中每条规则的顺序很重要,如果首条是accept all,那末所有的数据包都会被允许通过firewall,因此应当适当的安排规则顺序。通常的法则是:拒绝所有 允许少数.

预备知识(转): iptable有三种队列(表)规则,mangle queue, filter queue, nat queue。

1。The first is the mangle table which is responsible for the alteration of quality of service bits in the TCP header.

2。The second table is the filter queue which is responsible for packet filtering.

* Forward chain: Filters packets to servers protected by the firewall.

* Input chain: Filters packets destined for the firewall.

* Output chain: Filters packets originating from the firewall.

3。The third table is the nat queue which is responsible for network address translation. It has two built-in chains; these are:

* Pre-routing chain: NATs packets when the destination address of the packet needs to be changed.

* Post-routing chain: NATs packets when the source address of the packet needs to be changed

个人总结:

iptables执行规则时,是从从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作(accept, reject, log等),决定下一步执行的情况,后续执行一般有三种情况。

1。一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。

2。一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行

3。一种是中止所有规则队列的执行。

iptables 是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting,然后检查目的 IP 判断是否需要转送出去,接着就会跳到 INPUT 或 Forward 进行过滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并依照前述流程继续进行下一个规则炼的过滤(注意:这一点与 ipchains 不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非炼状过滤(chains)。

ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(nat:postrouting)。

REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:

iptables -A FORWARD -p TCP ——dport 22 -j REJECT ——reject-with tcp-reset

DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式 porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp ——dport 80 -j REDIRECT ——to-ports 8080

MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE ——to-ports 1024-31000

LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其它规则。例如:

iptables -A INPUT -p tcp -j LOG ——log-prefix "INPUT packets"

SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT ——to-source 194.236.50.155-194.236.50.160:1024-32000

DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。范例如下:

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 ——dport 80 -j DNAT ——to-destination 192.168.1.1-192.168.1.10:80-100

MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。

QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用……等。

RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。

MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:

iptables -t mangle -A PREROUTING -p tcp ——dport 22 -j MARK ——set-mark 2

  • *mangle
  • :PREROUTING ACCEPT [48436:11233990]
  • :INPUT ACCEPT [48436:11233990]
  • :FORWARD ACCEPT [0:0]
  • :OUTPUT ACCEPT [29730:6162034]
  • :POSTROUTING ACCEPT [29730:6162034]
  • COMMIT
  • *nat
  • :PREROUTING ACCEPT [391:49336]
  • :POSTROUTING ACCEPT [1793:110951]
  • :OUTPUT ACCEPT [1793:110951]
  • COMMIT
  • *filter
  • :INPUT DROP [0:0]
  • :FORWARD DROP [0:0]
  • :OUTPUT ACCEPT [1418:147349]
  • -A INPUT -i lo -j ACCEPT
  • -A INPUT -m state --state ESTABLISHED -j ACCEPT
  • -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
  • -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT
  • -A INPUT -p all -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
  • -A INPUT -j DROP
  • -A OUTPUT -o lo -j ACCEPT
  • -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
  • -A OUTPUT -p tcp -m tcp --sport 631 -j ACCEPT
  • COMMIT

    首先,这个iptables配置本质上使得你的计算机假装对任何不是由你发起的入站连接视而不见。这对转发包也同 样对待。这通常是一个好策略,使用:INPUT DROP和:FORWARD DROP的默认值。例外可以稍后在指定端口,地址等 等上进行创建。

    -A INPUT -i lo -j ACCEPT允许你的系统接受所有由你自己的网络适配器发起的入站请求。这对通过ping自己, 获得本地系统邮件转发(例如当你的计算机想告诉你出现故障时)等等这样的测试网络配置的操作很有用。

    -A INPUT -m state --state ESTABLISHED -j ACCEPT利用iptables的状态包过滤性能使得你可以非常灵活地为入 站包实现默认的DROP策略。这一行主要说明任何由你发起的连接将被允许继续进行连接。另外,你或许能够向另 一台服务器发送数据,但是永远不知道它是否到达,因为当服务器试图应答时你的防火墙会没有任何通知就丢弃 数据包。

    -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT允许入站SSH连接。你或许想将22端口修改为其他非标准端口, 并且确保任何想远程SSH访问上面提到的计算机的人在进行这种连接时都知道使用修改的端口。

    对于永远不应该被远程访问的系统,你应该在应用这个文件之前从中删除这一行,但我的经验是远程SSH访问是对 分布式网络进行安全管理的工具之一,因此大多数不在诸如网络上只有一台计算机的家庭桌面这样的单机系统的 人或许都希望对系统具有某种远程SSH访问。在将来你对iptables更精通之后,你可能会考虑用几行代替这一行, 那几行定义了什么资源对远程连接到计算机的尝试是有效的,所以即使在非标准端口上,没有系统攻击者能够从 错误的资源利用SSH闯入(例如一个不正确的IP地址,等等),但是这确实超出了本文讨论的范围。

    -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT允许使用通用Unix打印系统(CUPS)的网络打印机进行连接。 如果你没有这样的打印机,请删除这一行。比它更复杂,更安全的iptables规则可以被用来做同样的事情,但这 是一个相当好的起点。

    -A INPUT -p all -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT是另一“允许自我通信”的行。

    问:我用Linux作为代理让局域网里的所有机器上ADSL。用iptables设置NAT,所有的机器都

    能够上网了。现在有一个新的要求,局域网里有一台WEB服务器,需要从internet上能

    够访问,以前用Sygate作代理的时候,作过一个端口映射,将代理服务器上的端口80映

    射到Web服务器的80端口,请问用iptables应该如何来作这个映射?

    解:iptables -t nat -A PREROUTING -d "你的外网ip" --dport 80 -j DNAT --to "Web服务器ip":80

  • 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22664653/viewspace-689274/,如需转载,请注明出处,否则将追究法律责任。

    请登录后发表评论 登录
    全部评论
    MySQL DBA NoSQL DEVOPS

    注册时间:2009-10-07

    • 博文量
      1026
    • 访问量
      7825924