udhcp というDHCPクライアント
udhcp はDHCPのプロトコルに基づいて、クライアントリクエストをブロードキャストする。DHCPサーバーを結果を受け取る。
その結果はシェル変数
に入った状態で、スクリプトに渡される。
udhcp -i eth0 -s /path/to/script.sh
スクリプト内部でIPアドレスの割当やルーティングを行う。
そのスクリプトは、標準的なものが、/usr/share/udhcpc/default.script
で用意されている。
殆どの場合、標準のdefault.script で十分である。ただ、このスクリプトはデフォルトGWやルーティングを書き換えてしまうので注意する。 特に、busybox が搭載されたLinuxルーターの場合、このGWの書き換えが重要になる。VPNなどを利用するときは自分で用意する必要がある。
udhcp を試してみる。
スクリプトを指定して使うudhcp だから、何もしないでecho するスクリプトを用意する。
DHCP 取得値は、変数に入るので変数をECHO する。
呼び出しは、複数回行われる。取得時、リリース時、更新時である。
呼び出しスクリプトを作る
root@OpenWrt:~# vim /root/sample.sh root@OpenWrt:~# chmod +x /root/sample.sh
/root/sample.sh
#!/usr/bin/env bash echo "####script start ####" echo $@ echo ----------- for i in ip mask subnet serverid interface router opt53 ; do echo $i=${!i} done echo "####script end ####"
udhcp を呼び出す。
root@OpenWrt:~# udhcpc -i vpn_soeth0 -s /root/sample.sh udhcpc: started, v1.30.1 ####script start #### deconfig ----------- ####script end #### udhcpc: sending discover udhcpc: sending select for 10.35.225.152 udhcpc: lease of 10.35.225.152 obtained, lease time 43200 ####script start #### bound ----------- lease=43200 mask=24 ip=10.35.225.152 router=10.35.225.254 domain=Z3543 dns=10.255.235.20 160.193.8.6 serverid=10.255.235.7 subnet=255.255.255.0 opt53=05 interface=vpn_soeth0 ####script end #### root@OpenWrt:~#
udhcp から引数付きで呼ばれる。
udhcp から、イベントごとに次のように引数付きで呼び出されることがわかる。
## 初期化 /root/sample.sh deconfig ## 割当取得時 /root/sample.sh bound ## 割当取得時 /root/sample.sh renew
スクリプトを指定する理由
なぜ、スクリプトを指定するのか。省略可ではないか。
省略可だけど、問題がある。とくにVPN時
スクリプト指定を省略すれば、通常のDHCPになる。
インターフェースだけ指定をすれば、通常DHCPとして動く。
udhcpc -i eth0
このとき実行されるのは次のファイル
/usr/share/udhcpc/default.script
ただし、これは、デフォルトGWをガッツリ書き換える。
VPN 時に面倒くさい。
udhcpc を使うと、DHCP時に defaultが切り替えが起き、ネットワークが切断される
また、中途半端に書き換えるので、設定次第では、default 経路が代わりVPN経路がなくなり通信ができなくなる。
また、切断時のもとのデフォルトGWに戻せな無い。
これらの、VPN Routing を明示的に行うために、スクリプトを使う。
スクリプトの書き方は /usr/share/udhcpc/default.script
を参考に、ルーティング・NAT転送・ポート閉塞・ポート解放などを書く。
udhcpc を使いLANとルータに接続する以外で使う、とくにVPNの場合スクリプトが必須である。