DD-WRT に関する高度なヒントと手法を活用し、Linux の強力さを無線 LAN ルーターに追加する
無線 LAN ルーターに DD-WRT をインストールし、セキュリティーを設定して、安全にする
はじめに
DD-WRT は、ローエンドのコンシューマー向け無線 LAN ブロードバンド・ルーターを機能強化し、70 ドルのおもちゃを強力なネットワーク装置に変える Linux ベースのファームウェアです。DD-WRT により、これらの小型の機器に Linux ネットワーク・スタックのあらゆる機能を提供することができます。つまり、有線および無線によるルーティング、ファイアウォール、QoS、DHCP サーバーや DHCP フォワーダー、RADIUS サーバー、OpenVPN、VLAN、Wake-on-LAN、Wireless Distribution System リピーター・モード、Kai ゲーム・エンジン、WPA2 による暗号化と認証、その他さまざまな機能を実現することができます (「参考文献」を参照)。DD-WRT には、Web から GUI で操作できる便利な Web 管理インターフェースと、スクリプト機能を備えた強力なコマンドライン・ツールが付属しています。
この記事では、DD-WRT の入手方法、GUI およびコマンドラインによる管理をセキュアに行うための設定方法、そしてハードウェアの検出方法と構成方法について学びます。
DD-WRT の作成と保守を中心となって行っている人物は、BrainSlayer としても知られる Sebastian Gottschall 氏です。DD-WRT チームには中心となる開発者チームがあり、コントリビューターのコミュニティーもあります (「参考文献」を参照)。DD-WRT は商用に使用しない限り無料ですが、商用ユーザーはライセンス料を支払う必要があります。また、プロフェッショナル・サービスのオプションがあり、Ubiquiti や Senao などの優れたハードウェア・コンポーネントを DD-WRT ストアで購入することもできます。ハードウェアや金銭による寄付、ユーザー・フォーラムへの支援は、いつでも歓迎されています。
サポートされる機器と OEM 機器
DD-WRT は Atheros ベースおよび Broadcom ベースの IEEE802.11a/b/g/h/n 無線 LAN ルーターを対象に設計されています。例えば Linksys の WRT54GL などは実際、DD-WRT をサポートしていることを宣伝しています。DD-WRT プロジェクトでは、ユーザーにとって便利なように DD-WRT をサポートしている機器を示すデータベースと、DD-WRT に対応していない機器のリストを公開しています。最初に、このデータベースとリストを確認してください。DD-WRT をサポートしていないルーターをテストして発見した結果をコミュニティーにコントリビュートしたい場合を除き、そうしたルーターで時間を無駄に費やすべきではありません。
DD-WRT は、たった 2MB のフラッシュ・メモリーしか持たない Broadcom ルーター向けの最小ビルドであっても、ベンダー・オリジナルのファームウェアよりも多くの機能を提供することができます。Atheros ベースのルーターには少なくとも 4MB が必要です。便利なことに、サポートしている機器を示すデータベースには機器の仕様も記載されています。
DD-WRT をプリロードしているベンダーが多くなっているため、皆さんが自分で DD-WRT をインストールする必要はないかもしれません。バッファロー、Netgear、ASUS、Linksys、Toplink はすべて、彼らのルーターが「DD-WRT ファームウェアをプリロード」していることを宣伝しています。
インストール
インストールの方法は、どのルーターに対して行うかによって異なります。私は Cisco/Linksys の WRT160NL ブロードバンド・ルーターを使用しています。このルーターは非常に優れた小型の機器です。4 つのイーサネット LAN ポート、1 つの WAN ポート、8MB のフラッシュ・メモリー、32 MB の RAM、MIMO、そして外部ストレージ機器に接続するための USB ポートを 1 つ備えているため、ファイル・サーバーまたはメディア・サーバーとしても動作します。
サポート・リストに記載されているルーターの場合、そのルーターに DD-WRT をインストールするための手順が詳細に説明されているので、それらの説明に忠実に従ってください。インストール中に勝手な変更をしない限り、すべては順調に行くはずです。インストール・プロセスを少しでも中断するとルーターを「ブリック (brick) する」ことになるという警告が何度も表示されるはずです。「ブリックする」というのは、ルーターが起動しなくなってドアストッパーとして使うしかなくなる、という意味です。実際にルーターがブリックしてしまった場合には、DD-WRT のウィキの「Recover from a bad flash」の項目を読んでください (「参考文献」を参照)。完全にソフトウェアが破損して回復できず、本当に「煉瓦 (brick)」のようになってしまう場合もあり得ますが、実際にそうなることは稀です。
Web ブラウザーは必ず適切に動作するとは限らず、Web GUI を使用する場合には何らかの不愉快な事態に遭遇する場合があります。構成を適切に変更できると、ページが自動的に更新されるはずです。ブランク画面になった場合は変更が保存されていません。その場合はブラウザーのキャッシュをクリアしてブラウザーを再起動し、再度変更してみてください。
Boot Wait を有効にする: ブリックしないための保証
デフォルトのログイン名は「root」であり、デフォルトのパスワードは「admin」、ルーターのデフォルトの IP アドレスは「192.168.1.1」です。DD-WRT の Web GUI を開くためには、ルーターの近くにある PC の Web ブラウザーに「http://192.168.1.1」と入力します。
まず何よりも最初に、「Administration (管理)」 > 「Management (管理)」ページの順にアクセスし、図 1 のように「Boot Wait (ブート待機)」が有効になっていることを確認します。
図 1. 必ず「Boot Wait (ブート待機)」を有効にする

