udhcpc不配置默認網關問題解決

問題現象

設備裏的http server運行了CGI,在設置eth0爲DHCP之後,怎麼也沒有默認路由信息。CGI調用的腳本最終是使用udhcpc,在shell裏手工運行udhcpc總是能夠自動設置默認路由。

問題解決

這個小小問題折騰了近兩個小時!

從現象看,應該在手工運行udhcpc和CGI間接調用udhcpc之間差異着手。

一開始我的猜測是運行用戶不同?CGI間接調用沒有寫路由權限?

後來發現不是這樣。

 

好吧,看源碼吧,好在udhcpc源碼還算小巧,很快就看完了。

udhcpc創建RAW socket,廣播discover並解析應答,收到應答之後運行/usr/share/udhcpc/default.script腳本設置IP、路由、DNS。

[root@ ~]# cat /usr/share/udhcpc/default.script

#!/bin/sh
# udhcpc script edited by Tim Riker <[email protected]>
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
RESOLV_CONF="/etc/resolv.conf"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"

case "$1" in
        deconfig)
                /sbin/ifconfig $interface 0.0.0.0
                ;;
        renew|bound)
                /sbin/ifconfig $interface $ip $BROADCAST $NETMASK
                if [ -n "$router" ] ; then
                        echo "deleting routers"
                        while route del default gw 0.0.0.0 dev $interface ; do
                                :
                        done
                        for i in $router ; do
                                route add default gw $i dev $interface
                        done
                fi
                echo -n > $RESOLV_CONF
                [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
                for i in $dns ; do
                        echo adding dns $i
                        echo nameserver $i >> $RESOLV_CONF
                done
                ;;
esac
exit 0

看出問題來了沒?並沒有!起碼我沒有。

跟蹤到ps有/usr/share/udhcpc/default.script bound 進程,udhcpc裏的RAW socket還是盡職盡責的,網關,DNS都獲取到了,但爲啥DNS設置了偏偏默認路由不設置!

當我把答案說出來,這問題就簡單得令人髮指了!

原因是route add default gw $i dev $interface這條命令根本沒有運行,找不到route!在CGI運行環境裏環境變量沒有配置/sbin/

[root@ ~]# which ifconfig route

/sbin/ifconfig

/sbin/route

 

Tim Riker <[email protected]>老人家是不是故意埋個坑^_^,ifconfig和route都是在/sbin下,偏偏ifconfig給帶路徑,route不帶!我要寫個郵件給他!

 

當然,其實這事不能怪人家。

好吧,udhcpc和udhcpd源碼剖析,另文,先欠着。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章