打造嵌入式ARM Linux防火墙:1. iptables基础

2019-07-12 17:38发布

iptables 包含多个tables,tables中可以包含多个chains,chains可以是自定义也可以是builtin的,其可以包含多个rules。 而rules对应的是packets

iptables的4个内置tables

1. Filter Table

iptables的默认table,因此如果不指定,那么默认就使用的是这个。 Filter Table的3个内置Chains
  1. IP INPUT chain:指到达防火墙的网络数据,即发送到本地(当前)OS的Packets
  2. IP OUTPUT chain:本地生成的,从防火墙出去的数据,即我们要发送出去的Packets。
  3. IP FORWARD chain:当前系统中其他NIC(网卡)发过来的数据,一般是本地Router。

2. NAT Table

什么是NAT

NAT是Network Address Translation的缩写,分为SNAT与DNAT,即Source NAT与Destination NAT

为何需要NAT

主要是处于多个终端共享外网IP(假设使用路由器联网)的时候,需要路由器等设备来进行转发,那么对于外部而言,如果要传数据过来,那么它会指定Destination 的IP为这个路由器的IP,而不是路由器内部的局域网中的机器。 一般,防火墙(ipbatables)位于与外网的接口处,可以“简单的认为”其在路由器上,因此iptables需要对来到路由器的数据进行转发,传送到对应的内网终端中。 而NAT Table中的规则的作用就是,在packet转送的时候更改NAT,从而使数据正确到达终端或者外网。

与NAT相关的iptables中的MASQUERADE

MASQUERADE的作用是在一个动态的IP下,自动的获取某个网卡的IP地址来作NAT,例如PPPoE拨号上网可能每一次传输数据后IP地址变了。

对此NAT有三个builtin的Chains

  1. PROROUTING chain:在routing之前改变packets,用于DNAT(发送之前更改目的IP),即packets到达了防火墙之后,发送到外网之前更改Destination NAT
  2. POSTROUTING chain:在routing字符改变packets,用于SNAT,从外网获取数据之后,在发送到局域网及其之前,更改Source NAT
  3. OUTPUT chain:防火墙自身产生的packet

Mangle Table

这个Table改变TCP头部的QoS bit位,有以下几张表:
  1. PREROUTING chain
  2. OUTPUT chain
  3. FORWARD chain
  4. INPUT chain
  5. POSTROUTING chain
Raw Table 用于配置异常情况下的处理:
  1. PREROUTING chain
  2. OUTPUT chain

iptables的规则 先是三个规则:
    Rules包括一个准则和一个目标(target)
    如果准则条件,就执行目标(target)中的rule的规定。
    如果不满足条件,就判断下一条Rules。

Packet flow

网上找了两张图片,下面这张展示从packet flow的进入到离开,水平方向展示了input path到forward path再到output path中的chain,而垂直方面为TCP/IP中不同层次经过的table/chain



下图为简洁版的Process流程,注意颜 {MOD},不同的颜 {MOD}分别属于前面介绍过的那些table中的chain:


参考

Quick HOWTO : Ch14 : Linux Firewalls Using iptables https://en.wikipedia.org/wiki/Netfilter ebtables/iptables interaction on a Linux-based bridge 
iptables: SNAT, DNAT, MASQUERADE的联系与区别