回線自動判別
eth0がルーター等のローカルネットワークに接続された場合はDHCPクライアントにして、そうでない場合はPPP接続する感じにしました。
/etc/network/interfaces
auto eth0
mapping eth0
script /etc/network/dhcpc-test.sh
iface eth0-local inet dhcp
iface eth0-global inet manual
up ip link set dev eth0 up
post-up pppd call provider
pre-down killall -q pppd
/etc/network/dhcpc-test.sh
#!/bin/sh
IF=$1
ip link set dev $IF up
if udhcpc -i $IF -n -q -T 2 -t 5 > /dev/null 2>&1; then
MODE="local"
else
MODE="global"
fi
ip link set dev $IF down
echo "$IF-$MODE"
スクリプトは実行権限が必要です。
/etc/network/interfacesでmappingにするとscriptの出力がデバイスの処理を分けれます。
scriptには本来のデバイス名が引数として渡されます。
udhcpcコマンドは引数に-qをつけるとIPが取得できれば即時終了、-nをつけるとIPが取得できない場合も常駐せずに終了となるようです。-Tはタイムアウト、-tは試行回数ぽいです。
# udhcpc -i eth0 -n -q -T 2 -t 5
の場合は2秒x5回DHCPサーバーへの接続を試みて、成功したら即時終了。IPの取得ができなければ10秒程度でエラー終了となります。
なので、スクリプトへの引数がeth0でeth0がDHCPサーバーに繋がっていればスクリプトはeth0-localを出力し、それ以外の場合はeth0-globalを出力します。
元の/etc/network/interfacesで、eth0-localの場合はインターフェイスはdhcpでIPを取得し、eth0-globalの場合はpppdを起動する感じ。
なお、
# ifdown eth0
はできなくなり、デバイスをdownさせる場合は、
# ifdown eth0=eth0-local
か
# ifdown eth0=eth0-global
のどちらかになります。
これだけだと起動中のケーブルの差し替えには対応しませんので、切り替える場合は手動でifdownとifupする必要があります。