このオプションはデフォルトで有効になっているはずです。この設定によって起動時に 5 秒間の遅延が挿入され、何らかの理由でルーターが起動しなくなった場合にも、ファームウェアを元に戻す時間を確保することができます。この設定はルーターをブリックしないための保証だと考えてください。
「保存」、「設定」、「再起動」の違い
Web GUI の構成ページには必ず、一番下に「保存」ボタンと「設定」ボタンがあり、場合によると「再起動」ボタンもあります。「保存」ボタンは変更を適用せずに変更を保存します。そのため、それらの変更はルーターを再起動するまで、または「設定」ボタンをクリックするまで、有効になりません。「設定」ボタンは即座に変更を保存して適用し、必要に応じてさまざまなサービスを再起動します。「再起動」ボタンは再起動が必要な変更のためのものです。必ず再起動する前に変更を保存する必要があります。
ルーターとセキュアに通信する
DD-WRT の Web GUI は包括的で、よく整理されており、管理作業のほとんどをこの Web GUI で行うことができます。私のルーターで DD-WRT の Web GUI がどう表示されるかを示したものが図 2 です。
図 2. DD-WRT の Web GUI には構成情報と状態を示す情報が豊富に含まれています

デフォルトの設定では、セキュアでない平文の HTTP が許可されているので、この設定を HTTPS のみに変更し、DD-WRT の Web 管理を暗号化します。そのためには「Administration (管理)」 > 「Management (管理)」 > 「Web Access (Web アクセス)」の順に選択します。「Apply Settings (設定)」をクリックすると変更が即座に保存されて有効になり、それまでのセッションが終了します。ブラウザーのキャッシュをクリアしてブラウザーを再起動し、https://192.168.1.1 にアクセスします (あるいはルーターの IP アドレスを変更してある場合は、その IP アドレスにアクセスします)。このアドレスに初めてアクセスすると、サイトの証明書 (NewMedia-NET GmbH によって証明されています) に関する恐ろしい警告が表示されます。この証明書を永続的に受け入れます。証明書の生成や認証局の作成を自ら行うこともできますが、その方法については別の機会のトピックとして楽しみに取っておきます。
コマンドラインから DD-WRT を管理することもでき、その場合は Web GUI でサポートされていない構成オプションを利用することができます。コマンドラインは Web GUI を利用できない場合にルーターにアクセスするためのもう 1 つの手段となります。デフォルトで telnet は有効になっていますが、SSH は有効になっていません。telnet を利用してルーターの IP アドレスを指定することで、以下のようにルーターに接続することができます。
$ telnet 192.168.1.1 DD-WRT login: root Password:
どのようにユーザー名を構成したかによらず、ログイン名は必ず root ですが、パスワードは皆さんが作成した実際のパスワードです。「exit」と入力すると、telnet セッションが閉じられます。DD-WRT に慣れるためには telnet でも問題はありませんが、telnet は完全に非セキュアであるため、本番ルーターでは telnet を無効にし、SSH を使用する必要があります。そのためには「Services (サービス)」 > 「Services (サービス)」の順に選択して図 3 のように設定します。
図 3. SSH を有効にし、telnet を無効にする

