1楼 发表于 2008-7-19 16:59 
参考了下论坛中关于电信+网通双线策略路由的帖子,并结合实际环境,将实现双线策略路由的几种方式总结如下,希望对有需要的朋友有所帮助,双线比单线要复杂多了,但把策略路由的原理弄明白了,就会发现其实并不难。

网络环境

服务器(网关):
   eth0 为LAN口,IP为 LAN_IP = 192.168.0.1
   eth1 为第一个WAN口,接电信线路,IP为 CTC_IP,网关为 CTC_GW
   eth2 为第二个WAN口,接网通线路,IP为 CNC_IP,网关为 CNC_GW

内网网站
   HTTP_SERVER = 192.168.0.100
   

内核打补丁

   如果你希望外网用户,不管通过哪个IP都可以访问到服务器或映射后的内网服务器,那么你就需要为内核打上补丁,
   补丁在 [url]http://www.ssi.bg/~ja/#routes[/url] 可以下载到,在 Static, Alternative Routes, Dead Gateway Detection, NAT 找和内核对应的 patch

   下载后为内核打上,然后在

    Networking  --->  Networking options  --->  IP: advanced router

    把 IP: equal cost multipath with caching support (EXPERIMENTAL) 前面的勾去掉

    如果你不想打补丁,或不想动内核,有个简单的办法来实现,即写一个脚本,每隔2秒钟刷新一次route cache

    while : ; do
        ip route flush cache
        sleep 2
    done


双线策略的实现

1. 静态路由方式(这种方式是最简单的)

    1) 设置默认路由,比如电信
       ip route replace default via 电信网关 dev eth1

    2) 设置策略路由,对另外一条线路

        ip route add 网通路由表1 via 网通网关 dev eth2 metric 1
        ip route add 网通路由表2 via 网通网关 dev eth2 metric 1
        ....

    3) 添加原路返回路由

    策略路由规则设置完后,还要为每条线路加入相应的 “原路返回路由”(从哪条线进来的数据,最终还是从这条线出去),不然就会出现这样的问题:
    电信用户通过网通的IP访问不到服务器,网通用户也不能通过电信IP访问到服务器


    ip route flush table 100
    ip route add default via 电信网关 dev eth1 src 电信IP table 100 prio 50
    ip rule add from 电信IP table 100

    ip route flush table 200
    ip route add default via 网通网关 dev eth2 src 网通IP table 200 prio 50
    ip rule add from 网通IP table 200

    出来加入本身的原路返回路由之外,还应加入局域网接口的,不然通过端口映射后,内网无法通过外网IP访问到映射后的服务器
    ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table 100
    ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table 200


2. 策略路由方式

    为了方便,我们增加2个策略路由表,电信 => 100,网通 => 200,这样再添加规则时,就可以直接用自定义的名称来替代数字

    echo "100 ctc" >>  /etc/iproute2/rt_tables
    echo "200 cnc"  >> /etc/iproute2/rt_tables

    1)设置默认路由(电信)
    ip route replace default via 电信网关 dev eth1

    2)对网通进行基于目的地址的策略路由
    ip rule add to 网通路由表1 table cnc prio 100
    ip rule add to 网通路由表2 table cnc prio 100
    ....

    3)添加原路返回路由

    ip route flush table ctc
    ip route add default via 电信网关 dev eth1 src 电信IP table ctc
    ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table ctc
    ip rule add from 电信IP table ctc

    ip route flush table cnc
    ip route add default via 网通网关 dev eth2 src 网通IP table cnc
    ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table ctc
    ip rule add from 网通IP table cnc

3. iptables打标记+iproute2 fwmark

    1)使用 CONNMARK 对连接进行标记

    外网进来数据
    iptables -t mangle -A PREROUTING -i eth1 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x100
    iptables -t mangle -A PREROUTING -i eth2 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x200

    转发出去的数据
    iptables -t mangle -A POSTROUTING -o eth1  -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x100
    iptables -t mangle -A POSTROUTING -o eth2  -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x200

    局域网进来数据
    iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

    本地出去数据
    iptables -t mangle -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

   2)在 IPROUTE2 中做基于 fwmark 的策略路由

   ip rule add fwmark 0x100 table ctc prio 40
   ip rule add fwmark 0x200 table cnc prio 40

   3)添加原路返回路由

   ip route add table ctc to $CTC_NET dev eth1  scope link
   ip route add table ctc to $CNC_NET dev eth2  scope link
   ip route add table ctc to 192.168.0.0/24 dev eth0  scope link
   ip route add default via 电信网关 dev eth1 table ctc

   ip route add table cnc to $CTC_NET dev eth1 scope link
   ip route add table cnc to $CNC_NET dev eth2  scope link
   ip route add table cnc to 192.168.0.0/24 dev eth0  scope link
   ip route add default via 网通网关 dev eth2 table cnc


Iptables/NAT 规则

     /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域网网段 -j SNAT --to-source 电信外网IP
     /sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域网网段 -j SNAT --to-source 网通外网IP

    如果外网IP是动态的,可以用 MASQUERADE

     /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域网网段 -j MASQUERADE
     /sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域网网段 -j MASQUERADE


端口映射

    端口映射可以分别针对两条线做端口映射
    比如 LAN口的IP为 192.168.0.1,内网服务器IP为 192.168.0.100,映射端口为 80

    iptables -t nat -A PREROUTING -p tcp --dport 80 -d 电信IP -j DNAT --to-destination 192.168.0.100
    iptables -t nat -A PREROUTING -p tcp --dport 80 -d 网通IP -j DNAT --to-destination 192.168.0.100

    端口回流(内网可以通过外网IP访问映射后的服务器)
    iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 --dport 80 -d 192.168.0.100 -j SNAT --to-source 192.168.0.1

    [注]:上述规则应放到 NAT 规则之前


常见问题(FAQ)

1. 不能实现 “交叉访问” 到服务器

    即:会出现外网电信用户只能通过电信IP访问到服务器,而通过网通IP访问不了;
    同理,网通用户只能通过网通IP访问到服务器,而通过电信IP却访问不了。也就是只是单纯地解决了 “内网访问哪里,走哪条线路”

答:电信用户通过网通IP访问时,数据到达了服务器上,本应该从网通的线路返回的,但最终却从电信的线路出去了,这样的数据会被上层网关丢弃。

    此时需要加入 “原路返回路由” ,实现 “从哪条线来的,依然从哪条线返回“。


2. 外网用户不能交叉访问映射后的内网服务器

    即:电信用户可以通过电信IP访问到内网服务器,网通用户可以通过网通IP访问到内网服务器
    但是:网通用户不能通过电信IP访问到内网服务器,电信用户也不能网通IP访问到内网服务器

答:路由缓存引起的,给内核打补丁,或每隔 2 秒左右刷新路由缓存


3. 内网用户不能通过外网IP访问内网服务器

答:a. 没有做SNAT(端口回流),加入回流规则即可
     b. 加入 ”原路返回路由“ 时,没有将局域网的路由加入进去


深入探讨

1. 上述三种方式哪一种效率最高? 如何来评估 ?

2. 双线失效保护,即掉线自动切换的实现(定时探测每条线路的连通性)
    可参考 [url]http://linux.chinaunix.net/bbs/v[/url] ... p;highlight=coolend

3. 通过***方式实现虚拟双线,即传说中的“借线”

4. 内网访问指定外网IP时走指定线路,指定内网IP上网走指定线路

[ 本帖最后由 coolend 于 2008-7-23 07:57 编辑 ]

 
2楼 发表于 2008-7-19 22:13 
呵呵~~~ 没想到被加入精华啊~~~ 感谢版主 !

补充下今天测试的结果及分析(端口映射)
==========================

电信用户通过网通IP访问内网映射的服务器

分析数据包的走向:

电信用户通过网通IP请求服务器80端口的资源
=> 源: 电信IP,目的: 网通IP,目的端口 80
=> 数据包到达服务器上,经过 DNAT,将目的地址改写为 192.168.0.100
=> 源: 电信IP,目的: 192.168.0.100,目的端口 80
=> 通过 eth0 将数据包转交给 192.168.0.100
<= 内网服务器回应数据包
<= 源: 192.168.0.100,目的: 电信IP,源端口 80
<= 服务器接收到数据包,查找路由表,根据目的IP判断,数据包应从电信线路出去

这就是问题所在了,明明电信用户通过网通IP访问服务器资源,回应的数据包本应从网通线路返回的,最终却从电信线路返回,这个返回的数据包自然会被丢。
电信用户收不到返回的数据包,也就是会因超时而访问不了。

解决办法尝试:

对进来的访问端口映射的数据打上标记,然后在路由表里面指向正确的返回路由

1. 在 mangle 链中
    给目的IP为电信的数据包,打上100的标记; 目的IP为网通的,打上200的标记

2. 在iproute2中设定标记为100的数据包走电信出去,标记为200的数据包走网通出去

    ip rule add fwmark 100 table 100 prio 50
    ip rule add fwmark 200 table 200 prio 51


再来分析数据包的走向:

电信用户通过网通IP请求服务器80端口的资源
=> 源: 电信IP,目的: 网通IP,目的端口 80
=> 数据包到达服务器上,打上200的标记,经过 DNAT,将目的地址改写为 192.168.0.100
=> 源: 电信IP,目的: 192.168.0.100,目的端口 80
=> 通过 eth0 将数据包转交给 192.168.0.100
<= 内网服务器回应数据包
<= 源: 192.168.0.100,目的: 电信IP,源端口 80
<= 服务器接收到数据包,数据包中包含200的标记,根据策略路由,数据包应从网通线路出去
<= 经过 SNAT 改写数据包源地址为网通IP
<= 电信用户收到数据包

理论上应该是可行的,由于数据包要经过内网服务器返回,所以打标记不能通过常规的对单个数据包的MARK,而要对整个连接的数据包都 MARK,也就是 CONNMARK

上面的分析尚未经过测试,明天试下看~~~

[ 本帖最后由 coolend 于 2008-7-19 23:03 编辑 ]
 
4楼 发表于 2008-7-21 09:31 
昨天仔细测试了一下~~~ 发现有点问题

外网用户访问映射后的内网服务器,只能通过1个IP访问,但是过7-8分钟后,却可以用另外一个IP访问,但是原来的那个IP就访问不了

比如:服务器的电信IP: 222.x, 网通IP: 218.x ,80端口映射到了内网的 192.168.0.100 网站服务器上

电信用户可以通过 222.x 访问到网站,但通过 222.x 访问不了 ;过几分钟后,可以通过 218.x 访问,但是此时通过 222.x 又访问不了,也就是说同一时间只能通过一个IP访问到。

添加的防火墙规则如下:

iptables -t mangle -I PREROUTING -i eth1 -d 电信IP -m conntrack --ctstate NEW -j CONNMARK --set-mark 100

iptables -t mangle -I PREROUTING -i eth2 -d 网通IP -m conntrack --ctstate NEW -j CONNMARK --set-mark 200

iptables -t mangle -I PREROUTING -i eth0 --sport 80 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

不知哪里有问题,请高人出来指点下~~~ 谢谢!


5楼 发表于 2008-7-21 11:54 
贴个在实际运行的脚本,只隐去了IP、网关信息,供参考。

基本符合楼主的思路。

ifconfig eth0 电信IP1 netmask 255.255.255.248
ifconfig eth0:0 电信IP2 netmask 255.255.255.255
ifconfig eth0:1 电信IP3 netmask 255.255.255.255
ifconfig eth0:2 电信IP4 netmask 255.255.255.255
ifconfig eth0:3 电信IP5 netmask 255.255.255.255
ifconfig eth1 网通IP1 netmask 255.255.255.248
ifconfig eth1:0 网通IP2 netmask 255.255.255.255
ifconfig eth1:1 网通IP3 netmask 255.255.255.255
ifconfig eth1:2 网通IP4 netmask 255.255.255.255
ifconfig eth1:3 网通IP5 netmask 255.255.255.255
ifconfig eth2 内网IP netmask 255.255.255.0
ifconfig eth3 停火区IP netmask 255.255.255.0

modprobe ip_nat_ftp
insmod ip_conntrack_ftp

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1048576 > /proc/sys/net/ipv4/ip_conntrack_max
echo 600 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established


ip route add default via 电信局端IP table ctc
ip route add default via 网通局端IP table cnc
route add default gw 电信局端IP

