Linux下双线双IP的服务器网络及路由配置之策略路由
2012-06-04 20:14:41   来源:熊熊看世界   评论:0 点击:

Linux 下如何控制按一定的规则走不同的路由?如果这台双线双IP的服务器是公司的代理,那么一条线断了,是否可以走别外一条线路或者两者线...

Linux 下如何控制按一定的规则走不同的路由?如果这台双线双IP的服务器是公司的代理,那么一条线断了,是否可以走别外一条线路或者两者线路负载均衡?等等。这些其实是要依据不同的服务器用途与使用环境来决定,并更有需要用到“策略路由”功能。下面我就来谈谈双线双IP服务器的策略路由配置与设定。

一、双线双IP的LINUX服务器主要的用途与使用环境
1、双线双IP的LINUX服务器同时提供2个运营商不同用户的互联网服务。这种服务器的典型用法是企业为降低技术复杂度、服务器的成本及管理难度,同时又想解决不同运营商之间因互连互通障碍而造成的访问速度问题。比如中国A企业的网站客户是全国性的,但中国南北方运营商优势不同,互连互联问题导致A企业的服务网站放置在了一个双线机房并配置双IP的服务器上。示意图如下:
Linux下双线双IP的服务器网络及路由配置之策略路由
2、双线双IP的LINUX服务器为某个企业所有内部用户提供代理或缓存服务。即该LINUX服务器会依据目的地址的不同,而透过不同的ISP线路出去访问,绕开广域网中互连互通所导致的问题(示意图如下)。这种用法也常用在CDN节点对源节点加速并实现冗余的环境中。
Linux下双线双IP的服务器网络及路由配置之策略路由
二、不同用途的双线双IP服务器策略路由用法
1,双线双IP的LINUX服务器同时提供2个或2个以上运营商不同用户的互联网服务。这种情况比较可靠与稳定的路由配置当然还是使用静态路由,即:将一个运营商的IP网关设为默认网关,其他已知的另一个运营商所有IP指定为另一运营商的IP网关。比较困难的是你需要有另一运营商的IP库。不过这种情况下,你使用同一个域名但不同的IP服务同样的内容,本身已经能够依据客户端IP的不同,而将服务域名解析同不同的IP,因而IP库不是很大问题。
为了快速地加入多个策略路由规则(LINUX默认安装了高级路由包),下面准备了一些脚本,应该可以用得上:
事先准备工作:
修改/etc/iproute2/rt_tables,创建两个路由表名及ID。如下例:加t1-自定义编号10,加t2-自定义编号20
代码:
########################################
# reserved values
255 local
254 main
253 default
0 unspec
#
# local
10 T1
20 T2
########################################

然后将附件里的cnc_1_net和ctc_1_net拷贝到/etc目录下,因为下面的脚本要用到。
cnc_1_net的文件内容是网通的ip段
ctc_1_net的文件内容是电信的ip段

我们最后来编辑个加速自动添加路由表的脚本文件AddPolicyRoute.sh。
########################################
#!/bin/sh
# IF1 是网通的网络接口
IF1="eth0"
# IF2 是内网的网络接口
IF2="eth2"
# IF0 是电信的网络接口
IF0="eth1"
# IP1 是网通的IP
IP1="221.8.60.54"
# IP2 是电信的IP
IP2="222.168.11.186"
# P1 是网通的网关
P1="221.8.60.53"
# P2 是电信的网关
P2="222.168.11.185"

# P1_NET 是网通的网段, 掩码30表示有分派了4个ip, 如果是8个ip就要写成29了。
P1_NET="221.8.60.52/30"
# P2_NET 为电信的网段
P2_NET="222.168.11.184/30"
# P0_NET 为内网网段
P0_NET="192.168.0.0/24"

# 设置基本的防火墙
echo "1" > /proc/sys/net/ipv4/ip_forward
echo 8000 > /proc/sys/net/ipv4/ip_conntrack_max

modprobe iptable_filter
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
modprobe ip_nat_irc
modprobe ip_conntrack_irc
modprobe ipt_MASQUERADE
modprobe ipt_REJECT
modprobe ipt_limit

iptables -F
iptables -t nat -F
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -t nat -A POSTROUTING -s $P0_NET -o $IF1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s $P0_NET -o $IF2 -j MASQUERADE

# 设置策略路由
ip route flush table T1
ip route flush table T2
ip rule list | grep T | while read line; do
POS4=`echo $line | awk \'{print $4}\'`
if [ "$POS4" = "to" ]
then
DST=`echo $line | awk \'{print $5}\'`
RT=`echo $line | awk \'{print $7}\'`
ip rule del to $DST table $RT
fi
if [ "$POS4" = "lookup" ]
then
SRC=`echo $line | awk \'{print $3}\'`
RT=`echo $line | awk \'{print $5}\'`
ip rule del from $SRC table $RT
fi
done