そして「Apply Settings (設定)」をクリックすると、SSH でログインできるはずです。この場合もユーザー名は必ず root であり、パスワードは皆さんが作成した実際のパスワードです。
$ ssh root@192.168.1.1 DD-WRT v24-sp2 std (c) 2010 NewMedia-NET GmbH Release: 08/07/10 (SVN revision: 14896) root@192.168.1.1's password: ========================================================== ____ ___ __ ______ _____ ____ _ _ | _ \| _ \ \ \ / / _ \_ _| __ _|___ \| || | || | || ||____\ \ /\ / /| |_) || | \ \ / / __) | || |_ ||_| ||_||_____\ V V / | _ < | | \ V / / __/|__ _| |___/|___/ \_/\_/ |_| \_\|_| \_/ |_____| |_| DD-WRT v24-sp2 http://www.dd-wrt.com ========================================================== BusyBox v1.13.4 (2010-08-07 05:06:30 CEST) built-in shell (ash) Enter 'help' for a list of built-in commands.
この設定をさらに強化したい場合には、パスワードを使用せずに公開鍵を使用してログインするように設定することができます。この方法はパスワード総当たり攻撃に対する防御であり、秘密鍵のコピーを持っている人以外はログインすることができません。最初のステップは暗号鍵のペアを作成することです。ログインに使用する
Linux PC 上で、以下のように ssh-keygen
コマンドを入力します。
$ ssh-keygen -t rsa -C router1 -f ~/.ssh/linksys
この例は RSA 鍵のペアを作成しており、ここではこのペアに「linksys」という名前を付けています。公開鍵は linksys.pub、秘密鍵は linksys であり、どちらも ~/.ssh ディレクトリーに格納されます。このディレクトリーは SSH 鍵を格納するための標準的な場所ですが、SSH 鍵は任意の場所に格納することができます。次に、この鍵を指定するための以下のような行を /etc/ssh/ssh_config に追加します。
IdentityFile ~/.ssh/linksys
ssh-keygen コマンドの -C
オプションによって、公開鍵ファイルの中にコメントが作成されます。このファイルは平文ファイルであるため、私は鍵がわからなくなった場合には、このコメントを利用して鍵を特定するようにしています。今度は新しい公開鍵を
DD-WRT に追加します。そのために、「Services (サービス)」 > 「Services
(サービス)」の順に選択して「SSH」セクションのフィールドに公開鍵を追加し、パスワードを使用したログインを無効にします (図
4)。
図 4. SSH の公開鍵を DD-WRT にコピーし、公開鍵で認証を行えるようにする

