linux转发请求命令 linux转发数据包

【转载】通过iptables实现端口转发和内网共享上网【出处】
【作者】张天成linux转发请求命令,zhangtiancheng@gmail.com
iptables操作的是2.4以上内核的netfilter,所以需要 linux的内核在2.4以上 。其功能与安全性远远比其前辈 ipfwadm, ipchains强大,iptables大致是工作在OSI七层的二、三、四层,其前辈ipchains不能单独实现对tcp/udp port以及对mac地址的的定义与操作 , 所以我想ipchains应该是仅仅工作在三层的 。
我们先简单介绍一下netfilter的大致工作流程 , 也就是一个数据包(或者叫分组、packet,我个人习惯叫包)在到达linux的网络接口的时候 (网卡)如何处理这个包,然后再介绍一下如何用iptables改变或者说控制对这个数据包进行操作 。
netfilter内部分为三个表,分别是 filter,nat,mangle,每个表又有不同的操作链(Chains) 。
下面有一张图清晰的描绘了netfilter对包的处理流程(该图摘自网上,不知作者是谁,在此深表敬意linux转发请求命令?。? ,一般情况下,我们用不到这个mangle表,在这里我们就不做介绍了 。
当一个包来到Linux的网络接口的时候先执行PREROUTING操作,依次经过mangle、nat的PREROUTING链 。从这个Chain的名字我们可以看出,这个Chain是在路由之前(pre-routing)要过的 。为什么要在路由之前过呢?因为在这个链里面我们对包的操作是DNAT,也就是改变目的地址和(或端口),通常用在端口转发(修改P
ort),或者NAT到内网的DMZ区(修改地址) 。
环境配置如下:
我们怎么样能让Internet用户通过公网IP访问内部的web服务器呢? 在这个PREROUTING链上定义一个规则 , 把访问60.1.1.1:80的用户的目的地址改变一下,改变为10.1.1.2:80,这样就实现了internet用户对内网服务器的访问了 。当然,这个端口是比较灵活的,我们可以定义任何一个端口的转发,不一定是80--80 。具 体的命令我们在下面的例子中介绍 , 这里我们只谈流程与概念上的实现方法 。
好了,我们接着往下走 , 来到图中下方的那个菱形(FORWARD),转发!
默认情况下,当Linux收到了一个目的IP地址不是本地IP的包 , Linux会把这个包丢弃 。因为默认情况下,Linux的三层包转发功能是关闭的,如果要让我们的Linux实现转发,则需要打开这个转发功能 , 可以 改变它的一个系统参数 , 使用如下命令打开转发功能:
处理顺序上,依然是mangle优先、随后流经filter的FORWOARD链 。我们操作任何一个链都会影响到这个包的命运,在 下面的介绍中,我们就忽略掉mangle表,我们基本用不到操作它,所以我们假设它是透明的 。假设这个包被我们的规则放过去了,也就是ACCEPT了,它将进入POSTROUTING部分 。
注意!这里我注意到一个细节问题,也就是上面的图中数据包过了FORWARD链之后直接进入了POSTROUITNG 链,我觉得这中间缺少一个环节 , 也就是ROUTING 。对于转发的包来说,Linux同样需要在选路(路由)之后才能将它送出,这个图却没有标明这一点,我认为它是在过了ROUTING之后才进入的POSTROUITNG 。当然了,这对于我们讨论iptables的过滤转发来说不是很重要,只是我觉得流程上有这个问题,还是要说明 一下 。
POSTROUTING链是数据包要送出这台Linux的最后一个环节了,也是极其重要的一个环节 。这个时候Linux已经完成了对这个包的路由(选路工作),已经找到了合适的接口送出这个包了,在这个链里面我们要进行重要的操作 , 就是被Linux称为 SNAT的一个动作,修改源IP地址!
为什么修改源IP地址?最常见的就是我们内网多台机器需要共享一个或几个公网IP访问 Internet 。因为我们的内网地址是私有的,假如就让Linux给路由出去 , 源地址也不变,这个包能访问到目的地,但却回不来 。因为 Internet上的路由节点不会转发私有地址的数据包 , 也就是说,不用合法IP,我们的数据包有去无回 。

推荐阅读