手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Iptables 指南 1.1.19(中文版)(三)

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
SNAT的语法和这个target的相同,只是目的不同罢了。要注意,只有先用--protocol指定了TCP或 UDP协议,才能使用端口。

因为DNAT要做很多工作,所以我要再罗嗦一点。我们通过一个例子来大致理解一下他是如何工作的。比如,我想通过Internet连接发布我们的网站,但是HTTP server在我们的内网里,而且我们对外只有一个合法的IP,就是防火墙那个对外的IP——$INET_IP。防火墙更有一个内网的IP——$LAN_IP,HTTP server的IP是$HTTP_IP (这当然是内网的了)。为了完成我们的设想,要做的第一件事就是把下面的这个简单的规则加入到nat表的PREROUTING链中:

iptables -t nat -A PREROUTING --dst $INET_IP -p tcp --dport 80 -j DNAT \ --to-destination $HTTP_IP

现在,任何从Internet来的、到防火墙的80端口去的包都会被转发(或称做被DNAT )到在内网的HTTP服务器上。假如您在Internet上试验一下,一切正常吧。再从内网里试验一下,完全不能用吧。这其实是路由的问题。下面我们来好好分析这个问题。为了容易阅读,我们把在外网上访问我们服务器的那台机子的IP地址记为$EXT_BOX

  1. 包从地址为$EXT_BOX的机子出发,去往地址为$INET_IP 的机子。

  2. 包到达防火墙。

  3. 防火墙DNAT(也就是转发)这个包,而且包会经过很多其他的链检验及处理。

  4. 包离开防火墙向$HTTP_IP前进。

  5. 包到达HTTP服务器,服务器就会通过防火墙给以回应,当然,这需要把防火墙作为HTTP到达$EXT_BOX的网关。一般情况下,防火墙就是HTTP服务器的缺省网关。

  6. 防火墙再对返回包做Un-DNAT(就是照着DNAT的步骤反过来做一遍),这样就似乎是防火墙自己回复了那个来自外网的请求包。

  7. 返回包好象没经过这么复杂的处理、没事相同回到$EXT_BOX

现在,我们来考虑和HTTP服务器在同一个内网(这里是指任何机子无需经过路由器而能够直接互相访问的网络,不是那种把服务器和客户机又分在不同子网的情况)的客户访问他时会发生什么。我们假设客户机的IP为$LAN_BOX,其他配置同上。

  1. 包离开$LAN_BOX,去往$INET_IP

  2. 包到达防火墙。

  3. 包被DNAT,而且还会经过其他的处理。但是包没有经过SNAT 的处理,所以包还是使用他自己的源地址,就是$LAN_BOX(译者注:这就是IP 传输包的特点,只根据目的地的不同改变目的地址,但不因传输过程中要经过很多路由器而随着路由器改变其源地址,除非您单独进行源地址的改变。其实这一步的处理和对外来包的处理是相同的,只但是内网包的问题就在于此,所以这里交待一下原因)。

  4. 包离开防火墙,到达HTTP服务器。

  5. HTTP服务器试图回复这个包。他在路由数据库中看到包是来自同一个网络的一台机子,因此他会把回复包直接发送到请求包的源地址(现在是回复包的目的地址),也就是$LAN_BOX

  6. 回复包到达客户机,但他会很困惑,因为这个包不是来自他访问的那台机子。这样,他就会把这个包扔掉而去等待“真正”的回复包。

针对这个问题有个简单的解决办法,因为这些包都要进入防火墙,而且他们都去往需要做DNAT才能到达的那个地址,所以我们只要对这些包做SNAT操作即可。比如,我们来考虑上面的例子,假如对那些进入防火墙而且是去往地址为$HTTP_IP、端口为80的包做SNAT操作,那么这些包就好象是从$LAN_IP来的了,也就是说,这些包的源地址被改为$LAN_IP了。这样,HTTP服务器就会把回复包发给防火墙,而防火墙会再对包做 Un-DNAT操作,并把包发送到客户机。解决问题的规则如下:

iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \ --to-source $LAN_IP

要记住,按运行的顺序POSTROUTING链是任何链中最后一个,因此包到达这条链时,已被做过DNAT操作了,所以我们在规则里要基于内网的地址$HTTP_IP(包的目的地)来匹配包。

Warning

警告:我们刚才写的这条规则会对日志产生很大影响,这种影响应该说是很不好的。因为来自 Internet包在防火墙内先后经过了DNAT和SNAT处理,才能到达HTTP服务器(上面的例子),所以HTTP服务器就认为包是防火墙发来的,而不知道真正的源头是其他的IP。这样,当他记录服务情况时,任何访问记录的源地址都是防火墙的IP而不是真正的访问源。我们假如想根据这些记录来了解访问情况就不可能了。因此上面提供的“简单办法”并不是个明智的选择,但他确实能够解决“能够访问”的问题,只是没有考虑到日志而已。

其他的服务也有类似的问题。比如,您在LAN内建立了SMTP服务器,那您就要配置防火墙以便能转发SMTP的数据流。这样您就创建了一个开放的SMTP中继服务器,随之而来的就是日志的问题了。

一定要注意,这里所说的问题只是针对没有建立DMZ或类似结构的网络,并且内网的用户访问的是服务器的外网地址而言的。(译者注:因为假如建立了DMZ,或服务器和客户机又被分在不同的子网里,那就无需这么麻烦了。因为任何访问的源头都不在服务器所在的网里,所以就没必要做SNAT去改变包的源地址了,从而记录也就不是问题了。假如内网客户是直接访问服务器的内网地址那就更没事了)

较好的解决办法是为您的LAN在内网建立一台单独的DNS服务器(译者注:这样,内网的客户使用网站名访问HTTP服务器时,DNS就能够把他解析成内网地址。客户机就能够直接去访问HTTP服务器的内网地址了,从而避免了通过防火墙的操作,而且包的源地址也能够被HTTP服务器的日志使用,也就没有上面说的日志问题了。),或干脆建立DMZ得了(这是最好的办法,但您要有钱哦,因为用的设备多啊)。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!