Iptables 指南 1.1.19(中文版)(三)
因为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。
包从地址为$EXT_BOX的机子出发,去往地址为$INET_IP 的机子。
包到达防火墙。
防火墙DNAT(也就是转发)这个包,而且包会经过很多其他的链检验及处理。
包离开防火墙向$HTTP_IP前进。
包到达HTTP服务器,服务器就会通过防火墙给以回应,当然,这需要把防火墙作为HTTP到达$EXT_BOX的网关。一般情况下,防火墙就是HTTP服务器的缺省网关。
防火墙再对返回包做Un-DNAT(就是照着DNAT的步骤反过来做一遍),这样就似乎是防火墙自己回复了那个来自外网的请求包。
返回包好象没经过这么复杂的处理、没事相同回到$EXT_BOX。
现在,我们来考虑和HTTP服务器在同一个内网(这里是指任何机子无需经过路由器而能够直接互相访问的网络,不是那种把服务器和客户机又分在不同子网的情况)的客户访问他时会发生什么。我们假设客户机的IP为$LAN_BOX,其他配置同上。
包离开$LAN_BOX,去往$INET_IP。
包到达防火墙。
包被DNAT,而且还会经过其他的处理。但是包没有经过SNAT 的处理,所以包还是使用他自己的源地址,就是$LAN_BOX(译者注:这就是IP 传输包的特点,只根据目的地的不同改变目的地址,但不因传输过程中要经过很多路由器而随着路由器改变其源地址,除非您单独进行源地址的改变。其实这一步的处理和对外来包的处理是相同的,只但是内网包的问题就在于此,所以这里交待一下原因)。
包离开防火墙,到达HTTP服务器。
HTTP服务器试图回复这个包。他在路由数据库中看到包是来自同一个网络的一台机子,因此他会把回复包直接发送到请求包的源地址(现在是回复包的目的地址),也就是$LAN_BOX。
回复包到达客户机,但他会很困惑,因为这个包不是来自他访问的那台机子。这样,他就会把这个包扔掉而去等待“真正”的回复包。
针对这个问题有个简单的解决办法,因为这些包都要进入防火墙,而且他们都去往需要做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(包的目的地)来匹配包。
![]() | 警告:我们刚才写的这条规则会对日志产生很大影响,这种影响应该说是很不好的。因为来自 Internet包在防火墙内先后经过了DNAT和SNAT处理,才能到达HTTP服务器(上面的例子),所以HTTP服务器就认为包是防火墙发来的,而不知道真正的源头是其他的IP。这样,当他记录服务情况时,任何访问记录的源地址都是防火墙的IP而不是真正的访问源。我们假如想根据这些记录来了解访问情况就不可能了。因此上面提供的“简单办法”并不是个明智的选择,但他确实能够解决“能够访问”的问题,只是没有考虑到日志而已。 其他的服务也有类似的问题。比如,您在LAN内建立了SMTP服务器,那您就要配置防火墙以便能转发SMTP的数据流。这样您就创建了一个开放的SMTP中继服务器,随之而来的就是日志的问题了。 一定要注意,这里所说的问题只是针对没有建立DMZ或类似结构的网络,并且内网的用户访问的是服务器的外网地址而言的。(译者注:因为假如建立了DMZ,或服务器和客户机又被分在不同的子网里,那就无需这么麻烦了。因为任何访问的源头都不在服务器所在的网里,所以就没必要做SNAT去改变包的源地址了,从而记录也就不是问题了。假如内网客户是直接访问服务器的内网地址那就更没事了) 较好的解决办法是为您的LAN在内网建立一台单独的DNS服务器(译者注:这样,内网的客户使用网站名访问HTTP服务器时,DNS就能够把他解析成内网地址。客户机就能够直接去访问HTTP服务器的内网地址了,从而避免了通过防火墙的操作,而且包的源地址也能够被HTTP服务器的日志使用,也就没有上面说的日志问题了。),或干脆建立DMZ得了(这是最好的办法,但您要有钱哦,因为用的设备多啊)。
文章整理:西部数码--专业提供域名注册、虚拟主机服务 相关文章
热点关注
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源 网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧 行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒 网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer 网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash 程序设计 Java技术 C/C++ VB delphi 网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术 操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD |




