以 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.23. ?鲟恶□□□# 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! 让我们用最少的代价,获得最佳的功能!!
====================================================================== 发信人: cc (猪仔), 信区: Linux 标 题: 用LINUX做ROUTER经验谈 我今早刚将我的LINUX配置成ROUTER,这篇文章就是通过我的子网PC发表的. 安装过程中遇到的问题不是很多,下面简单谈谈体会. 1. 我是按照精华区内SUNNY转贴的文章去做的.装ROUTER之前,建议先研究 一下这 篇文章. 2. 不要轻易重编译核心.其实当出现如网卡找不着等问题时,可以到网上 找一个核心,在将原来的核心备份后,将它替换调,能解决不少问题. 3.不过,重编译也不是很可怕的事情,今天早上,我重编译我的内核,只用了 一个小时左右(486/33M/8M/N个TELNET :-).我现在的内核支持3c509, ne2000,ip-forwording,ide.有需要的给我发个mail. 欢迎和我讨论这方面的问题,我也有很多问题要请教诸位先驱.
====================================================================== ----- York (夜郎) ----- 一些小问题值得注意。这里列出一些,以供参考。 1。网卡的选择。 如果不打算做ROUTER的话,什么样的网卡都行。但若你准备用Linux做 ROUTER,最好别用两块同型号的网卡。我不能肯定用了就一定不行,但至少我碰到 过两块NE2000兼容网卡不能同时正常工作的情况。 > 是不是两块网卡重号引起的问题呢?中断的地址,I/O地址如果都没有冲突, > 行不行呢? 为了防止你所说的这些原因,我把这两块网卡的IRQ,I/O都设得不一样,此外, 它们的Ethernet Address也不一样,结果还是不能正常工作.也就是说工作不 稳定,当传输量一大就死机了.另外也不大可能是其它机器的网卡与我的重号, 因为我的这块NE2000目前工作在外网上,一直很稳定.但一旦我把另外一块卡 换成NE2000之后(甚至只是插入机器,还没有与其它机器相连),外网的这块 NE2000就不能正常工作了.我找了好几天都查不出它们不能协调工作的原因, 尽管单独使用两块网卡都很好. :(( 2。bootdisk和rootdisk的制作。 值得注意的是在做rootdisk时,RAWRITE输入的参数应是带.gz的压缩文件, 千万别自作聪明的先把它解压缩了! > 为什么呢?一般作ROOT,BOOT不都要先解压缩吗,好象README中也提到了 开始我也是这么想的.但用解压缩后的color文件做成的rootdisk起动时,系统 会抱怨找不到gzip头.这大概是因为linux的核心是压缩的,每次起动需要自解 的缘故. 3。NFS安装。 要有条件的话最好采用NFS安装。可以先从网上把slackware都取过来,放 入你自己的或附近的一台主机里,把它share出去,再做NFS安装就方便了。 4。北大FTP里的A系列不全。 装完后缺许多系统文件,使的系统不能正常启动。还是西安交大FTP里的 slackware-3.0比较保险。北邮好象也有,但不知全不全。 5。编译kernel。 如果需要做ROUTER或你的网卡不支持,那必须做这一步。建议编译前多研 究精华区里有关make kernel的文章。编译时注意打开IP FORWARDING并选择你所用 的网卡。 6。调试ROUTER时最好用PC。 比如调试过程中ROUTER换了网卡,子网外的工作站就需要更改它的ARP信息, 如果对UNIX系统管理不熟就比较麻烦。象我,就只好用笨办法:reboot。 7。ROUTER的性能。 用Linux做ROUTER,会使子网的出口速度较没有ROUTER时慢一些,大概是原 来的70%。当然了,有了ROUTER,可以使你的子网免受外网故障的影响。有所失也必 有所得嘛!
======================================================================
发信人: 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 版 |