多重ISP链路复用 Multipath Routing hxgang 目的: 现在很多中小型网络有两条或者多条相同的不同的ISP的网络出口线路 而如何将这两条线路合理的利用起来 是很多人非常关心的,此文用通俗易懂的方法的讲解了如何初步达到此目的 本方案不需要大量的投资 也不需要改变现有网络结构 并且可扩展性好! 环境:用基于LINUX路由功能 由2.2内核开始,Linux便开始支持高级路由技术,提供策略路由,流量控制等多项高级路由功能,配合Netfilter包过滤软件,可实现许多专业路由器和防火墙才能实现的高级功能。 本方案采用RedHat 9.0 系统基础 系统自带 IPTABLES 和 IPROUTER2 软件, 申明:本方案为了表达一个通俗易懂的称述 很多地方采用大白话方式进行说明,这对技术来说是不严谨的态度,并且在文中可能出现很多错误,欢迎指正 希望有更多人能使用此方案而达到自己的目的 可以用在论坛上联系 或者Mail to :hxgang@hotmail.com 约定:对于具体#作,都是基于Shell下的,就是所谓终端,控制台等,我将用横线阁开,可以看成实际的#作,后面的针对解释 均采用汉字通俗解释 但不能作为实际#作! 一、 硬件选择和实施: 1。本人在实际#作中选择了 C3 1G CPU INTEL 815ET芯片组主板(集成显卡) 128M SDRAM 三张网卡 均是RTL 8139 10/100M 自适应网卡 3G大小心的一块老硬盘 RedHat 9.0系统盘 光驱 键盘 鼠标 显示器 为安装使用 过后拆掉,在各个实际环境里 选择方案不一定要相同 ,但是本人建议 CPU 不低于233M 内存不低于64M 网卡尽量不用8029等10M 设备,如果有条件可以选择不同的主流网卡 其他 主是要求稳定 ! 2。安装系统 根据硬盘大小以及个人情况 可任意方式安装 提示以及建议: A : 如果分区不是很清楚 可以用 光盘上的PQ 将硬盘分区 第一次接触的,采用 将6G以下的空间分成EXT3格式的分区 然后接着一256M左右的SWP交换分区 B。 网卡先别一次性装上, 可先将要用于内网的网卡,先插上,以后系统安装成功以后再依次插上其他网卡 以免混淆!在安装的时候 可以完全默认的方式 并且 尽量采用 英文安装 ,不装XWINDOWS 也就是可以一路 NEXT下去!!! 3。建立用户 除了系统自带的 root 超级管理员帐户以外 请建立1-2个普通用户! 更具体的安装#作 请搜寻网络上其他的文章!或者联系我,有非常详细的称述! 二、 单机的配置 这一步很重要 包括设置好网卡 如果是ADSL的PPOE的拨号方式 还必须设置ADSL上网 并且弄清楚 在硬件上的每一块网卡和系统里面的网卡的对应关系! 参考模型
eth0---------接内网 RD9.0 LINUX eth1---------接外网线路 1 eth2---------接外网线路 2
注意 : 在LINUX中表示的以态网卡的方式是ethX X代表的是第几个设备,对于排序 请根据系统的自设定 然后人为找到对应的网卡,可以采用每张网卡接一条线进行 Ping 的方式确定! 在上面这种情况下 将 eth0 (内网)设置为 IP: 192.168.0.1 Netmask:255.255.255.0 Gateway网关:无 eth1 (线路一) 假如 IP : 218.6.2.211 Netmask:255.255.255.0 Gateway网关:218.6.2.1 eth2(线路二)假如 IP :10.0.0.2 Netmask:255.255.255.0 Gateway: 10.0.0.1
实际#作方式: ----------------------------------------------------------- ifconfig eth0 192.168.0.1 netmask 255.255.255.0 ifconfig eth1 218.6.2.1 netmask 255.255.255.0 ifconfig eth2 10.0.0.1 netmask 255.255.255.0 ----------------------------------------------------------- 格式为: ifconfig 设备名 IP地址 netmask 子网掩码 直接输入 ifconfig 不带任何参数的话 系统将显示当前网络接口信息 至于更详细的#作方法请参考其他资料! 这样 就初步设置好了 各个网络接口的 IP地址等! 但是 这样的设置 可能在重起系统以后就会失效 那么最直接的方法是 修改 文件!(在LINUX下 很多地方可以直接修改文件的方式实现,特别是没有X的时候,显得特别重要,也最有效!) --------------------------------------------------- vim /etc/sysconfig/network-scripts/ifcfg-eth0 --------------------------------------------------- 进入VIM编辑界面 按 “i" 进入编辑模式 大致修改为以下内容 请注意 当一块网卡被系统正常检测 只需要改变“=”后面的内容: DEVICE = eth0 ---------》设备名,一般系统自动赋予 ONBOOT = yes ---------》是否开机激活 默认 “yes” BROADCAST =192.168.0.255 ---------》广播地址 NETWORK = 192.168.0.0 ---------》网络地址 NETMASK = 255.255.255.0 ---------》子网掩码 IPADDR = 192.168.0.1 ---------》IP地址 提示 BROADCAST =192.168.0.255 和NETWORK = 192.168.0.0 可以根据IP地址来 当掩码是 24位 (255.255.255.0) 时 BROADCAST是IP地址最后一位变255 NETWORK是 IP地址最后一位变0 修改成功以后 按 "ESC"键 然后 Shift+; 号键,出现“:”提示符 在 “:”提示符下面 输入 “w" 并回车 就将设置保存了,然后输入 “q”退出编辑界面 注意:如果你的eth0也是 用于内网 那么请将 GATEWAAY= 项删除 其他两张网卡,则必须要!!! 如果你装了X 那么可以在图形界面下,才用更合适的工具软件进行修改! -------------------------------------------------- vim /etc/sysconfig/network-scripts/ifcfg-eth1 ------------------------------------------------- 上面命令进入设置 eth1
------------------------------------------------ vim /etc/sysconfig/network-scripts/ifcfg-eth2 ------------------------------------------------ 上面命令进入设置 eth2
设置 DNS 一般情况下 如果当系统检测到网卡并且要求你设置的时候 你就可以将DNS 加入 但是如果你想修改的话,最直接的方法为编辑DNS文件 --------------------------------- vim /etc/resolv.conf --------------------------------- 加入DNS IP地址 格式为 nameserver 202.98.96.68 nameserver 61.139.2.69 等 具体DNS IP即可 当以上设置都正常进行以后,,, 重起系统, 检测设置 -------------------------------------------- ping 192.168.0.1 ping 10.0.0.2 ping 218.6.2.211 --------------------------------------------- 检测正确性 (用Ctrl+C结束) 然后 ,将外网卡正确接入网络 至少你确定能上网!不管他是用的哪条线路!!!!!!!! 如果一切正常 那么就表示系统的配置基本正确。
三、多路复用 接下来, 我们 就可以用系统本身的功能以及软件进行路由规则设置 前面已经提到 2.2以上内核已经带有很多的高级功能 而RedHat 9.0采用采用的是2.4.20的内核版本 是公认的比较稳定的,当然 你可以选择重新编译升级内核的方式 升级到2.6.X 版本的内核,体验更新的功能 ,但是这不是本文所要考虑的内容。 在我们将多路复用之前 最好是先打上两个补丁 A 因为路由缓存的机制,所以在某一时间断 连接到某一点上的线路是不变的,而必须等到失效才能重新选择, julian 的补丁解决了这个问题,对于RedHat9.0的系统内核 需要打这之PATCH 下载地址为: http://www.ssi.bg/~ja/patch-2.4.20-ja1.diff B.equailze 这之PATCH 解决了在系统内核中equailze参数不生效的问题 http://www.teatime.com.tw/~tommy/linux/equalize.patch 将这两个PATCH 下载到本地 比如 直接放在 /root目录下那么这样做,将PATCH补进内核: -------------------------------------------------------- /usr/src/linux-2.4.20-8/patch -p1 --------------------------------------------------------- ------------------------------------------------- /usr/src/linux-2.4.20-8/patch -p1 -------------------------------------------------- 执行完以后 我们就基本上需要的软件都准备齐全了
路由规则: 首先 我们使用 ip route show 命令来显示当前默然的路由规则: ------------------------------------------------ ip route show ------------------------------------------------- 可以看见 如: 0 lookup local 32766 main 32767 default 这是原有系统的路由规则! 那么 现在 我们使用自己的规则替代或者说将自己的规则的优先级提高于原有规则, 接着 我们创建路由表, 注意 创建的路由表的根据是上面的网络接口 ,所以请根据我上列举的具体设置来理解 新建命名为 10 和 20的规则,分别针对两个外网线路 规则“10” ---------------------------------------------------------- ip rule add pref 10 from 218.6.2.211 table 10 ip route replace default via 218.6.2.1 dev eth1 table 10 ----------------------------------------------------------
规则“20” ---------------------------------------------------------- ip rule add pref 20 from 10.0.0.2 table 20 ip route replace default via 10.0.0.1 dev eth2 table 20 ----------------------------------------------------------
设置main表 --------------------------------------------------------- ip route add 218.6.2.0 dev eth1 src 218.6.2.211 ip route add 10.0.0.0 dev eth2 src 10.0.0.2 ---------------------------------------------------------
刷新 cache --------------------------------------------------------- ip route flush cache ----------------------------------------------------------
设置完成 上面的只需要根据不同的IP地址以及对应的硬件设备 修改其部分内容即可
题外: 在LINUX路由表中可以使用0-255来代表不同的规则 而且每个规则都可以用别名来表示, 如果大家对此感兴趣 可以查看修改一个文件里面的内容来达到目的: ---------------------------------------------------------- vim /etc/iproute2/rt_tables ---------------------------------------------------------- 原文件给出了几个例子包括 lookup、 main、 default 。 需要自己添加的 按照这样的格式修改: 在空行处插入 : 规则号 规则名称 10 OUT1 保存即可 路由选择的优先级,是数值越小 代表权越大,所以一个路由选择将先查看 0 规则,既 环路 然后查看下一个规则,在本例子中,当一个数据在路由选择的时候,过了0规则 然后就是 10 规则 接着 20 规则 一直往下!直到匹配为止 通过以上设置, 我们就可以控制住通过某一条线路(ISP)的数据包的返回信息也从原线路返回。这将对运行在路由上的所有的进程起作用!!!并且实现了最基本的流量分割,很简单吧! 然后 就是做负载均衡了!可以将不同的请求根据自定设置发往不同的线路! 我们已经安装好了补丁 并且设置好的各种规则, 对于负载均衡,可以使用这条语句来实现: ------------------------------------------------------------------------------------------------- ip route replace default \nexthop via 218.6.2.1 dev eth1 weight 1 \nexthop via 10.0.0.1 dev eth2 weight 1 ------------------------------------------------------------------------------------------------- 这样 我们就改变了缺省的路由为多路路由!!!!并且我们可以通过改变 weight 参数的值来指定 一条线路的优先权大于 另有条线路 这在两条线路质量不相同的时候是种不错的选择 如: -------------------------------------------------------------------- ip route replace default \nexthop via 218.6.2.1 dev eth1 weight 4 \nexthop via 10.0.0.1 dev eth2 weight 1 ---------------------------------------------------------------------
刷新CACHE 使设置生效: -------------------------------------------- ip route flush cache --------------------------------------------- 注意:特别 应该指出的是,因为上面的均衡是根据路由进行的,而路由是根据CACHE选择的,所以这样的均衡不是100%的准确,在实际使用中 最多能达的70%的效率,对于经常访问的某一远程站点,会一直使用同一条线路, 不过,将不同的请求通过不同的线路发送,已经快于原先单条线路了。同时,就现阶段而言,没有ISP的配合 是不可能达到100%的精确的!!!! 现在 负载均衡已经基本设置完成了, 你就可以将外网两条线路接上对应的网卡,特别注意 必须是对应的网卡!!! 仍然用 ping 命令来检测 两条线路是否能在同时 ping 通! ping 线路1ISP出口网关 ping 线路2ISP出口网关 这是一种很好的方法, 各线路的从内网出去以后最先经过的是ISP的网关,并且在正常情况下都是允许 ping 探测的!!! 如果都能同, 那么 你已经正确的完成设置了!!!! 你的这台单机已经可以使用两条线路同时上网了,系统在你进行网络连接的时候,根据每条线路的轻重区别 来为你将连接请求合理的分发到两条线路上!! 四、带动内网机器上网 IP伪装(NAT)、端口转发 配置好单机的多重路由功能以后,如何让他冲当内网的网络出口服务器,带动其他机器上网呢?这将是此节的重点,并且,这部分内容单独来将,已经是将一个LINUX#作系统配置成路由器的具体步骤了! 首先,我们应该确定系统已经安装了IPTABLES 在大多数基于2.2内核的LINUX#作系统中,已经默认安装了次软件! 通过下面的命令就可以实现 IP伪装(NAT) 注: 里面几个具体数据将安装本实例问准,我会在后面提到!
A、定义IPTABLES位置(不是必须): ----------------------------------- IPTABLES="/usr/##in/iptables" -----------------------------------
B、清除原有防火墙规则设置: ----------------------------------- IPTABLES -P INPUT ACCEPT IPTABLES -P FORWARD ACCEPT IPTABLES -P OUTPUT ACCEPT -----------------------------------
C、清除NAT规则设置 --------------------------------------- IPTABLES -t nat -P PREROUTING ACCEPT IPTABLES -t nat -P POSTROUTING ACCEPT IPTABLES -t nat -P OUTPUT ACCEPT IPTABLES -t mangle -P PREROUTING ACCEPT IPTABLES -t mangle -P OUTPUT ACCEPT--------------------------------------
D、清除在防火墙和NAT中不是默认的连接 ------------------------------------- IPTABLES -F IPTABLES -t nat -F IPTABLES -t mangle -F IPTABLES -X IPTABLES -t nat -X IPTABLES -t mangle -X -------------------------------------
E、载入模块 (必须): ------------------------------------ /##in/depmod -a /##in/modprobe ip_tables /##in/modprobe ip_conntrack /##in/modprobe iptable_filter /##in/modprobe iptable_nat /##in/modprobe ipt_limit /##in/modprobe ipt_state /##in/modprobe ip_conntrack_ftp --------------------------------------
F、打开转发功能(必须) -------------------------------------------- echo "1" > /proc/sys/net/ipv4/ip_forward --------------------------------------------
G、设置转发规则: ----------------------------------------------------------------------- iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth2 -s 192.168.0.0/24 -j MASQUERADE -----------------------------------------------------------------------
A B C D为可选 但是请注意 如果你的IPTABLES不在 /usr/##in/ 这个目录 那么 你最好是选择这几项 并且 该成自己所在的目录 如果你选择了使用B C D 那么 你必须 选择A 就是必须给“IPTABLES” 这个常量赋值, 因为在 LINUX 默认中 全部大写的 IPTABLES 不是一个合法的iptables 命令 当然,如果你的系统已经定义了 iptables 的工作路径 那么, 将上面的 IPTABLES 换成小写的 iptables 也行! E F G则是必须要的, 当上面的规则成功设置以后, 将你的内网网卡连上交换机 等,修改其他机器的IP地址为 192.168.0.X 掩码为 255.255.255.0 (X为2-254之间) 生效后,就能通过你刚才打造的LINUX路由器上网了!!! 但是这些设备在重起后就会失效,如何解决了? 将这些命令写入脚本 让他开机启动 即可达到保存的效果!具体#作 将各命令写入一文本文件, 并形象的取名 比如,将IPTABLES设置 保存到当前工作目录里面的一个文件 并取名为 nat ---------------- vim nat ---------------- #复制内容 IPTABLES="/usr/##in/iptables" IPTABLES -P INPUT ACCEPT IPTABLES -P FORWARD ACCEPT IPTABLES -P OUTPUT ACCEPT IPTABLES -t nat -P PREROUTING ACCEPT IPTABLES -t nat -P POSTROUTING ACCEPT IPTABLES -t nat -P OUTPUT ACCEPT IPTABLES -t mangle -P PREROUTING ACCEPT IPTABLES -t mangle -P OUTPUT ACCEPTIPTABLES -F IPTABLES -t nat -F IPTABLES -t mangle -F IPTABLES -X IPTABLES -t nat -X IPTABLES -t mangle -X /##in/depmod -a /##in/modprobe ip_tables /##in/modprobe ip_conntrack /##in/modprobe iptable_filter /##in/modprobe iptable_nat /##in/modprobe ipt_limit /##in/modprobe ipt_state /##in/modprobe ip_conntrack_ftp echo "1" > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth2 -s 192.168.0.0/24 -j MASQUERADE
存盘退出
定义为可执行文件 ---------------------- chmod +755 nat ----------------------
修改 rc.local文件 使 nat 可以在开机即执行 ------------------------ vim /etc/rc.local ------------------------ 在文件原有内容下面的某一空行加入 sh /root/nat
存盘退出 重起即可生效 (根本不需要用户登陆执行!)其他脚本也是一样道理
各位 所有基本的#作到此为止 我想 如果你能看完,那么你自己就完全能用LINUX 打造一个高级路由 不要犹豫 他的性能 绝对敢和市面上价值几大千的路由器成品媲美!!!!! 感谢网络上这方面的网站、论坛介绍的很多知识 使我能够独立实施整个方案 并且详尽的写出来! 感谢LINUX 以及无数的开发人员 是他们 给我们构造了一个强大 自由 的#作系统及软件!!!! 接下来,我将对其他更细微的有关#作方法、心得 写下来,希望对现在采用LINUX 类LINUX系统 、软件做路由的朋友有所帮助, 如:断线救援,如何在一条线路断开以后立刻启用另一条线路负担整个网络任务,并且在线路连同以后,又重新自动启用,如何为此提供最详尽的,有效的,简易的方案 一盘秀的技巧设置 如果面对一盘秀的诸多问题了? 让我们一起来 在一张小小的软盘上反转乾坤 高级路由策略 ,想某一个游戏 只走某一条线? 想限制某些人 或者某些机器的上网需求,我们照样能办到,并且能做得更好!!!!!!!!! 动态路由,电信级路由 如何在一台投资根本不多的LINUX 类LINUX机器上 实现更强大的功能,如 各种高级动态路由 并使其有更好的扩充性 和灵活性!!!为我们在网络接入方面多一个选择!!!多一点放心!!! 。。。。。。。。。。。。。。。。。。
2004年7月16日
【原创】两条外网线路应用— MULTIPATH (续)
LINUX高级路由的应用—MultiPath 如果你有两条或者多条接入线路, 而你想用一个稳定而且实惠的方式将他们同时运用起来, 那么 本问将是一个解决方案之一!
此帖是对上篇的补充以及完善!,当然,还没有做到尽善尽美,但是因为
个人能力精力有限,可能还有很多地方不足! 真心希望对这方面感兴趣的朋友能
与我联系,共同讨论, 或者本方案有什么错误,请联系我,予以提出! MSN:hxg724591@hotmail.com QQ:364500114 原文 http://www.51758.com/viewthread.php?tid=35959 原文可能因为本人语言表达能力有限,导致可读性低, 但是,那是对本方案的实现过程的阐述!建议查看,以及在网络上搜索此方面的文章! 关键字:Multipath 多路复用 负载均衡 断线救援 我于昨日晚,测试完所有的脚本, 包括在两种不同的双线路下测试, 我采用的机器的配置和前一次差不多 P2 433 CPU 128M SDRAM 3.1G 硬盘 三张8139 10/100M 自适应网卡,上100 M FULL 其他外设,在配置的时候用, 采用RedHat 9.0 系统,最小化安装. 网络具体情况, A环境 100台机器, 一条3M ADSL 固定IP 一条 4M 光纤 线路等值使用 将系统配置好,并让内网机器上网, 使用网络蚂蚁 在机器1上下载天虎网下
载中心(down.tyfo.com)的2000 SP4补丁 5线程, 最高速度 450K/S 最低速度
350K/S 平均值 410K/S 在机器2上同时也开5线程下载 绵阳169 下载中心的 2000 SP4 最高速度为 310K/S 最低速度为280K/S 平均为302K/S 由此,可以看出, 基本上完全使用了线路的带宽, 并且,是分到两条线路在
进行数据交换, 而我在LINUX路由上,用tcpdump 查看当前系统网络情况, 可以看
出 每条线上都分发的有连接, 并且一个很有趣的现象出现了,当我在内网机器上
打开网页的时候,他通过 线路1连接到DNS 解析了域名,而又将连接从 线路2发出! B 环境,40台机器 两条等值的带宽相同的 但是不同ISP 的ADSL线路 均为2M
下行 640K 上行速度! 一为电信 一为网通, 而上次有位朋友提到,当服务器
是电信的时候内网连接可能卡,慢的情况,, 我针对此做了个测试, 在路由中写入
规则,当远程站点为电信IP段的时候,选择电信线路出口,当远程站点IP为网通IP段
的时候,选择网通线路出口, 这样缓冲了交差连接导致网速慢的情况, 但是,另一
个现象发生了,电信线路上感觉比较拥挤 , 在内网同时进行任意游戏,上网,聊天,
下载文件的时候, ADSL线路的请求等待队列都已经比较长, 毕竟ADSL的上行只有
640K 因为机器不是很多 所以感觉不明显, 最后我做了个更详细的规则
1.只对北方的或者其他物理位置较远的电信IP 段进行必须通过电信线路这
个规则, 2. 对于任意位置的网通IP段必须通过网通线路连接, 过后测试,基本
上两条线路的使用比较均衡, 相对来说,连接到在物理位置上很远的远程站点进行
下载和游戏的不是很多, 因为还有很大一个因素是,远程站点的服务器配置,以及
经过的中间节点的数目及网络性能等,如果你对此还不满意 你可以进行更加细微
的设置 断线救援方面, 很遗憾 在这个环节上,因为ISP的限制,导致此功能在实施
过程中遇见了一点点问题, 因为 我们这里的ISP ,不允许用ICMP探测, 当然,可
以探测到某一条线路的网关, 也就是说,比如一条光纤和一条ADSL 光纤为网关为
218.6.2.1 ADSL网关为61.139.54.1 那么同时ping 这两个IP地址来探测线路情
况,是可行的,, 但是 当某一条线路被停用以后,, 就有可能不能在线路恢复的
时候重新启用 因为,,ISP不运行从光纤线路上去pingADSL网关,当ADSL断掉的时候
,系统将从路由中删除ADSL连路,只有光纤在使用, 这个时候,不管ADSL是否正常,
都没办法ping 通 ,返回的值永远是"0" 如果你的地方ISP没有这个限制的话,
就没有这个问题, 并且会执行得很好. 针对这个问题,我会考虑在短时间了去寻
找其他的方法!!! 而对于"网络游戏经常断"这个情况, 在线路及服务器正常的情况下是不可能
出现的, 就算有这种情况出现,问题都不在于内部网络的路由上!
如果你是以下情况 那么 你可以采用我的文件,并简单修改,就能实现起强大
的功能, 有3张物理网卡(两条外线),, 或者2张网卡(一条外线)+一固定ADSL
好了,, 废话就到此为止吧! 每个目录下面都有相应的说明文件 详细说明,该目录下面需要改的文件,不需要改的文件,所需修改的文件的具体
位置 约定 : 任何设置文件里面的参数都有统一性, 请注意 最好是保持变量名
的一致 便于项目的设置和问题的查找 如: OUTIF1 代表外网卡设备1 OUTIF2 代表外网卡设备2 GW1 代表外网线路1(OUTIF1)的网关 GW2 代表外网线路2(OUTIF2)的网关 IP1 代表外网网卡1的IP地址 IP2 代表外网网卡2的IP地址 NETMASK1 代表外网网卡1的掩码 NETMASK2 代表外网网卡2的掩码
你仅仅需要修改 引号 "" 里面的对应内容即可 注意 请保证文件的格式 可用 windows的记事本打开, 但是可能将文件
内容表示成连续的段 中间会用 隔开,请不要删除这个空字符 所有文件更改成功以后, 在当前目录下 执行 命令 sh go 等待一分钟左右 系统将重启,在重启后, 所有的设置将生效.
|