route add -net 58.16.0.0/14 gw 网通局端IP
route add -net 58.21.0.0/16 gw 网通局端IP
route add -net 58.22.0.0/15 gw 网通局端IP
route add -net 58.100.0.0/16 gw 网通局端IP
route add -net 58.144.0.0/16 gw 网通局端IP
route add -net 58.240.0.0/15 gw 网通局端IP
route add -net 58.244.0.0/14 gw 网通局端IP
route add -net 58.248.0.0/13 gw 网通局端IP
route add -net 60.0.0.0/13 gw 网通局端IP
route add -net 60.8.0.0/15 gw 网通局端IP
route add -net 60.13.0.0/16 gw 网通局端IP
route add -net 60.14.0.0/15 gw 网通局端IP
route add -net 60.16.0.0/13 gw 网通局端IP
route add -net 60.24.0.0/14 gw 网通局端IP
route add -net 60.31.0.0/16 gw 网通局端IP
route add -net 60.218.0.0/15 gw 网通局端IP
route add -net 60.220.0.0/14 gw 网通局端IP
route add -net 61.48.0.0/13 gw 网通局端IP
route add -net 61.133.0.0/17 gw 网通局端IP
route add -net 61.134.128.0/17 gw 网通局端IP
route add -net 61.135.0.0/16 gw 网通局端IP
route add -net 61.136.64.0/18 gw 网通局端IP
route add -net 61.137.128.0/17 gw 网通局端IP
route add -net 61.138.0.0/16 gw 网通局端IP
route add -net 61.139.128.0/18 gw 网通局端IP
route add -net 61.148.0.0/15 gw 网通局端IP
route add -net 61.156.0.0/16 gw 网通局端IP
route add -net 61.158.0.0/16 gw 网通局端IP
route add -net 61.159.0.0/18 gw 网通局端IP
route add -net 61.161.0.0/18 gw 网通局端IP
route add -net 61.161.128.0/17 gw 网通局端IP
route add -net 61.162.0.0/15 gw 网通局端IP
route add -net 61.167.0.0/16 gw 网通局端IP
route add -net 61.168.0.0/16 gw 网通局端IP
route add -net 61.176.0.0/16 gw 网通局端IP
route add -net 61.179.0.0/16 gw 网通局端IP
route add -net 61.181.0.0/16 gw 网通局端IP
route add -net 61.182.0.0/16 gw 网通局端IP
route add -net 61.189.0.0/17 gw 网通局端IP
route add -net 116.2.0.0/15 gw 网通局端IP
route add -net 116.95.0.0/16 gw 网通局端IP
route add -net 116.112.0.0/14 gw 网通局端IP
route add -net 116.116.0.0/15 gw 网通局端IP
route add -net 117.8.0.0/13 gw 网通局端IP
route add -net 118.72.0.0/13 gw 网通局端IP
route add -net 118.80.0.0/15 gw 网通局端IP
route add -net 118.212.0.0/16 gw 网通局端IP
route add -net 119.4.0.0/14 gw 网通局端IP
route add -net 119.36.0.0/16 gw 网通局端IP
route add -net 119.39.0.0/16 gw 网通局端IP
route add -net 119.48.0.0/13 gw 网通局端IP
route add -net 121.16.0.0/13 gw 网通局端IP
route add -net 121.24.0.0/14 gw 网通局端IP
route add -net 121.28.0.0/15 gw 网通局端IP
route add -net 121.31.0.0/16 gw 网通局端IP
route add -net 122.96.0.0/15 gw 网通局端IP
route add -net 122.136.0.0/13 gw 网通局端IP
route add -net 122.156.0.0/14 gw 网通局端IP
route add -net 122.192.0.0/14 gw 网通局端IP
route add -net 123.4.0.0/14 gw 网通局端IP
route add -net 123.8.0.0/13 gw 网通局端IP
route add -net 123.112.0.0/12 gw 网通局端IP
route add -net 123.128.0.0/13 gw 网通局端IP
route add -net 123.138.0.0/15 gw 网通局端IP
route add -net 123.144.0.0/14 gw 网通局端IP
route add -net 123.148.0.0/16 gw 网通局端IP
route add -net 123.152.0.0/13 gw 网通局端IP
route add -net 123.188.0.0/14 gw 网通局端IP
route add -net 123.232.0.0/14 gw 网通局端IP
route add -net 124.64.0.0/15 gw 网通局端IP
route add -net 124.66.0.0/17 gw 网通局端IP
route add -net 124.67.0.0/16 gw 网通局端IP
route add -net 124.88.0.0/16 gw 网通局端IP
route add -net 124.89.0.0/17 gw 网通局端IP
route add -net 124.89.128.0/17 gw 网通局端IP
route add -net 124.90.0.0/15 gw 网通局端IP
route add -net 124.92.0.0/14 gw 网通局端IP
route add -net 124.160.0.0/16 gw 网通局端IP
route add -net 124.161.0.0/16 gw 网通局端IP
route add -net 124.162.0.0/16 gw 网通局端IP
route add -net 124.163.0.0/16 gw 网通局端IP
route add -net 124.164.0.0/14 gw 网通局端IP
route add -net 125.32.0.0/16 gw 网通局端IP
route add -net 125.33.0.0/16 gw 网通局端IP
route add -net 125.34.0.0/16 gw 网通局端IP
route add -net 125.35.128.0/17 gw 网通局端IP
route add -net 125.36.0.0/14 gw 网通局端IP
route add -net 125.40.0.0/13 gw 网通局端IP
route add -net 125.211.0.0/16 gw 网通局端IP
route add -net 202.38.143.0/24 gw 网通局端IP
route add -net 202.96.0.0/18 gw 网通局端IP
route add -net 202.96.64.0/21 gw 网通局端IP
route add -net 202.96.72.0/21 gw 网通局端IP
route add -net 202.97.128.0/18 gw 网通局端IP
route add -net 202.97.192.0/19 gw 网通局端IP
route add -net 202.97.224.0/21 gw 网通局端IP
route add -net 202.97.240.0/20 gw 网通局端IP
route add -net 202.98.0.0/21 gw 网通局端IP
route add -net 202.98.8.0/21 gw 网通局端IP
route add -net 202.99.64.0/19 gw 网通局端IP
route add -net 202.99.96.0/21 gw 网通局端IP
route add -net 202.99.128.0/19 gw 网通局端IP
route add -net 202.99.160.0/21 gw 网通局端IP
route add -net 202.99.168.0/21 gw 网通局端IP
route add -net 202.99.176.0/20 gw 网通局端IP
route add -net 202.99.208.0/20 gw 网通局端IP
route add -net 202.99.224.0/21 gw 网通局端IP
route add -net 202.99.232.0/21 gw 网通局端IP
route add -net 202.99.240.0/20 gw 网通局端IP
route add -net 202.102.128.0/21 gw 网通局端IP
route add -net 202.102.224.0/21 gw 网通局端IP
route add -net 202.102.232.0/21 gw 网通局端IP
route add -net 202.106.0.0/16 gw 网通局端IP
route add -net 202.107.0.0/17 gw 网通局端IP
route add -net 202.108.0.0/16 gw 网通局端IP
route add -net 202.110.0.0/18 gw 网通局端IP
route add -net 202.110.64.0/18 gw 网通局端IP
route add -net 202.111.128.0/19 gw 网通局端IP
route add -net 203.93.8.0/24 gw 网通局端IP
route add -net 203.93.192.0/18 gw 网通局端IP
route add -net 210.13.0.0/18 gw 网通局端IP
route add -net 210.13.64.0/18 gw 网通局端IP
route add -net 210.13.128.0/17 gw 网通局端IP
route add -net 210.14.160.0/19 gw 网通局端IP
route add -net 210.14.192.0/19 gw 网通局端IP
route add -net 210.15.32.0/19 gw 网通局端IP
route add -net 210.15.96.0/19 gw 网通局端IP
route add -net 210.15.128.0/18 gw 网通局端IP
route add -net 210.21.0.0/17 gw 网通局端IP
route add -net 210.51.0.0/16 gw 网通局端IP
route add -net 210.52.128.0/17 gw 网通局端IP
route add -net 210.53.0.0/17 gw 网通局端IP
route add -net 210.53.128.0/17 gw 网通局端IP
route add -net 210.82.0.0/15 gw 网通局端IP
route add -net 218.8.0.0/15 gw 网通局端IP
route add -net 218.10.0.0/16 gw 网通局端IP
route add -net 218.11.0.0/16 gw 网通局端IP
route add -net 218.12.0.0/16 gw 网通局端IP
route add -net 218.21.128.0/17 gw 网通局端IP
route add -net 218.24.0.0/15 gw 网通局端IP
route add -net 218.27.0.0/16 gw 网通局端IP
route add -net 218.56.0.0/14 gw 网通局端IP
route add -net 218.60.0.0/14 gw 网通局端IP
route add -net 218.67.128.0/17 gw 网通局端IP
route add -net 218.104.0.0/14 gw 网通局端IP
route add -net 218.108.0.0/16 gw 网通局端IP
route add -net 219.82.0.0/16 gw 网通局端IP
route add -net 219.154.0.0/15 gw 网通局端IP
route add -net 219.156.0.0/14 gw 网通局端IP
route add -net 220.252.0.0/16 gw 网通局端IP
route add -net 221.0.0.0/13 gw 网通局端IP
route add -net 221.10.0.0/16 gw 网通局端IP
route add -net 221.11.0.0/17 gw 网通局端IP
route add -net 221.11.128.0/18 gw 网通局端IP
route add -net 221.11.224.0/19 gw 网通局端IP
route add -net 221.12.0.0/17 gw 网通局端IP
route add -net 221.12.128.0/18 gw 网通局端IP
route add -net 221.13.0.0/18 gw 网通局端IP
route add -net 221.13.64.0/19 gw 网通局端IP
route add -net 221.13.128.0/17 gw 网通局端IP
route add -net 221.14.0.0/15 gw 网通局端IP
route add -net 221.192.0.0/13 gw 网通局端IP
route add -net 221.200.0.0/13 gw 网通局端IP
route add -net 221.204.0.0/14 gw 网通局端IP
route add -net 221.212.0.0/15 gw 网通局端IP
route add -net 221.216.0.0/13 gw 网通局端IP
route add -net 222.128.0.0/14 gw 网通局端IP
route add -net 222.132.0.0/14 gw 网通局端IP
route add -net 222.136.0.0/13 gw 网通局端IP
route add -net 222.160.0.0/15 gw 网通局端IP
route add -net 222.162.0.0/16 gw 网通局端IP
route add -net 222.163.0.0/17 gw 网通局端IP


iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 电信IP4
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 网通IP1

iptables -t nat -A PREROUTING -d 电信IP1 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.90:80
iptables -t nat -A PREROUTING -d 电信IP1 -i eth+ -p tcp -m tcp --dport 20 -j DNAT --to-destination 172.16.0.92:20
iptables -t nat -A PREROUTING -d 电信IP1 -i eth+ -p tcp -m tcp --dport 21 -j DNAT --to-destination 172.16.0.92:21
iptables -t nat -A PREROUTING -d 电信IP1 -i eth+ -p tcp -m tcp --dport 81 -j DNAT --to-destination 139.1.1.119:4899
#iptables -t nat -A PREROUTING -d 电信IP2 -i eth+ -p tcp -m tcp --dport 22 -j DNAT --to-destination 172.16.0.91:22
iptables -t nat -A PREROUTING -d 电信IP2 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.91:80
iptables -t nat -A PREROUTING -d 电信IP3 -i eth+ -p tcp -m tcp --dport 20 -j DNAT --to-destination 172.16.0.92
iptables -t nat -A PREROUTING -d 电信IP3 -i eth+ -p tcp -m tcp --dport 21 -j DNAT --to-destination 172.16.0.92:21
iptables -t nat -A PREROUTING -d 电信IP3 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.92:80  
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 3081 -j DNAT --to-destination 172.16.0.201:80
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 3082 -j DNAT --to-destination 172.16.0.202:80
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.2:80
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 4899 -j DNAT --to-destination 139.1.1.20:4899
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 8899 -j DNAT --to-destination 139.1.1.77:8899
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 3389 -j DNAT --to-destination 139.1.1.150:3389
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 5631 -j DNAT --to-destination 172.16.0.2:5631
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 5632 -j DNAT --to-destination 172.16.0.2:5632
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 3022 -j DNAT --to-destination 172.16.0.203:3022
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 3080 -j DNAT --to-destination 172.16.0.203:3080
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 3333 -j DNAT --to-destination 172.16.0.203:3333
iptables -t nat -A PREROUTING -d 电信IP5 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.94:80
iptables -t nat -A PREROUTING -d 电信IP5 -i eth+ -p tcp -m tcp --dport 25 -j DNAT --to-destination 172.16.0.94:25
iptables -t nat -A PREROUTING -d 电信IP5 -i eth+ -p tcp -m tcp --dport 110 -j DNAT --to-destination 172.16.0.94:110
iptables -t nat -A PREROUTING -d 电信IP5 -i eth+ -p tcp -m tcp --dport 143 -j DNAT --to-destination 172.16.0.94:143
iptables -t nat -A PREROUTING -d 网通IP1 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.90:80
iptables -t nat -A PREROUTING -d 网通IP1 -i eth+ -p tcp -m tcp --dport 4899 -j DNAT --to-destination 139.1.1.20:4899
iptables -t nat -A PREROUTING -d 网通IP1 -i eth+ -p tcp -m tcp --dport 8899 -j DNAT --to-destination 139.1.1.77:8899
iptables -t nat -A PREROUTING -d 网通IP2 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.91:80
iptables -t nat -A PREROUTING -d 网通IP2 -i eth+ -p tcp -m tcp --dport 20 -j DNAT --to-destination 172.16.0.92
iptables -t nat -A PREROUTING -d 网通IP2 -i eth+ -p tcp -m tcp --dport 21 -j DNAT --to-destination 172.16.0.92:21
iptables -t nat -A PREROUTING -d 网通IP2 -i eth+ -p tcp -m tcp --dport 3080 -j DNAT --to-destination 172.16.0.203:3080
iptables -t nat -A PREROUTING -d 电信IP4 -i eth+ -p tcp -m tcp --dport 3333 -j DNAT --to-destination 172.16.0.203:3333
iptables -t nat -A PREROUTING -d 网通IP2 -i eth+ -p tcp -m tcp --dport 3081 -j DNAT --to-destination 172.16.0.201:80
iptables -t nat -A PREROUTING -d 网通IP2 -i eth+ -p tcp -m tcp --dport 3082 -j DNAT --to-destination 172.16.0.202:80
iptables -t nat -A PREROUTING -d 网通IP3 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.3:80
iptables -t nat -A PREROUTING -d 网通IP3 -i eth+ -p tcp -m tcp --dport 5631 -j DNAT --to-destination 172.16.0.3:5631
iptables -t nat -A PREROUTING -d 网通IP3 -i eth+ -p tcp -m tcp --dport 5632 -j DNAT --to-destination 172.16.0.3:5632

