1. iptables的表格与链
1.1. Linuxs的iptables里面至少有三个表格(table)
- Filter(过滤器):主要和进入Linux的数据包有关,是默认的tables;
- NAT (地址转换):Network Address Translation的缩写,这个表格主要用来进行数据包的源地址以及目的地址的IP和Port的转换;
- Mangle:不做过多讨论
1.2. 每个表格又含多个链(chain)
- Filter过滤器的链
- INPUT: 定义规则过滤想要进入Linux主机的数据包;
- OUTPUT:处理Linux主机想要送出去的数据包;
- FORWARD:与当前的Linux主机无关,需要转发到其他计算机的包;
- NAT地址转换的链
- PREROUTING:进行路由判断前要遵循的规则;
- POSTROUTING:进行路由判断后要遵循的规则;
- OUTPUT:过滤发出去的数据包
-
这些默认表格和链怎么相互工作
这里不考虑Mangle表格,参看如下简化后netfilter流程图
- 路径A:数据包经过路由判断后,是向Linux主机发起的,经过Filter:INPUT链进行数据控制;
- 路径B:数据包是要转发走的,则先经过Filter:FORWARD的处理,然后经过NAT:POSTROUTING;
- 路径C:数据包是从Linux本机送出去的;
2. 转发和NAT规则
多数的组织都只能分配到有限的公网IP地址。那么一个公司里面局域网(LAN)内的那么多节点要是上网就只能使用内网IP,这个时候就需要有一个Edge路由(比如说防火墙)可以从WAN上接受传输然后路由到内网节点上;同时防火墙/网关要可以吧局域网节点的数据包路由到WAN上。这个时候iptables就提供了路由和转发的策略来防止一些异常使用网络资源的行为。
2.1. FORWARD策略
'FORWARD'策略允许管理者来控制局域网内数据包转发到哪里去。举个例子来说,为了允许局域网内的数据包转发,假设网关上分配了一个内网IP地址给eth1,那么我们就需要添加如下的一条转发规则
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
这条规则就允许防火墙后面的系统来访问内部网络了,网关会把一个局域网内节点的数据包路由到另一个节点,通过eth1这个设备来传递所有数据包。
2.2. IP伪装
允许通过防火墙的内网IP地址进行数据包转发后,局域网内节点之间就可以相互通信了;但是这个时候还是不能访问外网,我们还必须配置防火墙的IP伪装,这个过程中会使用防火墙的外网地址(这里举例的外网网卡是eth0)来替代LAN节点上过来的数据包的内网IP。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-t nat
代表NAT表;-A POSTROUTING
指定NAT上的POSTROUTING链; -j MASQUERADE
指定了要用外网IP来替换数据包上的内网IP
2.3. DNAT设置
如果你的内网有个服务器,你想把它配置成外网可以访问,你可以使用-j DNAT
来配置NAT表的PREROUTING链来指定一个内网IP用于外网发过来的数据包请求的转发。举个例子来说,如果你希望转发一个HTTP请求到你指定HTTP服务器:172.31.0.23,可以运行如下的命令:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
--to 172.31.0.23:80
这条规则指定了NAT表中的内建链PREROUTING把所有收到的HTTP请求都转发到目的地址172.31.0.23
Note
如果你的FORWARD链中有一条默认的策略DROP,你必须添加一条规则来允许转发收到的HTTP请求,只有这样目的的NAT路由才有可能,
iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT