总结了下论坛中关于电信+网通双线策略路由的以前的帖子 ~~~~

网络环境

三块网卡
eth0 为LAN口,IP为 192.168.0.1
eth1 为第一个WAN口,接电信线路,IP为 CTC_IP,网段为 CTC_NET
eth2 为第二个WAN口,接网通线路,IP为 CNC_IP,所在网段为 CNC_NET

双线策略的实现

1. 静态路由方式

a. 电信作为默认线路
++++++++++++++

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

设置策略路由
ip route add 网通路由表1 via 网通网关 dev eth2 metric 1
ip route add 网通路由表2 via 网通网关 dev eth2 metric 1
….

b. 网通作为默认线路
++++++++++++++

设置默认路由
ip route replace default via 网通网关 dev eth2

设置策略路由
ip route add 电信路由表1 via 电信网关 dev eth1 metric 1
ip route add 电信路由表2 via 电信网关 dev eth1 metric 1
….

2. 策略路由方式

增加2个策略路由表,电信 => 100,网通 => 200

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

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

a. 电信作为默认线路
++++++++++++++

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

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

b. 网通作为默认线路
++++++++++++++

设置默认路由
ip route replace default via 网通网关 dev eth2

对电信进行基于目的地址的策略路由
ip rule add to 电信路由表1 table 100 prio 100
ip rule add to 电信路由表2 table 100 prio 101
….

3. iptables打标记+iproute2 fwmark

iptables -t mangle -A PREROUTING -i eth1 -m conntrack   –ctstate NEW   -j CONNMARK –set-mark 100
iptables -t mangle -A PREROUTING -i eth2 -m conntrack   –ctstate NEW   -j CONNMARK –set-mark 200

iptables -t mangle -A POSTROUTING -o eth1   -m conntrack   –ctstate NEW   -j CONNMARK –set-mark 100
iptables -t mangle -A POSTROUTING -o eth2   -m conntrack   –ctstate NEW   -j CONNMARK –set-mark 200

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

ip rule add fwmark 100 table 100 prio 100
ip route add table 100 to $CTC_NET dev eth1   proto kernel   scope link
ip route add table 100 to $CNC_NET dev eth2   proto kernel   scope link
ip route add table 100 to 192.168.0.0/24 dev eth0   proto kernel   scope link
ip route add default via 电信网关 dev eth1 table 100

ip rule add fwmark 200 table 100 prio 100
ip route add table 200 to $CTC_NET dev eth1   proto kernel   scope link
ip route add table 200 to $CNC_NET dev eth2   proto kernel   scope link
ip route add table 200 to 192.168.0.0/24 dev eth0   proto kernel   scope link
ip route add default via 网通网关 dev eth2 table 200

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访问时,数据到达了服务器上,本应该从网通的线路返回的,但最终却从电信的线路出去了。

为此,需要加入 “策略路由方式” 中的4条规则(文中红字部分),即:从哪条线来的,依然从哪条线出去。

存在的问题

1. 端口映射后,前面两种方式都不能交叉访问内网服务器,即NAT后路由返回有问题,后面一种方式暂时还没试

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

欢迎大家的讨论和指教~~~

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