在互联网网站中,最头疼的问题之一就是电信和网通之间的互联互通问题。为了解决这个问题,托管到双线机房是一个常见的解决方案。双线机房有两种类型:一种是通过BGP技术实现互联互通,另一种是双线双IP的机房。

BGP机房的优点是服务器只需要一个网卡和一个IP地址,由机房进行路由智能判断,选择合适的路由访问。例如上海移动怒江机房、上海地面通自建机房和科技网机房等。但是BGP机房一般带宽较少,流量高的话可能就无法满足需求了。

另一类双线双IP的机房带宽可能更高,但路由配置复杂。例如上海电信市北机房。由于和谐原因,JavaEye网站服务器最近被迫从原来的移动怒江双线机房搬到了上海市北双线机房。实际上这个机房是电信机房,但是从天津网通拉了2G专线过来,因此服务器需要至少两个网卡,一个网卡接电信网关,一个网卡接网通网关,来实现互联互通。如果有多台服务器的话,还需要第3个网卡组建内网进行内网通讯。

对于双线双IP的服务器来说,需要解决两个问题:一是你的网站用户究竟走哪个IP来访问你的服务器;二是你网站的内容究竟走哪个IP返回给用户。对于第一个问题可以使用智能DNS解析来解决。即DNS服务器根据用户所在IP地址判断用户接入方式,如果是电信接入就把服务器的电信IP解析给他;如果是网通接入就把服务器的网通IP解析给他。推荐使用国内免费的智能DNS服务器提供商DNSPod提供的服务来实现智能DNS解析。

对于第二个问题则需要在服务器上面配置路由规则来决定数据返回路径。目前流行的解决办法是使用电信网关做默认路由,然后自己手工填写所有网通IP地址段的路由规则。这种办法可以在网上搜索到大量资料,不展开说明。这种方法缺点是添加规则太多太麻烦,难免挂漏万一漏掉了某个网段就会影响到该网段用户的访问。而且网段地址分布总是在不断变化的,还必须定期更新路由表。另一种方法是根据用户访问进来的路径设定动态路由。

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

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里面执行如下命令:

```bash

# 添加原路返回路由

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。

在不同的Linux发行版中,网络启动脚本的位置可能会有所不同。以下是针对SuSE和RedHat发行版的网络启动脚本位置:

1. 如果是SuSE发行版,可以自己编写一个启动脚本,将其链接到S99上。例如,在/etc/init.d/目录下创建一个名为rc.local的文件,并在其中添加启动网络服务的命令。具体操作如下:

```bash

sudo vim /etc/init.d/rc.local

```

然后在文件中添加以下内容:

```bash

#!/bin/sh -e

#

# rc.local

#

# This script is executed at the end of each multiuser runlevel.

# Make sure that the script will "exit 0" on success or any other

# value on error.

#

# In order to enable or disable this script just change the execution

# bits.

#

# By default this script does nothing.

ifconfig eth0 up

```

保存并退出。接下来,需要给rc.local文件添加可执行权限:

```bash

sudo chmod +x /etc/init.d/rc.local

```

最后,确保rc.local文件在系统启动时被执行:

```bash

sudo update-rc.d rc.local defaults

```

2. 如果是RedHat发行版,可以使用网络启动脚本/etc/rc.d/init.d/network。具体操作如下:

```bash

sudo vim /etc/rc.d/init.d/network

```

然后在文件中添加以下内容:

```bash

#!/bin/sh -e

### BEGIN INIT INFO

# Provides: network

# Required-Start: $remote_fs $syslog $named $network $time $syslog-clients $remote_fs $networking

# Required-Stop: $remote_fs $syslog $named $network $time $syslog-clients $remote_fs $networking

# Default-Start: 2 3 4 5

# Default-Stop: 0 1 6

# Short-Description: starts and stops the network services at boot time and after a reboot.

# Description: Enables and disables network services at boot time and after a reboot. When started, it brings up all network interfaces configured in /etc/sysconfig/network-scripts/ ifcfg-* files. When stopped, it tears down all network interfaces configured in those files. The network services are also stopped and started when the system is rebooted. The network configuration is stored in /etc/sysconfig/network as well as in individual ifcfg-* files in /etc/sysconfig/network-scripts/. The network configuration can be changed by editing these files or by using the command "ifconfig" or "ip" from the command line interface (CLI). The network configuration can also be changed by editing the files /etc/udev/rules.d/* and /etc/sysconfig/network-scripts/* with the appropriate commands for your platform (see below). If you want to start or stop specific network interfaces, use the "ifup" and "ifdown" commands instead of this script. Note that this script must be run as root because it changes the state of network interfaces which require root privileges to modify their state. You may need to add yourself to the "netdev" group to run this script without being asked for a password. The "netdev" group provides access to functions for managing network devices such as configuring IP addresses and routing tables. To add yourself to the group, type "gpasswd netdev " at a terminal prompt where you are logged in as root. ### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it (the default name is insserv)

DAEMON=/usr/sbin/insserv

NAME=insserv:network

DESC="starts and stops the network services at boot time and after a reboot"

test -x $DAEMON || exit 0“””