iptables -t nat -A PREROUTING -d 网通IP3 -i eth+ -p tcp -m tcp --dport 2501:2600 -j DNAT --to-destination 172.16.0.3
iptables -t nat -A PREROUTING -d 网通IP4 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.94:80
iptables -t nat -A PREROUTING -d 网通IP4 -i eth+ -p tcp -m tcp --dport 25 -j DNAT --to-destination 172.16.0.94:25
iptables -t nat -A PREROUTING -d 网通IP4 -i eth+ -p tcp -m tcp --dport 110 -j DNAT --to-destination 172.16.0.94:110
iptables -t nat -A PREROUTING -d 网通IP4 -i eth+ -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.16.0.94:443
iptables -t nat -A PREROUTING -d 网通IP5 -i eth+ -p tcp -m tcp --dport 20 -j DNAT --to-destination 172.16.0.92
iptables -t nat -A PREROUTING -d 网通IP5 -i eth+ -p tcp -m tcp --dport 21 -j DNAT --to-destination 172.16.0.92:21
iptables -t nat -A PREROUTING -d 网通IP5 -i eth+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.92:80
iptables -t nat -A PREROUTING -d 电信IP2 -i eth+ -p tcp -m tcp --dport 3389 -j DNAT --to-destination 139.1.1.41:3389

