Chinaunix

标题: iptables 域名转向 [打印本页]

作者: triumph    时间: 2008-11-05 17:00
标题: iptables 域名转向
通过iptables,将同一IP不同域名转向内网的不同服务器

目前的情况是iptables进行域名解析,由于IP相同,导致所有域名的请求都转向同一服务器而不是对应域名的服务器

谢谢

举例说明:

两个域名:www.demo1.comwww.demo2.com
使用同一IP:61.141.77.31

网关IP设定:内网192.168.0.2,外网61.141.77.31

web服务器1 IP:192.168.0.111
web服务器2 IP:192.168.0.222

现在要把访问www.demo1.com的请求通过网关转发192.168.0.111
把访问www.demo2.com的请求通过网关转发192.168.0.222

问题是在IPTABLES里设定后,所有请求都转向了192.168.0.111

-A PREROUTING -d www.demo1.com -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.111
-A PREROUTING -d www.demo2.com -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.222

原因就在于IPTABLES在执行第一条指令时先对www.demo1.com进行了域名解析,规则实际上变成:

-A PREROUTING -d 61.141.77.31 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.111

当有访问www.demo2.com的请求时,IPTABLES认为就是对61.141.77.31的请求,结果也转向192.168.0.111
作者: funix_zjx    时间: 2008-11-05 23:49
标题: 回复 #1 triumph 的帖子
你这个需求是办不到的. 除非两个web server用不同的端口
作者: 13251947    时间: 2008-11-06 10:13
内网改成一个主机,域名由apache来判断,做域名的虚拟主机

要么你在网关的hosts里加一下解析,看看有没有效果

[ 本帖最后由 13251947 于 2008-11-6 10:14 编辑 ]
作者: vermouth    时间: 2008-11-06 12:35
iptables 需要加模块才能对域名做限制吧。
作者: defage    时间: 2008-11-06 13:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: triumph    时间: 2008-11-11 14:13
其实是这样的, 我在IDC有1台机器, centos5  我用xen在上面虚拟了4个linux ,我想给每个linux 一个域名,然后通过域名访问linux上的服务 比如 web  mysql  等等,
请问这要怎么做啊
作者: kns1024wh    时间: 2008-11-13 22:13
标题: 回复 #1 triumph 的帖子
如果你结合tc就是可以的
作者: 剑次狼    时间: 2008-11-14 10:39
手上现在没测试环境,你可以试试这样可以不
-A PREROUTING -m string --algo bm --string "www.demo1.com" -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.111
-A PREROUTING -m string --algo bm --string "www.demo1.com" -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.222
作者: kns1024wh    时间: 2008-11-14 14:11
标题: 回复 #8 剑次狼 的帖子
打上标记也是可以的
通过防火墙的访问标记,指定路由信息更加的合理
作者: wendaozhe    时间: 2009-01-14 09:58
原帖由 kns1024wh 于 2008-11-13 22:13 发表
如果你结合tc就是可以的

请教,何解?
作者: chenyx    时间: 2009-01-14 10:01
试试nginx做前端
作者: wendaozhe    时间: 2009-01-14 10:01
原帖由 剑次狼 于 2008-11-14 10:39 发表
手上现在没测试环境,你可以试试这样可以不
-A PREROUTING -m string --algo bm --string "www.demo1.com" -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.111
-A PREROUTING -m string --al ...

经测试无效。
作者: wendaozhe    时间: 2009-01-14 10:06
原帖由 chenyx 于 2009-1-14 10:01 发表
试试nginx做前端

就是想在iptables、tc、squid、中解决,squid太复杂,得用rewrite url ,幻想不增加服务的情况下的简单解决方法。
作者: wendaozhe    时间: 2009-01-14 10:43
原帖由 kns1024wh 于 2008-11-14 14:11 发表
打上标记也是可以的
通过防火墙的访问标记,指定路由信息更加的合理

肯定是不行的,iptables只认ip,最终不同的域名还是会解析到同一个ip!
作者: wendaozhe    时间: 2009-01-14 10:46
看来是无解了,只有仰仗nginx、varnish等来解决了!
作者: platinum    时间: 2009-01-14 11:42
目前的 iptables 是无法实现的
因为 iptables 工作在网络层,他看到的仅仅是数据包
domain 存放在两种数据包中
1、DNS 请求的 udp 包
2、HTTP 请求头部的 host 字段