if [ ! -z $IP1 ]
then
ip route replace $P1_NET dev $IF1 src $IP1
ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add $P0_NET dev $IF0 table T1
ip route add 127.0.0.0/8 dev lo table T1
ip route add $P1_NET dev $IF1 table T2
ip route replace default via $P1 dev $IF1 table T1
ip rule add from $IP1 table T1
WAN_RT1="nexthop via $P1 dev $IF1 weight 1"
fi
if [ ! -z $IP2 ]
then
ip route replace $P2_NET dev $IF2 src $IP2
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add $P0_NET dev $IF0 table T2
ip route add 127.0.0.0/8 dev lo table T2
ip route add $P2_NET dev $IF2 table T1
ip route replace default via $P2 dev $IF2 table T2
ip rule add from $IP2 table T2
WAN_RT2="nexthop via $P2 dev $IF2 weight 1"
fi
WAN_RT3="$WAN_RT1 $WAN_RT2"

# 把网通作为默认网关,如果是电信把$WAN_RT1修改为$WAN_RT2
ip route replace default scope global $WAN_RT1

# 用两个网关做负载均衡(一般不用)
#ip route replace default equalize scope global $WAN_RT3

ip route flush cache

if [ -s /etc/ctc_1_net ]
then
while read LINE
do
case $LINE in
\\#*) ;;
*)
ip rule add to $LINE table T2
;;
esac
done < /etc/ctc_1_net
fi

if [ -s /etc/cnc_1_net ]
then
while read LINE
do
case $LINE in
\\#*) ;;
*)
ip rule add to $LINE table T1
;;
esac
done < /etc/cnc_1_net
fi
ip route flush cache
#############End Of AddPolicyRoute.sh#######

2、双线双IP的LINUX服务器为某个企业所有内部用户提供代理或缓存服务。这种策略路由相对简单,实际上是destination address-based load balancing。即按目标地址进行线路选择并路由。这里假设你有3块网卡,分别是内部网络及另外2家ISP,其中是内部网络, eth1 与 eth2 是连接2家ISP的线路。

eth0连接内部网络,范围是10.0.0.0/255.255.255.0
eth1连接其中一家ISP,IP是1.1.1.1, 网关地址是1.1.1.253
eth2连接另外一家ISP,IP是2.2.2.2, 网关地址是2.2.2.253

#列出所有的路由规则
ip rule list

# table 后"10" 为路由表的识别ID数字.
# 若你希望用代号,请参考上文提到的/etc/iproute2/rt_tables
# table 10 是给内部网络使用,10.0.0.x LAN使用的IP.
# pref 后指定的"10"是优先级别.即策略路由数据库查找的次序

ip rule add pref 10 to 10.0.0.0/24 table 10
ip route add 10.0.0.0/24 table 10 dev eth1

# table 20是给第1家ISP用的, IP 1.1.1.1, 网关 1.1.1.253
# pref 后指定的"20"是优先级别.即策略路由数据库查找的次序
ip rule add pref 20 from 1.1.1.1 table 20
ip route add default table 20 via 1.1.1.253

#同理,table 30 是第2家ISP, IP 2.2.2.2, 网关 2.2.2.253
ip rule add pref 20 from 2.2.2.2 table 30
ip route add default table 30 via 2.2.2.253

#列出所有的rule看看
ip rule list
#只列table 10的rule
ip route list table 10
#只列出table 20的rule
ip route list table 20

#这里设定静态的路由表,若你的ISP有提供某些网络服务,必须该ISP的IP才能使用的,就必须将其设定在这里,多是代理,SMTP或NNTP服务等
ip route add 1.1.1.0/24 dev eth1
ip route add 2.2.2.0/24 dev eth2

#若上面所有的路由表都没匹配,那么数据包将会走默认路由
# "ip route repleace"是用作取代原来的default routing.
ip route replace default nexthop via 1.1.1.253 dev eth1 \
nexthop via 2.2.253 dev eth2

#若想加上权重,可以像下面这样设定,带宽越宽,weight值越大
#ip route replace default nexthop via 1.1.1.253 dev eth1 weight 1 \
# nexthop via 2.2.253 dev eth2 weight 3

#下面的命令会使上述设置立即生效
ip route flush cache

相关热词搜索:Linux 双线 策略路由

上一篇:第一页
下一篇:理解Xen的network-bridge模式

分享到: 收藏
评论排行