为了能够让北方网通和南方电信用户都可以快速的访问网站,解决办法就是托管 到双线机房。

双线机房有两类:

一类是通过BGP技术实现互联互通,服务器只需要一个网卡一个IP地址就可以了,由机房进行路由的智能判断,选择合适的路由访问,这样对于网站来说是很方便的,但BGP机房一般带宽都比较少,流量高一些的话可能 就没有办法了。

另外一种就是双线双IP的机房,带宽可能更高一些,但是路由配置极其复杂。

现在主要讲第二种:

服务器需要至少两个网卡,一个网卡接电信网关,一个网卡接网通网关,来实现互联互通。如果多台服务器的话,还需要第3个网卡组建内网进行内网通讯。


这里有两种方法:

第一种:通过DNSpod进行智能解析:

对于双线双IP的服务器来说,要解决两个问题:

一、你的网站用户究竟走那个IP来访问你的服务器

二、你的网站内容究竟走那个IP返回给用户

对于第1个问题,可以使用智能DNS解析来解决,即DNS服务器判断用户所在IP地址,如果用户是电信接入,就把服务器的电信IP解析给他;如果用户是网通接入,就把服务器的网通IP解析给他。

智能DNS可以自己基于开源的DNS软件来定制,不过国内有一个很好的免费智能DNS服务器提供商:DNSPod,推荐使用DNSPod的服务。他就可以实现上述的智能DNS解析。


DNSPod双线解析

假设双线机房的两种线路为电信、联通

[要让联通用户通过联通线路来访问]

[电信用户通过电信线路来访问]


要实现以上效果,在DNSPod内需要添加以下记录:



注:[默认]必须设置,因这里的[线路类型]指的是地方宽带运营商的线路;

不设置[默认],那么只有单独指定的线路用户可以访问网站,其他线路用户无法访问网站。

[默认]指向‘电信’服务器的IP即可,因‘电信’的带宽大,其他线路的用户访问‘电信’服务器会快些。



对于第2个问题,则需要在服务器上面配置路由规则,来决定究竟如何处理数据的返回路径问题。

1、填写静态路由表

因为服务器有两个IP,分别在不同的网段,你使用电信IP的网关做路由,那么网通的IP地址用户压根就访问不到,反之亦然。目前流行的解决办法,就 是使用电信网关做默认的路由,然后自己手工填写所有网通IP地址段的路由规则。这个办法可以Google搜索到一大把,不展开了。

这种办法的缺点是添加规则太多太麻烦,而且难免挂一漏万,如果你漏了一些网段,那这些网段的用户就访问不了你的网站了。况且网段地址的分布总是在不断变化的,你还必须定期更新路由表。

2、根据用户访问进来的路径设定动态路由

就是说如果用户是通过电信IP地址访问过来的话,那么使用电信网关做路由,返回内容走电信网关;如果用户通过网通IP地址访问过来的话,那么使用网 通网关做路由,返回内容走网通的网关,这样就不必那么麻烦的维护路由表了。以JavaEye网站服务器为例,具体配置方法如下:

JavaEye网站服务器电信IP:114.80.66.199,电信网关:114.80.66.1

JavaEye网站服务器网通IP:60.29.231.190,网通网关:60.29.231.1

1) 默认网关使用电信网关作为路由

在Linux上面配置默认网关,如果是RedHat,应该是在/etc/sysconfig/network文件里面添加一 行:GATEWAY=114.80.66.1,如果是SuSE,应该是在/etc/sysconfig/network/routes里面添加一 行:default 114.80.66.1 – - 或者可以直接使用YaST2来配置。

2)添加路由表

修改/etc/iproute2/rt_tables,添加内容:


252 tel 电信路由表

251 cnc 网通路由表

然后手工添加路由规则,在Console里面执行如下命令:


#添加原路返回路由

ip route flush table tel
ip route add default via 114.80.66.1 dev eth0 src 114.80.66.199 table tel
ip rule add from 114.80.66.199 table tel
ip route flush table cnc
ip route add default via 60.29.231.1 dev eth1 src 60.29.231.190 table cnc
ip rule add from 60.29.231.190 table cnc

即让从电信IP过来的请求按照电信路由返回,从网通IP过来的请求从网通路由返回。这样就搞定了,是不是很简单?这个办法是bobo同学提供的,感谢他。

3) 把路由规则写入启动脚本

如果服务器重启,或者网络服务重启,上述的路由规则就失效了,所以你需要把上面这段命令写入系统启动脚本和网络启动脚本

如果是RedHat,系统启动脚本是/etc/rc.d/rc.local

如果是SuSE,可以自己写一个启动脚本,链接到S99上,比方说/etc/init.d/rc.local

如果是RedHat,网络启动脚本是/etc/rc.d/init.d/network

如果是SuSE,网络启动脚本是/etc/init.d/network


第二种:自己建立DNS服务进行解析:

