Debian GNU Linux 2.0でCATVのインターネット接続用ルータを作る


目次

  1. Debain GNU Linuxのインストール
  2. NICのソース書き 換え
  3. カーネル再構築
  4. dhcpcdのインストール
  5. dhcpcの起動時期の変更
  6. dhcpcd_waitを記 述
  7. IP Masqueradeのインストール
  8. 最後に
  9. 追記事項

  1. "Debain GNU Linuxのインストール
  2. 目的となるマシンにNICを2枚(以上)差し、Debain GNU Linuxをインストールします
    インストール作業については私がここで説明するまでもなく、もっと詳しく説明されたページがあるのでそちらを参考にしてください。
    ちなみに私が用いたカーネルは、2.0.36です。

  3. NICのソース書き換え
  4. 実はLinuxBoxに使用するNICはCATV社に登録してあるものとは違う物なのでこのままではIPアドレスを取得できません。
    ですので、使用するNICが登録してあるMACアドレスと同じ値を返すよう、NICドライバのソースを書き換えます。

    私がこのLinuxBoxに用いたNICは、"at1700.c"と"3c509.c"だったので、ここにはそのドライバについて書きます。
    (以前、ne2000とpci-ne2kのドライバにもパッチを当てましたが、記録しておかなかったので...)

    大抵、"dev_addr"のみたいな変数名になっていますので、そのあたりを調べてみてください。

    "at1700.c"
    for(i = 0; i < 3; i++) {
    	unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
    	printk("%04x", eeprom_val);
    	((unsigned short *)dev->dev_addr)[i] = ntohs(eeprom_val);
    }
    
    	上記のソースの後ろに以下の行を付け加える。
    	(?の部分は登録してあるMACアドレスを記入)
    		
    { unsigned short  mac[3] = { 0x????, 0x????, 0x???? };
    	printk(" -> fake[");
    	for(i = 0; i < 3; i++) {
    		unsigned short eeprom_val = mac[i];
    		printk("%04x", eeprom_val);
    		((unsigned short *)dev->dev_addr)[i] =ntohs(eeprom_val);
    	}
    	printk("]");
    }
    

    "3c509.c"
    /* Read in the station address. */
    for (i = 0; i < 6; i++)
    	printk(" %2.2x", dev->dev_addr[i]);
    printk(", IRQ %d.\n", dev->irq);
    		
    	上記のソースの後ろに以下の行を付け加える。
    	(?の部分は登録してあるMACアドレスを記入)
    
    dev->dev_addr[0]= 0x??;
    dev->dev_addr[1]= 0x??;
    dev->dev_addr[2]= 0x??;
    dev->dev_addr[3]= 0x??;
    dev->dev_addr[4]= 0x??;
    dev->dev_addr[5]= 0x??;
    printk(" -> fake[");
    for (i = 0; i < 6; i++)
    	printk(" %2.2x", dev->dev_addr[i]);
    printk("]"); 
    

  5. カーネル再構築
  6. 書き換えたNICのMACアドレスを有効にする為にカーネルを再構築します。
    また後にインストールする"ipmasq"用に、make config時に"ipmasq"関連の項目を選択しておきます。

  7. dhcpcdのインストール
  8. "dselect"より"dhcpcd"をインストールします。
    インストール後、再起動してちゃんとdhcpサーバよりIPアドレスが取得されているか確認します。

    
    ifconfig
    cat /etc/dhcpc/hostinfo-eth?
    

  9. dhcpcdの起動時期の変更
  10. "dhcpcd"は、"dselect"より普通にインストールした場合"/etc/rc2.d/S13dhcpc"にインストールされます。
    そこで、起動時に"ipmasq"(後述)よりも先に読み込まれるように移動します。

    
    mv /etc/rc2.d/S13dhcpc /etc/rcS.d/S41dhcpc
    

    また以下の行を書き加えます。
    "/etc/init.d/dhcpc"
    start)
    	if [ "$IFACE" = "none" ] ; then
    		echo "DHCP client daemon is disabled."
    		exit
    	fi
    	mv /etc/dhcpc/hostinfo-eth0 /etc/dhcpc/hostinfo-eth0.bak
    	(中略)
    restart)
    	echo -n "Restarting DHCP client daemon: "
    	mv /etc/dhcpc/hostinfo-eth0 /etc/dhcpc/hostinfo-eth0.bak      
    	(後略)
    

    これは、次に記述する"dhcpc_wait"で、"/etc/dhcpc/hostinfo-eth0"ファイルの有無でdhcpcdがIPアドレスを取得できたかを判断する為です。

  11. dhcpcd_waitを記述
  12. dhcpクライアントがサーバよりIPアドレスを割り当てて貰うまでループを回して待ちます。
    "dhcp_wait"はその為のスクリプトです。

    "/etc/init.d/dhcp_wait"
    #! /bin/sh
    
    echo -n "DHCP result"
    
    T=`date +%M`; T=`expr 1 + $T`
    echo -n ": "
    
    while   test ! -f /etc/dhcpc/hostinfo-eth0
    do
    	echo -n "."
    	expr $T \< `date +%M` > /dev/null && echo "time out." && exit 0
    done
    echo "."
    
    ifconfig eth0 | sed "s/  */ /g" | grep inet
    
    ifconfig lo 127.0.0.1
    route add -net 127.0.0.0
    
    #eth0
    IPADDR=`grep IPADDR /etc/dhcpc/hostinfo-eth0 | cut -d= -f2`
    NETMASK=`grep NETMASK /etc/dhcpc/hostinfo-eth0 | cut -d= -f2`
    BROADCAST=`grep BROADCAST /etc/dhcpc/hostinfo-eth0 | cut -d= -f2`
    GATEWAY=`grep ROUTER /etc/dhcpc/hostinfo-eth0 | cut -d= -f2`
    NETWORK=`grep IPADDR /etc/dhcpc/hostinfo-eth0 | cut -d= -f2 | cut -d. -f1-3`".0"
    echo "IPADDR=$IPADDR,NETMASK=$NETMASK,BROADCAST=$BROADCAST,"
    echo -n "GATEWAY=$GATEWAY,NETWORK=$NETWORK"
    	
    route add default gw ${GATEWAY} metric 1 dev eth0
    
    ifconfig eth0 ${IPADDR} netmask ${NETMASK} broadcast ${BROADCAST}
    route add -net ${NETWORK} netmask ${NETMASK} dev eth0
    route add default gw ${GATEWAY} metric 1 dev eth0
    
    #eth1
    IN_IPADDR=192.168.0.1
    IN_NETMASK=255.255.255.0
    IN_NETWORK=192.168.0.0
    IN_BROADCAST=192.168.0.255
    IN_GATEWAY=192.168.0.1
    
    ifconfig eth1 ${IN_IPADDR} netmask ${IN_NETMASK} broadcast ${IN_BROADCAST}
    route add -net ${IN_NETWORK} netmask ${IN_NETMASK} dev eth1
    

    上記のスクリプトを"/etc/rcS.d/S41dhcpc"の直後に読み込まれるようにします。
    またこのスクリプトによりネットワークの設定をするので"/etc/rcS.d/S40network"が不要になります。

    
    ln /etc/init.d/dhcp_wait /etc/rcS.d/S41dhcp_wait
    mkdir /etc/rcS.d/NoUse
    mv /etc/rcS.d/S40network /etc/rcS.d/NoUse/
    

  13. IP Masqueradeのインストール
  14. "dselect"より"ipmasq"をインストールします。
    "ipmasq"は、"/etc/rcS.d/S41ipmasq"にインストールされます。

  15. 最後に
  16. 以上で「dhcpcdでIPアドレスを取得しつつ、IP Masqueradeする」という目的を達成できました。
    ここから先は勝手な考察ですので読み飛ばして頂いて結構です。

    Linux初心者の私がLinuxでルータを作ろうと思って、最初にやったのは"dhcpcd"と"ipmasq"のインストールでした。
    ところが、それぞれを単体でインストールすると正常に動作するのに、両方インストールするとどちらも機能しなくなってしまうのです。
    その原因の追求するべく、色々と試行錯誤を繰り返し(スクリプト中に"echo"を入れて(笑))、結局「Masqueredeが動作する前に、IPアドレスが決定されていなければならない(="dhcpcd"によりIPアドレスを取得し終えていなければならない)」という結論に達したのです。
    で、上記の様に読み込みの順番を変え、"dhcpcd"がサーバからIPアドレスを取得するのを待ってから"ipmasq"が読み込まれる様にしたのです。
    あと追加事項としては、何らかのトラブルで"dhcpcd"がIPアドレスを見失ってしまった場合の為にIPを監視するスクリプトを作り"cron"等に登録しておくといいと思います。


    もし上記事項が違っているとか、もっと簡単な方法がある等ありましたら、御一報願えると幸いです。

  17. 追記事項
  18. 私はルータを作る為にLinuxを始めたようなものです。
    その後、Linuxについて色々調べていくうちに、上記の設定よりも簡単な方法がある事を知り、その方法はFreescoの方で使っています。
    上記の設定は使用しているカーネルのバージョンが古く、現在私が使用している2.2.17では使えなくなっています。
    ですので、今となっては「ソースを書き換える時はここらへん」という資料程度とお考えください。

御意見御感想等ありましたらtoshi's BBSまたは、toshiまでどうぞ。

TOP


最終更新日: Jan 10 06:46