Linux中的iptables,netfilter,转发以及NAT规则

1. iptables的表格与链

1.1. Linuxs的iptables里面至少有三个表格(table)

  • Filter(过滤器):主要和进入Linux的数据包有关,是默认的tables;
  • NAT (地址转换):Network Address Translation的缩写,这个表格主要用来进行数据包的源地址以及目的地址的IP和Port的转换;
  • Mangle:不做过多讨论

1.2. 每个表格又含多个链(chain)

  1. Filter过滤器的链
  • INPUT: 定义规则过滤想要进入Linux主机的数据包;
  • OUTPUT:处理Linux主机想要送出去的数据包;
  • FORWARD:与当前的Linux主机无关,需要转发到其他计算机的包;
  1. NAT地址转换的链
  • PREROUTING:进行路由判断前要遵循的规则;
  • POSTROUTING:进行路由判断后要遵循的规则;
  • OUTPUT:过滤发出去的数据包
  1. 这些默认表格和链怎么相互工作
    这里不考虑Mangle表格,参看如下简化后netfilter流程图


    Linux中的iptables,netfilter,转发以及NAT规则_第1张图片
  • 路径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

你可能感兴趣的:(Linux中的iptables,netfilter,转发以及NAT规则)