LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4193|回复: 6

如何让内网用户使用外网IP访问处于内网的WEB服务

[复制链接]
发表于 2007-5-14 19:41:20 | 显示全部楼层 |阅读模式
环境是这样的:
192.168.1.250是WEB服务器.上面提供了WEB服务

192.168.1.254是网关,Linux系统+iptables代理192.168.1.0/24整个网段上网.此机有一个外网固定IP,假设为:A.B.C.D
在iptables中加了端口映射,外网访问A.B.C.D的80端口时就转到192.168.1.250:80去.

申请了一个域名指定其IP到A.B.C.D

现在的问题是如何使内网的用户不需要作任何调整就可以直接使用域名来访问位于192.168.1.250上的WEB服务.

需要在iptables中怎么设置才能达到此要求?

请各位朋友赐教.在此先感谢了
发表于 2007-5-15 12:52:14 | 显示全部楼层
iptables -t nat -A POSTROUTING -d 192.168.1.250 -j SNAT --to 192.168.1.254
回复 支持 反对

使用道具 举报

发表于 2007-5-16 10:21:34 | 显示全部楼层
清仔细阅读iptables指南1.1.19中文版~~~
http://iptables-tutorial.frozent ... LTXTSCRIPTSTRUCTURE


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服务器时会发生什么,能正常访问吗?你觉得呢很可惜,现在的配置还是不行,仔细想想就明白了。我们这里讨论的基础都是假设机子访问的是HTTP服务器的外网地址,但这个外网地址其实就是防火墙对外的地址,所以当防火墙访问这个外网地址时,就是访问它自己。防火墙上如果有HTTP服务,那客户机就会看到页面内容,不过这不是它想看到的(它想要的在DNAT上了),如果没有HTTP服务,客户就只能收到错误信息了。前面给出的规则之所以不起作用是因为从防火墙发出的请求包不会经过那两条链。还记得防火墙自己发出的包经过哪些链吧我们要在nat表的OUTPUT链中添加下面的规则:

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

有了最后这条规则,一切都正常了。和HTTP服务器不在同一个网的机子能正常访问服务了,和它在一个网内的机子也可以正常访问服务了,防火墙本身也能正常访问服务了,没有什么问题了。这种心情,套用《大话西游》里的一句话,就是“世界又清净了”。(不要说你不知道什么是《大话西游》)

Note        

我想大家应该能明白这些规则只说明了数据包是如何恰当地被DNAT和SNAT的。除此之外,在 filter表中还需要其他的规则(在FORWARD链里),以允许特定的包也能经过前面写的(在POSTROUTING链和 OUTPUT链里的)规则。千万不要忘了,那些包在到达FORWARD链之前已经在PREROUTING链里被DNAT过了,也就是说它们的目的地址已被改写,在写规则时要注意这一点。
回复 支持 反对

使用道具 举报

发表于 2007-5-16 10:22:29 | 显示全部楼层
多发了个---去掉~~呵呵
回复 支持 反对

使用道具 举报

发表于 2007-5-21 17:24:08 | 显示全部楼层
首先,外网用户可否访问你的内网网站?
可以的话我认为用域名即可。

内网客户机访问内网服务器,用内网ip
内网客户机访问外网服务器,用外网ip

然后在网关上加双向路由即可。
回复 支持 反对

使用道具 举报

发表于 2007-8-20 15:17:28 | 显示全部楼层
三楼的辛苦了。
iptables -t nat -A POSTROUTING -d 192.168.1.250 -j SNAT --to 192.168.1.254
这个简单多了
回复 支持 反对

使用道具 举报

发表于 2007-8-21 15:40:44 | 显示全部楼层
iptables -t nat -A PREROUTING -i <LAN interface> -p tcp --sport 1024:65535 -d 192.168.1.254 -j DNAT --to-destination 192.168.1.250:80

iptables -t nat -A PREROUTING -i <public interface> -p tcp --sport 1024:65535 -d A.B.C.D -j DNAT --to-destination 192.168.1.250:80
说明
public interface外网网卡如eth0
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表