iptables -A INPUT -i eth0 -d 电信网段/29 -p icmp -j DROP
iptables -A INPUT -i eth1 -d 网通网段/29 -p icmp -j DROP

ip rule add fwmark 1 table ctc
ip rule add fwmark 2 table cnc
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW  -j CONNMARK --set-mark 0x1
iptables -t mangle -A PREROUTING -i eth1 -m conntrack --ctstate NEW  -j CONNMARK --set-mark 0x2
iptables -t mangle -A POSTROUTING -o eth0 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x1
iptables -t mangle -A POSTROUTING -o eth1 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x2
iptables -t mangle -A PREROUTING -i eth2 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i eth3 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark



另外还需要修改/etc/iproute2/rt_tables
增加下列两行
243     ctc
242     cnc

 
 
 
6楼 发表于 2008-7-21 12:59 
感谢 在风中飘荡 提供的脚本,偶也试过了,还是不行。

网通用户不能通过电信IP访问映射后的机器,但可以访问到服务器
电信用户不能通过网通IP访问映射后的机器,但可以访问到服务器

不知 在风中飘荡 有没有这样试过啊?



 
7楼 发表于 2008-7-21 13:37 
上述脚本,跑了一段时间了,运行的一直很正常,电信地址可以停火区里的服务器(不论电信还是网通),网通地址也访问停火区里的服务器(不论网通还是电信),都没问题的。



 
8楼 发表于 2008-7-21 17:17 
还是不行,用你的脚本测试过了一样。

通过网通IP访问时,不能通过电信IP访问,但是在服务器上运行 ip route flush cache 后,可以通过电信IP访问了,但是通过网通IP又不能访问了,再运行下 ip route flush cache,又可以通过网通I访问了,但又不能通过电信IP访问,真是怪事~~~

如果写一个脚本每隔一秒钟不停地  ip route flush cache,似乎可以解决问题,但是这样也太BT了点,还是希望能找到问题根本所在

不知 在风中飘荡 有没有做其他方面的参数调整,比如 sysctl.conf

[ 本帖最后由 coolend 于 2008-7-21 17:19 编辑 ]
 
 
9楼 发表于 2008-7-22 09:44 