对于 1 来说,我们得不到它,因为 DNS 请求是去放用户设置的 DNS 地址的,而且即便获得到了也做不了什么
对于 2 来说,我们虽然可以获得 host 字段具体域名,但如果在获得后再转向的话,前面的 connection 已经建立了,后面突然转向就未被了 TCP 工作原理,理论上是无法实现的

但是,利用 squid 或者 nginx 却是可以实现的,他们相当于七层代理,完全把 HTTP 请求截获,换成新的请求发向内网,得到信息再回传给客户,这样可行

至于前面有人说的 mark、tc 等,都是理论上行不通的,违反了 OSI 七层模型中 TCP 传输原理
作者: wendaozhe    时间: 2009-01-14 12:24
标题: 回复 #16 platinum 的帖子
十分感谢,讲得很透!
作者: gamester88    时间: 2009-10-12 13:46
标题: 回复 #16 platinum 的帖子
拓扑
                                  ISP  221.11.1.67
                                    |                                              /192.168.1.254
                                    |              10.0.0.2543           /
         221.11.1.68     路由器       -----------           防火墙   -------------交换机
                                     10.0.0.254                                       |
                                                                              www服务器 192.168.1.253
                                                                               mail服务器 192.168.1.250


白金版主,我今天也是要做这个
  1. /sbin/iptables -t nat -A PREROUTING -d www.nihao.com -p tcp -dport 80 -j DNAT --to 192.168.1.253
  2. /sbin/iptables -t nat -A PREROUTING -d mail.nihao.com -p tcp -dport 80 -j DNAT --to 192.168.1.250
复制代码

第一种情况:
也就是说DNS解析的时候
www.nihao.com 为   221.11.1.68
mail.nihao.com也为   221.11.1.68
的话,需要加nginx来做代理,从外网可以访问这两个,是吧

第二种情况:
DNS解析的时候
www.nihao.com 为 221.11.1.68
mail.nihao.com   为221.11.1.69
的时候,外网直接就可以访问了是吧

[ 本帖最后由 gamester88 于 2009-10-12 13:47 编辑 ]
作者: bigarade    时间: 2009-10-12 17:15
这个起虚拟主机可行不?
作者: gamester88    时间: 2009-10-15 09:16
标题: 回复 #18 gamester88 的帖子
我这个是两个外网的地址
在路由器上做了221.11.1.68和221.11.1.69的80端口映射到10.0.0.253上的80和8080了,然后在防火墙上
  1. # iptables -t nat -A PREROUTING -d mail.nihao.com -p tcp -dport 80 -j DNAT --to 192.168.1.253
  2. iptables v1.4.3: multiple -d flags not allowed
  3. Try `iptables -h' or 'iptables --help' for more information.
复制代码

报错,于是
iptables -t nat -A PREROUTING -d 10.0.0.253 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.253
iptables -t nat -A PREROUTING -d 10.0.0.253 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.250:80
这样在外网输入两个域名都可以了

问老大还有别的简洁办法没
作者: cexoyq    时间: 2009-10-31 16:20
出个馊主意,我并没测试过,楼主可以试下。
楼主在IPTABLES主机里的hosts文件里写入:
www.demo1.com 61.141.77.31
www.demo2.com 61.141.77.30
,
然后再:
-A PREROUTING -d www.demo1.com -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.111
-A PREROUTING -d www.demo2.com -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.222


不知道成不成,各位大大不要见笑。首次发贴帮顶.
作者: itxx    时间: 2012-03-21 12:02
回复 20# gamester88

这下面是网上看到的做法,你可以参考下看是否合用,1.211和1.212相当于外网IP,122网段相当于内网IP。

iptables -I FORWARD -i eth0 -o virbr0 -p tcp -m state --state NEW -j ACCEPT
iptables -t nat -A PREROUTING -d 192.168.1.211 -i eth0 -p tcp -j DNAT --to-destination 192.168.122.41
iptables -t nat -A PREROUTING -d 192.168.1.212 -i eth0 -p tcp -j DNAT --to-destination 192.168.122.42
iptables -t nat  -A POSTROUTING -s 192.168.122.41 -d ! 192.168.122.0/255.255.255.0 -j SNAT --to-source 192.168.1.211
iptables -t nat  -A POSTROUTING -s 192.168.122.42 -d ! 192.168.122.0/255.255.255.0 -j SNAT --to-source 192.168.1.212
   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2