好久没有来这个版了, 看到前面大家讨论Linux作路由器的问题, 最后也没有个明确的结论,而我刚刚给人配了个路由器, 就把心得写一写吧, 不对不足之处请大家多多指正。
1.路由器的原理
先说说路由是怎么一回事情。 TCP/IP通讯时, 使用IP和netmask来确定机器所在的子网, 如果是同子网的机器间通讯, 就直接用广播的方法传过去。 具体情况是:
源地址发出arp广播询问目的地址的MAC
目的地址回应arp广播, 将MAC发会源地址
建立连接开始传送(也是广播的方式)
如果目的地址和源地址不在同一子网内就需要把包传送到路由器(网关, 注意TCP/IP通讯中路由和网关是一个概念, 不过这并不适用于所有的通讯协议), 再由路由器一级级的发送, 直到送到目的地址所在子网的路由器, 再由此路由器在此子网内用广播的方式传送。
路由分为动态路由和静态路由。 其中静态路由的是很简单的, 就是在网络中从源地址到任意的目的地址都只要一条固定的传送路线。 动态路由也就是有好几条传送路线啦。动态路由的好处再于如果一条路线不通了还可以使用另外一条路线, 这时就有两个很重要的问题: 如何选择最合适的传送路线? 如何传递路由信息?
不同的选择方法和传递方式产生了不同的路由协议。 动态路由协议中最常用的是RIP协议和EGP协议, 其他的还有 Hello, BGP ( 好象是这个吧, :pp 反正我是没有见过的) 等。 选择传递路线的方法在配置路由器中不是重点, 这里就不说了。 下面重点讲下路由信息的传递。
RIP 协议是通过主动的广播是传送路由表的。 它的实现方法很简单, 路由器在启动的时候发出一个请求, 收到请求的机器就把自己的路由表传送给它。 也可以由路由器主动的广播来发出自己的路由表。 RIP 协议常常用在不大的局域网中, 很多的Unix工作站都配置了 RIP 协议(由一个叫 routed 的 daemon 来完成)。 这样作的好处在于方便了网络管理员, 可以不用每台机器或者路由器都配置的路由表(网关)。 实际上, 中科院的网络用的就是RIP。 按我的意见, RIP 是最弱的, 如果有人捣乱一下, 胡乱广播路由表, 结果一定会很好看 :)
EGP 协议在传送自己的路由表前要通过一个"找邻居"的方法来确定不会收到不相干的路由表, 其具体方法是路由器要先配置几个邻居, 也就是其他的路由器, 由这些路由器来传递给它的路由表。 这样, 路由器就安全多了。
上面简单的谈了一些在配置路由器中可能用到的原理, 很多地方可能讲得不是很正确和完整, 希望各位看官不吝赐教。 :)
2.用 Linux 做路由的方法
Linux 做路由是很容易的, 不过要分清不同的情况, 很多人在配置路由时弄错了情况,以至于费了很大劲也弄不出来。 我把常见的情况分为3种:
1。 只有有限的 ip 资源, 希望通过一个合法 ip 代理出多个内部 ip 的情况这个使用 Ip Masquerade 就可以了, 具体方法可以参看 Ip Masquerade的中文How-To 或 raner 写的 Linux做路由器(精华区中)
2。 为了减轻局域网的负担, 把几个合法 ip 单独割出来, 做一个小子网的情况。
这种情况, 就是精华区中那篇最老的 Linux做路由器 的文章了, 是那个台湾人写的那篇。 这种情况是最简单的, 只要在内核中编译上网卡的驱动和Ip Forwarding 再正确算出 netmask , 写静态路由表和arp表即可。
想补充两句的是关于静态路由表和arp表的问题, 一般人只是照者去做了没有想为什么, 其实弄清为什么还是对配置路由器和处理故障很有帮助的这里增加的静态路由表的作用是告诉从外面来要进子网的包路由的方向增加静态arp表是因为这个子网本来是从大的子网划出去的, 所以本子网内传送包以及从大子网的外面来包的时候, 包的源地址广播发出的arp申请需要回应, 这个工作本来是由那个IP的机器来完成的, 可是现在隔了个路由器, arp请求传不过去,而且也需要路由器来应答, 以使得源地址把数据传送到路由器上。
3。 想用linux来替代以前的正常的路由器。这种情况大多是因为, 硬件路由价格昂贵,软路由的功能上或性能上不能满足要求。 这种情况以前没有文章提到过, 其实这倒是最简单的一种情况。
这时只要问清楚运行的路由协议就可以了,如果是静态路由的话, 先设置好你的网卡, 使得你做路由的机器可以ping通外面和里面子网,这部分slackware和redhat的设置各不相同, redhat比较简单, 只要用 netconfig 加上就可以, 而slackware对第一块网卡用netconfig命令, 对后面的网卡则要手工写一下
ifconfig $IF1 $IPADDR1 netmask $NETMASK1 broadcast $BROADCAST1
route add -net $NETWORK1 netmask $NETMASK1 gw $IPADDR1
命令。 这时候路由就算配置好了, 不过要注意的是, redhat 上的 Ip Forwarding的开关缺省是关上的, 需要在 netconfig 里面设为打开。如果没有装 X 的东西,那么也可以手工修改/etc/sysconfig/network 文件和/etc/sysconfig/network-script目录下的 if-eth? 等文件如果是动态路由的话要分情况, rip 是最好弄的, 只要起个 routed 就可以了, 如果不行就给 routed 加上 -g -s参数让routed去广播路由表就可以了。
如果是其他的情况就要配置 gated 了, gated 是一个专用的, 支持多路由协议的高效的路由软件, 其缺点是配置麻烦,如果我再写下去就会吃了中午饭了, 所以呢有能力的就去看man和文档,没有时间和精力去看的呢先推荐一本书《TCP/IP Administration》有中文译本, 内容是老点, 不过还值得收藏, 里面对路由问题讲得很清楚。 如果连书都不想买, 那只好等我有空再写啦……
选择什么发行版本来实现路由器呢? 通常的可以使用 slackware 和 redhat,基本上对redhat不是非常清楚的用户不要使用redhat, 因为要用得好还是很麻烦的, 选择要安装的软件就是很讨厌的事情, redhat 的东西常常会有hole如果对系统不熟还是不要用。 slackware 很简单( 甚至可以说很单纯 :), 很适合对系统不太熟悉的用户使用。
当然这些大的distribution拿来做route当然是可以的啦, 不过呢, 我可以给大家推荐一个很小很小的东西, 就是 LRP( Linux Route Project ), 这个东西还是很酷的, 是一个微型的debian, 到底有多小呢? 只有一张软盘!!! 不要看它小, 可是功能很全, 而且设置很简单, 基本上不懂 linux 也可以设置 :)大家可以看看。 url 是:
http://www。psychosis。com/linux-router/
大家也可以到 ftp://ftp。gb。com。cn/pub/incoming/unix/linux-router