网通使用第一块网卡(eth0):

  IP:210.82.37.149

  掩码:255.255.255.224

  网关:210.82.37.158

  铁通使用第二块网卡(eth1):

  IP:222.35.92.242

  掩码:255.255.255.252

  网关:222.35.92.241

  二、配置网卡:

  # vi /etc/sysconfig/networking/profiles/default/ifcfg-eth0

  DEVICE=eth0

  ONBOOT=yes

  IPADDR=210.82.37.149

  NETMASK=255.255.255.224

  GATEWAY=210.82.37.158

  TYPE=Ethernet

  # vi /etc/sysconfig/networking/profiles/default/ifcfg-eth1

  DEVICE=eth1

  ONBOOT=yes

  IPADDR=222.35.92.242

  NETMASK=255.255.255.252

  GATEWAY=222.35.92.241

  TYPE=Ethernet

  # vi /etc/sysconfig/networking/profiles/default/route-eth1

  GATEWAY0=218.57.200.1

  NETMASK0=255.255.255.0

  ADDRESS0=218.57.200.242

  # vi /etc/sysconfig/networking/profiles/default/resolv.conf

  nameserver 202.102.152.3

  nameserver 202.102.128.68

  三、配置路由表

  # vi /etc/iproute2/rt_tables,增加网通和铁通两个路由表

  252 cnc

  251 crtc

  设置网通的路由表

  ip route add 210.82.37.128/27 via 210.82.37.149 dev eth0 table cnc

  ip route add 127.0.0.0/8 dev lo table cnc

  ip route add default via 210.82.37.158 dev eth0 table cnc

  设置铁通的路由表

  ip route add 222.35.92.240/30 via 222.35.92.242 dev eth1 table crtc

  ip route add 127.0.0.0/8 dev lo table crtc

  ip route add default via 222.35.92.241 dev eth1 table crtc

  制定策略,让222.35.92.242的回应数据包走铁通的路由表路由,210.82.37.149的回应数据包走网通的路由表路由

  ip rule add from 210.82.37.149 table cnc

  ip rule add from 222.35.92.242 table crtc

  修改IP转发文件

  # vi /etc/sysctl.conf

  net.ipv4.ip_forward = 1

  net.ipv4.conf.default.rp_filter = 1

  kernel.sysrq = 0

  设置静态路由表文件

  # vi /etc/sysconfig/static-routes

  eth0 net 210.82.37.149 netmask 255.255.255.224 gw 210.82.37.158

  eth1 net 222.35.92.242 netmask 255.255.255.252 gw 222.35.92.241

  将从两个WAN口出去的数据包进行IP伪装masquerade

  # /sbin/modprobe ip_conntrack_ftp

  # /sbin/modprobe ip_nat_ftp

  # /sbin/iptables -t nat -A postrouting -o eth0 -j masquerade

  # /sbin/iptables -t nat -A postrouting -o eth1 -j masquerade

  设置默认网关为网通

  # route add default gw 210.82.37.158

  增加出口路由策略,客户端是铁通的走铁通线路,其余走网通线路。

CODE:


ip rule add to 121.16.0.0/13 table cnc
ip rule add to 121.24.0.0/14 table cnc
ip rule add to 121.28.0.0/15 table cnc
ip rule add to 121.30.0.0/16 table cnc
      ip rule add to 121.31.0.0/16 table cnc




其余省略...


刷新路由表

ip route flush cache

四、配置DNS

在服务器上配置自己的DNS解析,将域名服务器商处的域名解析指向服务器。

这样,来自网通的查询,将反馈网站网通的IP,其余反馈电信的IP。

配置named.conf

CODE:


view "cnc" {
match-clients {121.16.0.0/13;121.24.0.0/14;121.28.0.0/15;121.30.0.0/16;121.31.0.0/16;121.47其余省略...;}
recursion yes;
zone "zhyh.org" {
type master;
file "/var/named/zhyh.org.cnc";
};
}; 
view "other" {
match-clients { any; };
recursion no;
zone "zhyh.org" {
type master;
file "/var/named/zhyh.org";
};
      };




配置zhyh.org.cnc,对应网通IP


CODE:


$TTL 86400
@ IN SOA zhyh.org. root (
2006111800 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS zhyh.org.
IN A 218.57.200.242
IN MX 10 mail
www IN A 218.57.200.242
ns1 IN A 218.57.200.242
ns IN A 222.173.254.21
mail IN A 218.57.200.242
      1 IN PTR localhost.




配置zhyh.org,对应电信IP


CODE


$TTL 86400
@ IN SOA zhyh.org. root (
2006111800 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS zhyh.org.
IN A 222.173.254.21
IN MX 10 mail
www IN A 222.173.254.21
ns IN A 222.173.254.21
ns1 IN A 218.57.200.242
mail IN A 222.173.254.21
      1 IN PTR localhost.




配置222.173.254.zone、218.57.200.zone做反向解析;


CODE:


$TTL 86400
@ IN SOA zhyh.org. root.zhyh.org. (
2006111813
3600
7200
3600000
86400 )
IN NS localhost.
242 IN PTR www.zhyh.org.
242 IN PTR ns1.zhyh.org.
      242 IN PTR mail.zhyh.org.




五、配置apache,做好虚拟主机设置


CODE



# vi /etc/httpd/conf/httpd.conf
NameVirtualHost 218.57.200.242:80
NameVirtualHost 222.173.254.21:80
ServerName zhyh.orgDocumentRoot /var/www/html/ServerAdmin [email protected] logs/zhyh.org-error_logCustomLog "|/usr/local/sbin/cronolog /var/log/httpd/zhyh.org-access_log.%Y%m%d" combinedRewriteEngine OnRewriteRule ^(.*)/htm/(.*)$ $1.php?$2


ServerName www.zhyh.org DocumentRoot /var/www/html/zhyh.org ServerAdmin [email protected] ErrorLog logs/zhyh.org-error_log CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/zhyh.org-access_log.%Y%m%d" combined