以 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 版