发信人: life (沙加~重结晶), 信区: Linux
标  题: [技术]Linux如何配置成路由器
发信站: BBS 水木清华站 (Thu Jul 16 10:56:44 1998)
 

好久没有来这个版了, 看到前面大家讨论Linux作路由器的问题, 最后也没有
个明确的结论, 而我刚刚给人配了个路由器, 就把心得写一写吧, 不对不足
之处请大家多多指正.
先说说路由是怎么一回事情. TCP/IP通讯时, 使用IP和netmask来确定机器所在
的子网, 如果是同子网的机器间通讯, 就直接用广播的方法传过去. 具体情况是:

        源地址发出arp广播询问目的地址的MAC
        目的地址回应arp广播, 将MAC发会源地址
        建立连接开始传送(也是广播的方式)
 

如果目的地址和源地址不在同一子网内就需要把包传送到路由器(网关, 注意TCP/IP
通讯中路由和网关是一个概念, 不过这并不适用于所有的通讯协议), 再由路由器
一级级的发送, 直到送到目的地址所在子网的路由器, 再由此路由器在此子网内用
广播的方式传送.
 

路由分为动态路由和静态路由. 其中静态路由的是很简单的, 就是在网络中从源地
址到任意的目的地址都只要一条固定的传送路线. 动态路由也就是有好几条传送路
线啦.动态路由的好处再于如果一条路线不通了还可以使用另外一条路线, 这时就有
两个很重要的问题: 如何选择最合适的传送路线?  如何传递路由信息?
 

不同的选择方法和传递方式产生了不同的路由协议. 动态路由协议中最常用的是RIP
协议和EGP协议, 其他的还有 Hello, BGP ( 好象是这个吧, :pp 反正我是没有见过
的 ) 等. 选择传递路线的方法在配置路由器中不是重点, 这里就不说了. 下面重点
讲下路由信息的传递.

RIP 协议是通过主动的广播是传送路由表的. 它的实现方法很简单, 路由器在启动的
时候发出一个请求, 收到请求的机器就把自己的路由表传送给它. 也可以由路由器主
动的广播来发出自己的路由表. RIP 协议常常用在不大的局域网中, 很多的 Unix 工作
站都配置了 RIP 协议(由一个叫 routed 的 daemon 来完成). 这样作的好处在于方便
了网络管理员, 可以不用每台机器或者路由器都配置的路由表(网关). 实际上, 中科院
的网络用的就是RIP.  按我的意见, RIP 是最弱的, 如果有人捣乱一下, 胡乱广播路由
表, 结果一定会很好看 :)

EGP 协议在传送自己的路由表前要通过一个"找邻居"的方法来确定不会收到不相干的路由
表, 其具体方法是路由器要先配置几个邻居, 也就是其他的路由器, 由这些路由器来传递
给它的路由表. 这样, 路由器就安全多了.

上面简单的谈了一些在配置路由器中可能用到的原理, 很多地方可能讲得不是很正确和
完整, 希望各位看官不吝赐教. :)

===============================================================================

下面就来讲用 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
下找到它最新的的 2.9.2 版
--
 

------------------------------------------------------------------------------
 

发信人: sunny (阳光), 信区: Linux
标  题: 以Linux做Router的方法  [转载]
日  期: Fri Dec 22 13:14:27 1995

以 Linux 当 router 的方法                                by C.W.Huang

**********************************************************************
          本文欢迎非营利性质的转载,以便能让更多人受惠!
             但若欲引用於商业用途需先知会原作者.
**********************************************************************

  利用 Linux 当 router 其实很简单.首先你在 compile kernel 时要选
IP forwarding. 用这个 kernel 开机,看看能不能抓到两块网路卡.如果
不行的话在 /etc/lilo.conf 上加上

 append="ether=irq,io-port,eth0 ether=irq,io-port,eth1"

