iptables

学习网址:

一个关于转发的教程:

iptables:

  • 用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。

工作机制

iptables 是工作在用户空间中,定义规则的工具,本身并不算是防火墙。

它定义的规则,可以让在内核空间当中的 netfilter 来读取,并且实现让防火墙工作。所以这些规则放入内核的地方必须要是特定的位置,必须是 tcp/ip 的协议栈经过的地方,这个 tcp/ip 协议栈必须经过且可以实现读取规则的地方就叫做 netfilter(网络过滤器)。这些特定的位置包括:

  1. 内核空间中:从一个网络接口进来,到另一个网络接口去的位置
  2. 数据包从内核流入用户空间的位置
  3. 数据包从用户空间流出的位置
  4. 进入/离开本机的外网接口
  5. 进入/离开本机的内网接口

由上我们知道了 iptables 选择了 5 个位置来作为控制的地方。

但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。

那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做 NAT 和 DNAT 的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。

这五个位置放置了五个钩子函数(hook functions),也叫五个规则链:

  1. PREROUTING (路由前)

  2. INPUT (数据包流入口)

  3. FORWARD (转发管卡)

  4. OUTPUT(数据包流出口)

  5. POSTROUTING(路由后)

这是 netfilter 规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

策略

防火墙策略一般分为两种:

  • 一种叫“通”策略,认门是关着的,必须要定义谁能进。
  • 一种叫“堵”策略,大门是洞开的,但是你必须有身份认证,否则不能进。

当我们定义策略时,要分别定义多条功能:定义数据包 → 允许或不允许;filter → 过滤的功能;地址转化 → NAT 选项。为了让这些功能交替工作,我们制定出 “表” 的概念,来定义、区分各种不同的工作功能和处理方式。

我们现在用的比较多个功能有3个:

  1. filter 定义允许或者不允许的 → 一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT。

  2. nat 定义地址转换的 → 一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING。

  3. mangle 功能:修改报文原数据 → 5 个链都可以做。

PostScriptiptables/netfilter 这款软件是工作在用户空间的,它的规则立即生效,不是一种服务。而我们 iptables 现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。

注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。

规则的写法

iptables 定义规则的方式:

1
iptables -t <table> <COMMAND> [chain] <CRETERIA> -j <ACTION>
  • tablefilter, nat, mangle
  • COMMAND: 定义如何对规则进行管理
  • chain: 定义接下来的规则是在哪个链上,当定义策略时,是可以省略的。
  • CRETERIA: 指定匹配的标准。
  • ANCTION: 指定如何进行处理或称处理的方式。

可以使用以下的命令查看定义规则的详细信息:

1
$ iptables -L -n -v