「Save (保存)」をクリックし、続いて「Reboot Router (再起動)」をクリックします。必要なことはそれだけです。SSH セッションが開いている場合には、そのセッションは閉じられ、再度ログインしようとすると、パスワードは要求されないはずです。複数の鍵を貼り付けるためには、それぞれの鍵の間に改行を挿入します。
以上のことをコマンドラインから nvram
コマンドを使用して行うことができます。公開鍵が改行なしの 1
行で単一引用符に囲まれていることを確認します。空白があっても構いませんが、改行があってはなりません。コマンドは以下のように入力します。
root@linksys:~# nvram set sshd_authorized_keys='ssh-rsa AAAAB3NzaC...89Suj router1' root@linksys:~# nvram commit root@linksys:~# reboot
nvram
を使用して複数の鍵を設定することもできます。その場合は以下のように各鍵を単一引用符で囲み、各鍵を空白で区切ります。
root@linksys:~# nvram set sshd_authorized_keys='key1' 'key2' 'key3' root@linksys:~# nvram commit
何を実行しようとしているのかがわかるように、最初にテキスト・エディターで上記のように入力し、それから全体をコピーしてコマンドラインに貼り付けます。
nvram コマンド
nvram
にはいくつかの意味があります。nvram は電源を切られてもデータを保持する特殊なタイプの永続メモリー「不揮発性 RAM
(non-volatile RAM)」の短縮形です。ルーターの中にあるフラッシュ・メモリーは nvram
の一種です。nvram
コマンドはハードウェア設定を管理するためのものですが、ハードウェア設定はフラッシュ・メモリーの最後のブロックに格納されます。このメモリー・セグメントは、よく「nvram
」セグメントと呼ばれます。nvram
コマンドにはさまざまなバージョンがあり、IBM、Cisco、Oracle、Apple などによってコマンドは少しずつ異なります。DD-WRT の
nvram
コマンドは変数に割り当てられた値の表示や変更、変数の削除をするのみなので、非常に単純です。nvram
コマンドをオプションなしで実行すると、さまざまなオプションと構文が表示されます。
root@linksys:~# nvram usage: nvram [get name] [set name=value] [unset name] [show]
nvram show
コマンドはルーターのすべての設定を表示します。設定は大量にあります。less
を使用すると、一度に
1 ページ分ずつに分けて設定を表示することができます。
root@linksys:~# nvram show | less
あるいは以下のように grep
を使用して特定の変数の設定を検索して表示することもできます。
root@linksys:~# nvram show | grep ssh
簡単なヒントを無料で教えましょう。誤って Web インターフェースを無効にしてしまい、ただし telnet または SSH を使用できる場合には、以下のようにして Web インターフェースを再度有効にすることができます。
root@linksys:~# nvram set http_enable=1 root@linksys:~# nvram commit root@linksys:~# reboot
変更は再起動後に適用されます。boot_wait 設定を覚えているでしょうか。GUI で遅延時間を変更することはできませんが、nvram
では変更することができます。まず、遅延時間の長さを以下のようにして確認します。
root@linksys:/etc# nvram show |grep wait boot_wait=on wait_time=5
私は心配性なので、以下のように 10 秒に設定することにします。
root@linksys:/etc# nvram set wait_time=10 root@linksys:~# nvram commit
変数を値にかかわらずクリアするためには以下のように入力します。
root@linksys:~# nvram set http_enable="" root@linksys:~# nvram commit
再起動後に特定の変更を破棄したい場合には、nvram commit
を省略します。この方法は、単純に再起動すれば変更を破棄できるため、実験をしている際には便利です。
nvram unset [変数]
は、その変数を完全に削除します。OpenWrt のウィキには優れた nvram
コマンド・リファレンス「NVRAM usage on OpenWrt 'WhiteRussian'」があります (「参考文献」を参照)。
構成がおかしくなった場合にクリーンアップするための最後の手段は、すべての設定をファームウェアのデフォルトにリセットすることです。そのためにはルーターのリセット・ボタンを 30 秒間押し続け、それからルーターを再起動します。この操作によって DD-WRT のデフォルト設定がリストアされますが、ベンダー・オリジナルのファームウェアがリストアされるわけではありません。一部の人達はベンダー・オリジナルのファームウェアがリストアされると誤解しているようです。
第 2 のパーティションを作成する
たとえフラッシュ・メモリーが 8MB 以上ある場合でも、通常の DD-WRT のイメージが占有するのは 4MB
のパーティションです。その使用されていない空間は、パーティションを作成することでファイルの格納に使用することができます。このパーティションは基本的に読み取り専用のストレージとして利用する必要があります。例えば、無線
LAN ホットスポットのスプラッシュ・ページや構成ページ、Web ページ、追加の構成ファイル、ipkg (組み込み機器用の Itsy Package Management
System)
のストレージなどに使用します。ログファイルなど、大量の書き込みが行われるファイルのために、このパーティションを使用してはなりません。フラッシュ・メモリーの書き込み回数は限られており、やがて書き込みできなくなるからです。最近のフラッシュ・メモリーは非常に耐久性が高いのですが、それでも書き込み回数は有限です。既存のファイルシステムを調べるためには、以下のように昔ながらの
df
コマンドを使用します。
root@linksys:/# df -h Filesystem Size Used Available Use% Mounted on /dev/root 4.0M 4.0M 0 100% /
私のルーターには 8 MB のフラッシュ・メモリーがありますが、残りはどこにあるのでしょう。残りは静かに放置され、使用されるのを待っています。「Administration (管理)」 > 「Management (管理)」の順に選択し、「JFFS2 Support (JFFS2 サポート)」セクションで、「JFFS2」を「Enable (有効化)」に、「Clean JFFS2 (JFFS2 のクリーンアップ)」も「Enable (有効化)」に設定します。「Apply Settings (設定)」をクリックしてから、「Reboot Router (再起動)」をクリックします。ルーターが再起動されると、以下のように表示されるはずです。
root@linksys:~# df -h Filesystem Size Used Available Use% Mounted on /dev/root 4.0M 4.0M 0 100% / /dev/mtdblock/3 2.3M 196.0K 2.1M 9% /jffs
JFFS2 は Journalling Flash File System version 2 であり、フラッシュ・ストレージ・メディア用に設計されています。このフラッシュ・メモリーがどのような種類のメディアなのか、少し説明しましょう。このフラッシュ・メモリーは Memory Technology Device という特別なデバイスで、略して MTD と呼ばれます。MTD はハードディスク・ドライブや USB メモリーのようなブロック・デバイスではなく、キーボードやマウスのようなキャラクター・デバイスでもありません。ブロック・デバイスは 512 バイトや 1024 バイトなど、固定サイズのセクターで構成されます。MTD には 128KB 以上の消去ブロックがあります。ブロック・デバイスはセクターの読み取りとセクターへの書き込みという 2 つのことをします。MTD は、消去ブロックからの読み取り、消去ブロックへの書き込み、そして消去ブロックの消去、という 3 つのことをします。
コンパクト・フラッシュ、SD カード、USB メモリーはすべて、深く調べてみれば MTD です。しかしそれらのデバイスがオペレーティング・システムにはブロック・デバイスのように見える理由は、MTD にはフラッシュ・ハードウェア上でブロック・デバイスをエミュレートする Flash Translation Layers (FTL) があるからです。この FTL はホスト・コンピューター上にある場合も、デバイス内部のハードウェア・コントローラーのファームウェア上にある場合もあります。USB メモリーを 1 つ犠牲にし (知識を向上させるための崇高な犠牲です)、分解してみると、フラッシュ・チップそのものである何個かの NAND チップ、そしてマイクロコントローラーが見つかるはずです。
DD-WRT を試すためには、フラッシュ・メモリーについて何点か理解している必要があります。第 1 に、NAND
消去ブロックは「オール・オア・ナッシング」です。つまりブロック全体を消去してから新しいデータを書き込む必要があります。第 2 に、Linux には MTD
サブシステムがあり、また基本的なタスク (デバイスのイメージ消去やデバイスへのイメージ書き込みなど) を実行するための mtd
コマンドがあります。DD-WRT でオプションを付けずに mtd コマンドを実行すると、さまざまなオプションと構文が表示されます。mtd
コマンドの使用に関するハウツー解説が DD-WRT のウィキに書かれており、それを見れば mtd
コマンドを理解できるはずです。第 3 に、nvram
はフラッシュ・メモリーの最後の消去ブロック上にあり、消去ブロックの大きさによらずプログラムによって 32KB に制限されています。
コマンドラインに関するヒント
DD-WRT を詳しく調べる上で、以下のヒントが役立ちます。
- DD-WRT は、組み込み Linux のツールキットとして非常によく使用される BusyBox をベースに構築されています。BusyBox には Linux
のコア・ユーティリティーの簡略版が含まれています。スペースを節約するために man ページはありません。そのため、BusyBox のコマンド (アプレットと呼ばれます)
について学ぶためには man busybox を読む必要があります (「参考文献」を参照)。
ls -l /bin
を実行することで、または/sbin
や/usr/bin
、その他の実行可能バイナリーのディレクトリーで ls -l を実行することで、どのコマンドが BusyBox にシンボリック・リンクされているかがわかります。 - DD-WRT は BusyBox に付属している ash
シェルを使用しています。コマンドラインで「
builtin
」と入力すると、シェルに組み込まれたすべてのコマンドが表示されます。 - 各種の Linux とまったく同じように、/proc や /sys の擬似ファイルシステムや、/etc にある構成ファイルなどから、ハードウェア情報を詳細に調べることができます。
ダウンロード可能なリソース
関連トピック
- 「hostapd を使用した簡単な方法で WiFi に強力な暗号化を実装する」(Carla Schroder 著、developerWorks、2012年4月) を読み、DD-WRT ルーターで WiFi を使用するユーザーに対して強力な WPA2 認証と暗号化を設定する方法を学んでください。
- DD-WRT のウィキに挙げられた DD-WRT の機能について調べてください。
- DD-WRT について、また DD-WRT をサポートする中心となる開発者チームについて学んでください。
nvram
コマンドについて解説した優れたサイト、NVRAM usage on OpenWrt 'WhiteRussian' を訪れてください。- ルーターが実際にブリックしてしまった場合には、「Recover from A Bad Flash」を読んでください。
- DD-WRT プロジェクトのサイトを訪れてください。
- MTD (Memory Technology Device) について学ぶための優れたサイト、Linux MTD を訪れてください。
- DD-WRT のウィキにはチュートリアルや機器のデータベースが用意されています。
- developerWorks の Linux ゾーンには、Linux 開発者や管理者のためのハウツー記事やチュートリアル、ダウンロード、ディスカッション・フォーラムなどのリソースが豊富に用意されています。
- developerWorks の Open source ゾーンには、オープンソース・ツールの情報やオープンソース技術の使い方に関する情報が豊富に用意されています。
- Twitter で developerWorks をフォローするか、あるいは developerWorks で Linux に関するツイートのフィードを購読してください。
- 皆さんに最適な方法で IBM 製品を評価してください。製品の試用版をダウンロードする方法、オンラインで製品を試す方法、クラウド環境で製品を使う方法、あるいは SOA Sandbox で数時間を費やし、サービス指向アーキテクチャーの効率的な実装方法を学ぶ方法などがあります。