雖然在通常情況下,IP協(xié)議與路由信息的管理并沒有關(guān)系,但它確實(shí)定義了一個(gè)小小的故障控制功能,稱為ICMP重定向(ICMP redirect)。當(dāng)一臺(tái)路由器把一個(gè)包轉(zhuǎn)發(fā)至一臺(tái)計(jì)算機(jī),而這臺(tái)計(jì)算機(jī)卻又在最初接收這個(gè)包的網(wǎng)絡(luò)上的時(shí)候,就出現(xiàn)了明顯的錯(cuò)誤。由于發(fā)送方、路由器和下一跳的路由器都在同一網(wǎng)絡(luò)上,所以包應(yīng)該以一跳而不是兩跳轉(zhuǎn)發(fā)。路由器可以得出結(jié)論:發(fā)送方的路由表是不準(zhǔn)確或者不完整的。
在這種情況下,路由器可以用一個(gè)ICMP重定向包把發(fā)送方的問題通知給它。實(shí)際上,一個(gè)重定向包說:“您不應(yīng)該將發(fā)往主機(jī)xxx的包發(fā)送給我,您應(yīng)該把它們發(fā)送給主機(jī)yyy。”ICMP協(xié)議允許將重定向包既發(fā)送給單個(gè)主機(jī)地址也發(fā)送給整個(gè)網(wǎng)絡(luò)。但是,許多實(shí)現(xiàn)只產(chǎn)生主機(jī)重定向包,現(xiàn)在,網(wǎng)絡(luò)重定向包還沒有多大用處,因?yàn)樗鼈冎荒軕?yīng)用到A、B或者C類網(wǎng)絡(luò)上。
根據(jù)接收到的重定向包,發(fā)送方就會(huì)更新它的路由表,這樣一來,將來那些發(fā)往這個(gè)地址的包就能走更直接的路徑。在出現(xiàn)多播的早期時(shí)代,有些系統(tǒng)會(huì)響應(yīng)多播包而生成ICMP路由重定向包。現(xiàn)代系統(tǒng)已不存在這個(gè)問題。
標(biāo)準(zhǔn)的ICMP應(yīng)用場(chǎng)合并不包括身份認(rèn)證的步驟。您的路由器會(huì)收到一個(gè)聲稱來自其他某個(gè)聲譽(yù)良好的路由器的重定向包,指導(dǎo)您將流量發(fā)送到其他地方。您是否應(yīng)該采納呢?請(qǐng)注意,重定向?qū)嶋H上引發(fā)了一個(gè)安全問題。一般情況下,Linux內(nèi)核(出于安全原因)和Cisco路由器(因?yàn)樗鼈兪锹酚善鳎┒紩?huì)忽略重定向包。讓那些不可信的主機(jī)修改您的路由表可不是件好事。
在 Linux 下,/proc 目錄樹下的變量 accept_redirects 控制著 ICMP 重定向包的接收。參見 12.10節(jié)了解檢查和重設(shè)這個(gè)變量的指令。