打造嵌入式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
- IP INPUT chain:指到达防火墙的网络数据,即发送到本地(当前)OS的Packets
- IP OUTPUT chain:本地生成的,从防火墙出去的数据,即我们要发送出去的Packets。
- 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
- PROROUTING chain:在routing之前改变packets,用于DNAT(发送之前更改目的IP),即packets到达了防火墙之后,发送到外网之前更改Destination NAT
- POSTROUTING chain:在routing字符改变packets,用于SNAT,从外网获取数据之后,在发送到局域网及其之前,更改Source NAT
- OUTPUT chain:防火墙自身产生的packet
Mangle Table
这个Table改变TCP头部的QoS bit位,有以下几张表:
- PREROUTING chain
- OUTPUT chain
- FORWARD chain
- INPUT chain
- POSTROUTING chain
Raw Table
用于配置异常情况下的处理:
- PREROUTING chain
- 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的联系与区别
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