再重跑 lilo. 或者如果你用 loadlin 的话,用

 loadlin vmlinuz root=/dev/??? ro ether=irq,io,eth0 ether=irq,io,eth1

应该就可以了.注意看开机时有没有抓到? 或看 /proc/net/dev 有没有 eth0
和 eth1? 有的话就对了(如果没有就要 recompile kernel 了.请参考 "为何
我的网路连不出去" 一文).

  接下来就是 config 这两个界面了.假设你的网路环境如下:

                                                |
                                                |   +-----+
                                                +---| DOS |  140.122.52.236
  +---------+             eth0 +-----+ eth1     |   +-----+
  | gateway |------------------|Linux|----------+           分出来的次子网
  +---------+                  +-----+          |   +-----+
 140.122.52.254            140.122.52.235       +---| Sun | 140.122.52.234
                               router           |   +-----+
                                                |
                                                可再接多台机器
 

  eth0 界面是用来跟外面的网路相连的.你可以用一般的 netconfig 来设定它.
(若不会的话还是请参考精华区中的文章).
  我们是利用 Linux 的 Proxy Arp 功能,当外界有封包要送到你的次子网路时,
Linux 会回应此封包.所以对外界来说你的次子网就是存在的了.因此很重要的一点
是,你的次子网必须要是从你原来的子网路上割出来的!!
  以上面的情形为例,如果预估你的次子网约有五、六台左右的机器,你可以决定
要割出来的次子网的 IP 范围是从 140.122.52.232 -- 140.122.52.239 共 8 个位
址(一定是 2^n 啦! 不懂吗? 自己想...:) 算一算 netmask 应是 255.255.255.248,
broadcast 是 140.122.52.239. 於是 eth1 应该这样 config:

# ifconfig eth1 140.122.52.235 netmask 255.255.255.248 broadcast 140.122.52.239
# route add -net 140.122.52.232 netmask 255.255.255.248 gw 140.122.52.235 eth1

这样你所有从 140.122.52.232 到 140.122.52.239 的封包都会往 eth1 送.试试看能
不能从你的次子网 telnet 到 Linux 上? 若可以的话就成功了一大半....^_^
  不知你是否注意到,我将 eth0 和 eth1 的 IP address 设为一样! 常有人认为,有
两块网路卡就要有两个 IP address. 但这是没有必要的! 你可以将两个设为相同!!
  但是你若想试著直接 telnet 到外面去,就会发现不通! 这是因为尚未设定 arp
table 的关系.以上面为例,如果你想要 DOS 那台机器可以跨出次子网,就要在
Linux 上设 arp:

# arp -s 140.122.52.236 08:00:77:14:00:00 pub
                        ^^^^^^^^^^^^^^^^^
                        ↑
                        这是你 eth0 界面的 hardware address, 可用 ifconfig 查看

  这时应该就可以直接从 DOS telnet 到外面网路上的机器了! 也可以从外面 telnet
上来...Oh! Sorry! DOS 是不能 telnet 上去的.... 若是 Linux 当然就没问题啦!!
你如果在外面用 traceroute 指令查看 route 的路径,会发现当 router 的那台 Linux
机器就在上面!
  如果要把 Sun 也加上去,如法泡制就好了.... (我不知道能否用一个指令就把次
子网整个 route 出去.有人知道的话请告诉我!)
  你可以把这些指令都放在/etc/rc.d/rc.inet1 中,这样开机时就可以设定好两
个界面了!

  感谢 Linux! 让我们用最少的代价,获得最佳的功能!!

注:在IP模型中有两种系统,"主机"和"路由器".为了提升性能,应重新编译内核,允许按路由器优化.
要想详细了解各种路由协议,推荐一本书《因特网路由技术(Routing in the Internet)》
推荐一个站点ftp.inr.ac.ru/ip-routing/,特别地,如果你要用2.1.xxx的网络QoS/Fair queueing.
 

  ?

本文转自中文Linux论坛