QUOTE:
原帖由 coolend 于 2008-7-21 17:17 发表
还是不行,用你的脚本测试过了一样。

通过网通IP访问时,不能通过电信IP访问,但是在服务器上运行 ip route flush cache 后,可以通过电信IP访问了,但是通过网通IP又不能访问了,再运行下 ip route flush c ...

你需要给kernel打个补丁,然后在kernel中disable route cache

在这儿:[url]http://www.ssi.bg/~ja/#routes[/url]

在这个子项中"Static, Alternative Routes, Dead Gateway Detection, NAT"找相应的patch

 
10楼 发表于 2008-7-22 10:48 
非常感谢 kevin.tan 提供的信息,上面的route补丁偶其实已经打了,但是没有取消掉

IP: equal cost multipath with caching support (EXPERIMENTAL)

现在重新编译下内核,看看有没有问题~~~~


 
12楼 发表于 2008-7-22 15:34 
哈哈~~~ 成功了!果然把内核中那个 route cache 一去掉,不用频繁 flush cache ,外网就可以用2个IP同时访问服务器。

感谢 kevin.tan  大哥的提点~~~



 
15楼 发表于 2008-7-22 16:32 
恩,今晚花点时间把策略路由这个好好整理一下,然后放出来~~~

感谢 风中飘荡 提供的脚本参考,偶测试了下,你脚本里面 fwmark 的那些规则和防火墙中的 CONNMARK 的规则,去掉也没有问题哦~~~ 这应该是另外一种实现策略路由的方式吧,如果用这个,那么 route add -net xxx 那就可以不用了

总的感觉 IPRoute2 功能还是非常强大的,流量控制TC也属于 IPROUTE2 的一部分,TC偶也只是刚入门而已,最多算“不惑”而已,应用中也用到了其中很小一部分,有时间也深入研究下。

TC用散列表优化,在<<Linux的高级路由和流量控制HOWTO中文版>>一文中有详细的例子啊,照着做就行了,也许那里面讲得有点难懂,待策略路由弄完了,偶再把偶那篇文章弄个续集。


 
 
16楼 发表于 2008-7-22 17:54 
兄弟做的不错,我做这个做了一年,呵呵,你的做法不错,但是在双口失效保护上面还需要实现,其实这才是最重要的部分!


 
17楼 发表于 2008-7-22 21:05 
总算整理完了,还不是很细~~~ 不过重点都涉及到了

双线失效保护方面,可以定时探测两条线路,如果掉了,立即切换到另外一条线路,如果恢复了,再换回来,这里有偶以前写的一篇探测线路的几种方法,仅供参考~~~
[url]http://linux.chinaunix.net/bbs/v[/url] ... p;highlight=coolend


 
 
19楼 发表于 2008-7-22 22:37 
ip rule add fwmark 0x100 table ctc prio 40
   ip rule add fwmark 0x200 table 100 prio 40
这里100应该是cnc还是?


 
20楼 发表于 2008-7-23 07:47 
sorry, 笔误,其实200 和 cnc 都可以,因为之前在 /etc/iproute2/rt_tables 里面指定了 200 =》 cnc

[ 本帖最后由 coolend 于 2008-7-23 11:25 编辑 ]


 
21楼 发表于 2008-7-23 09:07 
100=>ctc
200=>cnc
吧!

 
22楼 发表于 2008-7-23 11:26 


QUOTE:
原帖由 lxw2016 于 2008-7-23 09:07 发表
100=>ctc
200=>cnc
吧!

恩~~~


 
26楼 发表于 2008-7-28 09:02 


QUOTE:
原帖由 javasuncom 于 2008-7-27 10:07 发表
呵呵,楼主能不能介绍一下,路由的条目,以及为多少台机器作策略路由,还有双线工作的性能等等参数!!

1. 路由的条目就是你要添加的路由表,比如网通的路由表,或电信的路由表,这个可以在网上找

海蜘蛛路由里面带有电信网通双线路由表,可以从它们的官方网站上面下载到
[url]http://w.hi-spider.com/html/spt_res.htm[/url]

2. 在网关上面做策略路由就可以了,不用在其他机器上面做,因为只有网关那里才有两条WAN线接入,底下的客户机所有数据通过网关转发,到达网关上面后,根据策略路由,选择从哪条线出去,比如访问电信的就走电信线路,访问网通的就走网通线路。

3. 性能这个不好说~~~ 偶也没有做过相关的对比评测

不过经过实际的运行测试,可以肯定的是 IPROUTE2 的性能是非常令人满意的,包括策略路由、TC流量控制