Tech Note Plus

PC から Azure まで幅広い伝道を目指してます

OpenWrt で DDNS (MyDNS.JP) を試す!

この記事では OpenWrt の DDNS に関する設定を記載しています。なお、DNS プロバイダーは MyDNS.JP となります。

DDNS に求める要件

やりたいこと

実家は V6 プラスの非固定グローバルアドレスしか持っていないため、名前で環境に接続しようとすると DDNS が必要となります。 将来的な OpenWrt への入れ替えも視野に入れているため、試すだけ試して将来に備えます。

OpenWrt における DDNS の実装方法

OpenWrt では追加のモジュールを導入して設定をすることで、DDNS を構成できます。

DDNS の設定方法

MyDNS.JP でのアカウント登録
  1. MyDNS.JP (join us) から新規にアカウントを開設します。
MyDNS.JP でのドメインとレコード設定
  1. [Domain Info] Domain を設定してドメイン名を決定します。
  2. [Domain Info] Hostname (最低でも、*/A レコード) を設定して名前解決に対して応答可能にします。 ※ * は、ホスト名を省略した場合 (つまり、ドメイン名そのもの) のレコードを意味します。
    ※ A は、その際に IPv4 のアドレスを返す設定です。ちなみに、AAAA は IPv6 のアドレスです。
  3. [Domain Info] 確認を押して設定を反映します。
DDNS、管理画面(日本語化含む)
  1. [システム]-[ソフトウェア] フィルターddns-scripts と入力し、インストール を押します。
    ※ 一度 OS を再起動してしまうとパッケージリストの取り直しが必要なので、その場合は「リストを更新..」を実施してください。
  2. 依存関係の確認が行われるので インストール を押します。
  3. パッケージが読み込まれるので、閉じる を押します。
  4. 1-3 を繰り返します。パッケージ名は luci-app-ddns です。最近のアップデートなのか言語ファイルは本体のモジュールのインストール時に Suggest ってでて既定でチェック済みなので一緒にインストールしてくれるようになったようです。
  5. ログアウトすると、画面上部に [サービス]-[Dynamic DNS] が出現します。今回は、デフォルトで入っている 2 つのサンプルを修正して利用します。
DDNS の設定
  1. [サービス]-[Dynamic DNS]-[サービス]-[myddns_ipv4 (編集)] 以下の設定を行い、Switch service を押します。

    設定項目 設定値
    Lookup Hostname 取得したドメイン
    DDNS Service provider mydns.jp

  2. [サービス]-[Dynamic DNS]-[サービス]-[myddns_ipv4 (編集)]-[Basic Settings] 以下の設定を行い、保存 → 保存&適用 を押します。 なお、既定の設定で wan ネットワーク上のグローバルアドレスを通知する設定ですので問題のある方は詳細設定タブも修正してください。

    設定項目 設定値
    ドメイン 取得したドメイン
    ユーザー名 MyDNS.JP から発行されたログインユーザー名
    パスワード MyDNS.JP から発行されたログインパスワード
    Use HTTP Secure チェック (任意) ※
    CA 証明書のパス IGNORE (任意) ※

    ※ 更新時に HTTPS を用いる設定と接続時に証明書を用いるかという設定です。

  3. [サービス]-[Dynamic DNS]-[サービス]-[myddns_ipv4] リロードを行い、表示が更新されることを確認します。ステータスが Running に変わり、プロセス ID が表示され、Last/Next Update に時刻が表示されます。

  4. MyDNS.JP 側の [IP ADDR DIRECT] IPv4 Address で値を確認できます。

DDNS (IPv6) の設定 (任意)

基本的には IPv4 の場合と全く同じやり方でサンプルを修正することで設定可能です。

  • MyDNS.JP でのドメインとレコード設定において AAAA レコードを定義しておく
  • 修正する定義は myddns_ipv6
  • 通知されるネットワークは既定で wan6 なので問題がある場合には修正する

その他

OS を再起動すると DDNS が動かない?

私の環境でも発生しましたし、海外のコミュニティでも同様の問題が挙げられているようで、 スタートアップで /etc/init.d/ddns restart を実行すれば回避できるということでした。 が、既存のサンプル定義を流用した場合そもそもこの問題が起こらないように見えました。。。ご参考までに。

IPv4 定義における GUI のバグ?

uci コマンドや設定ファイルを vi エディタで修正することで GUI を使わずに設定することが可能です。 もちろん動作します。が、一度設定した後に GUI で設定を見ようとするとおかしなことになります。

  • CLI で設定
  • GUI で確認 (なぜか Switch service を再度押させられる → 設定した内容が消えているように見える)
  • 保存してしまうと設定した定義が本当に消える

これを防ぐためには、IPv4 の場合は use_ipv6 パラメーターを "0" として設定しておくと良いです。 デフォルトの IPv6 の定義の場合、use_ipv6 が "1" で設定されているからかこの問題は起きませんが、作り直す際には気を付けた方がよいです。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

openwrt.org

OpenWrt の DDNS 設定を終えて

こうして OpenWrt を使って DDNS で動的な名前解決が可能になりました。実家の入れ替えも近い?


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。

OpenWrt で WireGuard (Site to Site) を試す!

この記事では OpenWrt の WireGuard の S2S 接続に関する設定を記載しています。既に P2S の設定は以下の記事にて完了しています。 cube309b.hatenablog.com

WireGuard に求める要件

やりたいこと

私の環境では、既に VPN パッケージを二種類利用している関係から WireGuard の採用は見送っています。 しかしながら、実家側のルーターを OpenWrt に入れ替えることになれば OpenVPN をやめて WireGuard に統一可能になるので、試すだけ試して将来に備えます。

OpenWrt における WireGuard の実装方法

P2S の時と変わりありません。画面最上部の過去記事を参照ください。

WireGuard の設定構造

P2S の時と変わりありません。画面最上部の過去記事を参照ください。ちなみに、サーバーの場合だと下図になります。

WireGuard の設定方法

WireGuard、管理画面(日本語化含む)

P2S の時と変わりありません。画面最上部の過去記事を参照ください。

WireGuard の設定方法 (Site A)

証明書の作成
  1. SSH で OpenWrt に接続し、以下を入力します。

    umask go=
    wg genkey | tee sitea.key | wg pubkey > sitea.pub
    wg genkey | tee siteb.key | wg pubkey > siteb.pub
    wg genpsk > s2s.psk
  2. その後、以下を続けて入力して sitea.key、sitea.pub、siteb.key、siteb.pub、s2s.psk の値を控えておきます。

    cat sitea.key
    cat sitea.pub
    cat siteb.key
    cat siteb.pub
    cat s2s.psk
インターフェースの登録
  1. [ネットワーク]-[インターフェース]-[インターフェース] インターフェースを新規作成を押します。
  2. 名前:wg0 or wgxプロトコル:WireGuard VPN として、インターフェースを作成を押します。
  3. [一般設定] 以下の設定を行います。

    設定項目 設定値
    秘密鍵 sitea.key の中身の文字列
    公開鍵 sitea.pub の中身の文字列
    リッスンポート 任意の数値 (控えておく)

  4. [ファイアウォール設定] ファイアウォールゾーンの作成または割り当てlan に変更します。

  5. [ピア] ピアを追加を押します。

  6. 以下を入力の上、保存 → 保存 → 保存&適用を押します。

    設定項目 設定値
    説明 定義の名前。わかりやすく
    公開鍵 siteb.pub の中身の文字列
    秘密鍵 siteb.key の中身の文字列
    事前共有鍵 s2s.psk の中身の文字列
    許可された IP Site B で利用されているサブネット
    許可された IP のルート チェック
    エンドポイントホスト Site B のグローバルアドレス
    エンドポイントポート Site B の待ち受けポート
    永続的なキープアライブ 25

通信の許可
  1. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール] 追加を押します。

  2. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[一般設定] 以下の設定を行います。

    設定項目 設定値
    名前 定義の名前。わかりやすく
    プロトコル UDP
    送信元アドレス Site B のグローバルアドレス
    送信元ゾーン wan
    宛先ゾーン バイス (入力)
    宛先ポート 前項で定義したものと同一の必要がある

  3. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[詳細設定] アドレスファミリの制限IPv4 のみに変更し、保存 → 保存&適用を押します。

WireGuard の設定方法 (Site B)

インターフェースの登録
  1. [ネットワーク]-[インターフェース]-[インターフェース] インターフェースを新規作成を押します。
  2. 名前:wg0 or wgxプロトコル:WireGuard VPN として、インターフェースを作成を押します。
  3. [一般設定] 以下の設定を行います。

    設定項目 設定値
    秘密鍵 siteb.key の中身の文字列
    公開鍵 siteb.pub の中身の文字列
    リッスンポート 前項で定義したものと同一の必要がある

  4. [ファイアウォール設定] ファイアウォールゾーンの作成または割り当てlan に変更します。

  5. [ピア] ピアを追加を押します。

  6. 以下を入力の上、保存 → 保存 → 保存&適用を押します。

    設定項目 設定値
    説明 定義の名前。わかりやすく
    公開鍵 sitea.pub の中身の文字列
    秘密鍵 sitea.key の中身の文字列
    事前共有鍵 s2s.psk の中身の文字列
    許可された IP Site A で利用されているサブネット
    許可された IP のルート チェック
    エンドポイントホスト Site A のグローバルアドレス
    エンドポイントポート Site A の待ち受けポート
    永続的なキープアライブ 25

通信の許可
  1. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール] 追加を押します。

  2. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[一般設定] 以下の設定を行います。

    設定項目 設定値
    名前 定義の名前。わかりやすく
    プロトコル UDP
    送信元アドレス Site A のグローバルアドレス
    送信元ゾーン wan
    宛先ゾーン バイス (入力)
    宛先ポート 前項で定義したものと同一の必要がある

  3. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[詳細設定] アドレスファミリの制限IPv4 のみに変更し、保存 → 保存&適用を押します。

複数のピアを設定した場合の挙動

例えば、私のように 外 ⇔ Site A ⇔ Site B ということも可能です (A が Hub になって外と Site B の二つのピアを設定)。この場合、注意点としては、外や Site B 側の許可された IP に対向 (外や Site B) のアドレス情報を入力しておく必要があります。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

openwrt.org

OpenWrt の WireGuard 設定を終えて

こうして OpenWrt を使って WireGuard でリモートアクセス可能になりました。実家側を入れ替えたくなってきました・・・。


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。

OpenWrt で WireGuard (Point to Site) を試す!

この記事では OpenWrt の WireGuard の P2S 接続に関する設定を記載しています。

WireGuard に求める要件

やりたいこと

私の環境では、To Azure = strongSwan、To 実家 = OpenVPN と既に二つの VPN ソフトウェアを利用してます。 運用面の考慮からこれ以上 VPN ソフトウェアを増やすわけにはいかないので、必然的に To 自宅は OpenVPN になってしまいます。

そのため、WireGuard は現時点では採用の予定がないですが、VPN ソフトウェアとしては先進的なものとも聞いているので試すだけ試して将来に備えます。

OpenWrt における WireGuard の実装方法

OpenWrt では追加のモジュールを導入して設定をすることで、WireGuard を構成できます。 OpenVPN や strongSwan と異なって複数のファイルに分かれて設定が保存されることはなく、インターフェースの設定と統合されています。また、証明書作成以外は GUI ですべて行えます。

WireGuard の設定構造

これは OpenWrt に限ったことではありませんが、WireGuard は「サーバー」と「ピア」という設定構造を持っています。 「サーバー」は自分自身の情報であり「ピア」は接続先の情報となり、これを相手と対にして持つことで接続を行う仕組みです。つまりこうです。

  • 「サーバー」は相手にとっての「ピア」
  • 「ピア」は相手にとっての「サーバー」

この情報 (接続先や証明書等) が一致したときに始めて接続されます。

WireGuard の設定方法 (全体で一回のみ)

WireGuard、管理画面(日本語化含む)
  1. [システム]-[ソフトウェア] フィルターwireguard-tools と入力し、インストール を押します。
    ※ 一度 OS を再起動してしまうとパッケージリストの取り直しが必要なので、その場合は「リストを更新..」を実施してください。
  2. 依存関係の確認が行われるので インストール を押します。
  3. パッケージが読み込まれるので、閉じる を押します。
  4. 1-3 を繰り返します。パッケージ名は luci-app-wireguard です。最近のアップデートなのか言語ファイルは本体のモジュールのインストール時に Suggest ってでて既定でチェック済みなので一緒にインストールしてくれるようになったようです。
  5. インターフェースプロトコル追加となるので再起動します。(これ、再起動以外でもなんとかしたいな・・・)

WireGuard の設定方法 (待ち受けサーバーごとに一回)

証明書の作成
  1. SSH で OpenWrt に接続し、以下を入力します。

    umask go=
    wg genkey | tee wg0server.key | wg pubkey > wg0server.pub
  2. その後、以下を続けて入力して wg0server.key、wg0server.pub の値を控えておきます。

    cat wg0server.key
    cat wg0server.pub
インターフェースの登録
  1. [ネットワーク]-[インターフェース]-[インターフェース] インターフェースを新規作成を押します。
    ※ 画面は作成後ですので本来であればまだ wg0 は存在しない状態です。
  2. 名前:wg0 or wgxプロトコル:WireGuard VPN として、インターフェースを作成を押します。
  3. [一般設定] 以下の設定を行います。

    設定項目 設定値
    秘密鍵 wg0server.key の中身の文字列
    公開鍵 wg0server.pub の中身の文字列
    リッスンポート 任意の数値 (控えておく)

  4. [ファイアウォール設定] ファイアウォールゾーンの作成または割り当てlan に変更し、保存 → 保存&適用を押します。

通信の許可
  1. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール] 追加を押します。

  2. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[一般設定] 以下の設定を行います。

    設定項目 設定値
    名前 定義の名前。わかりやすく
    プロトコル UDP
    送信元ゾーン wan
    宛先ゾーン バイス (入力)
    宛先ポート 前項で定義したものと同一の必要がある

  3. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[詳細設定] アドレスファミリの制限IPv4 のみに変更し、保存 → 保存&適用を押します。

WireGuard の設定方法 (接続クライアント一台ごとに一回)

証明書の作成
  1. SSH で OpenWrt に接続し、以下を入力します。

    umask go=
    wg genkey | tee wg0client1.key | wg pubkey > wg0client1.pub
    wg genpsk > wg0client1.psk
  2. その後、以下を続けて入力して wg0client1.key、wg0client1.pub、wg0client1.psk の値を控えておきます。

    cat wg0client1.key
    cat wg0client1.pub
    cat wg0client1.psk
ピアの設定
  1. [ネットワーク]-[インターフェース]-[インターフェース]-[wg0 (編集)]-[ピア] ピアを追加を押します。
  2. 以下を入力の上、Generate configuration... を押します。

    設定項目 設定値
    説明 接続クライアントの識別のための名前。わかりやすく
    公開鍵 wg0client1.pub の中身の文字列
    秘密鍵 wg0client1.key の中身の文字列
    事前共有鍵 wg0client1.psk の中身の文字列
    許可された IP クライアント側が VPNトンネル内で利用する IP (控えておく) ※
    許可された IP のルート チェック
    永続的なキープアライブ 25

    ※ /32 でも /24 のようにレンジでもよいですが、クライアント側にこの後定義する仮想インターフェースのアドレスはここと一致させる必要があります。

  3. 画面右下の文字列を一度クリップボードにコピーし、# ListenPort not defined. の行を以下の通りに書き直して再度控えておきます。その後、Back to peer configuration を押します。

    [Interface]
    PrivateKey = WPaqqvOSlOn0hqdp5cawdjVlw7ejgo2BRKrLcvldR08=
    Address = 許可された IP で控えた値のレンジ内の IP   
       
    [Peer]
    PublicKey = Wy0q+wRXH5hP6e95X78Zh3PmQHhEHLarfP2gsBuwECA=
    PresharedKey = zpI9as7mLeRWKWaN792NRdYUiMzomzaa9LJyXhwWPJY=
    AllowedIPs = 0.0.0.0/0, ::/0 ※
    Endpoint = xxx.xxx.xxx.xxx:65432
    PersistentKeepAlive = 25

    ※ ちなみに、この例ですとデフォルトルートが WireGuard に向いているため、VPN に関係のない通信まで VPN 経由で通信する設定になります。もし、限定したい場合は、192.168.1.0/24 のように VPN でつなぎたい先のアドレス空間に限定した方がよいでしょう。

  4. 保存 → 保存 → 保存&適用を押します。

WireGuard クライアントの設定 (Windows の場合)
  1. 以下の URL にアクセスしてクライアントモジュールを端末にダウンロードして実行します。特に画面などもなく。 www.wireguard.com

  2. アプリケーションを起動後、空のトンネルを追加を押します。

  3. 名前にわかりやすい定義名を入力後、入力フィールドに前項で控えた値をコピー&ペーストし、トンネルを通らないトラフィックのブロック (キルスイッチ) のチェックは外した上で、保存を押します。

    キルスイッチとは、VPN が切断された場合にすべての通信も一緒に切断することで VPN 無しでインターネット等に接続しないようにする保護機構のことです。

  4. 有効化を押せば VPN に接続され、無効化を押せば VPN から切断されるようになります。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

openwrt.org

OpenWrt の WireGuard 設定を終えて

こうして OpenWrt を使って WireGuard でリモートアクセス可能になりました。確かに接続も早いのでこっちを使いたい・・・。


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。

ゼロベースビルドで x86 用の OpenWrt のイメージを作成する

この記事ではゼロから OpenWrt のインストールイメージを作成する手法を記載しています。OpenWrt のアップデートに関する概論説明は以下の記事にて完了しています。 cube309b.hatenablog.com

ゼロベースビルドに求める要件

やりたいこと

OS を初回起動する時点で IPIP6 のパッケージがインストール済みな状態にしたい。

なぜゼロベースビルドを採用せずに Image Builder 方式を採用したか

いくつか理由はあります。

  • ビルドに CPU の性能が必要 (私の家では、最低 30 分以上ビルドに時間がかかる)
  • Linux カーネルを変更するほどの使い方をしていない
  • ディスク容量がそれなりに必要 (50GB ぐらい用意しても 70% 程度は使ってしまう)
  • オプション増やすと時間かけた挙句にビルドに失敗する

ゼロベースビルドによるイメージ作成手順

フロー

全体の流れは以下の通りです。環境はすぐに OS を戻せる仮想環境が推奨です。

Ubuntu Server をインストール

別に Ubuntu でなくても大丈夫で、画面最下部のリンク先に対応 OS の記載があります。なお、OS は既定値のインストールで特に問題ありません。 あえて言えば、SSH は利用するのでインストールウィザードの中で OpenSSH server はインストールしておきましょう。

あと、SSHUbuntu に接続し、以下のコマンドを実行してマシンの HDD 容量をきっちり LVM に割り当て切らないと容量不足でエラーになります。 デフォルトでマシンの HDD の半分ぐらいしか OS 側に与えず残りは空き容量として確保してしまうみたいです。

sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

なお、ビルドコマンドは特権昇格について内部で処理される仕組みのようで、sudo であらかじめ昇格してしまうとエラーが発生します。 そのため、明確に sudo を記載していないコマンドについてはそのまま一般ユーザーで実行してください。

Ubuntu Server にビルド用ツールをインストール

こちらも画面最下部のリンク先に対応 OS とビルドツールの準備手順が記載されています。SSHUbuntu に接続し、以下のコマンドを実行します。

sudo apt update
sudo apt install build-essential clang flex bison g++ gawk gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget
sudo apt install qemu-utils

qemu-utils は .img を .vmdk に変換するツールです。私の場合、検証で VMware 上に OpenWrt を構築することがあるので、変換ツールが必要でした。 ビルドの中で .vmdk ファイルを作るオプションがあるのですが指定するとビルドに 100% 失敗するようなので止めました。

GitHub からソースコードをフルクローン

SSHUbuntu に接続し、以下のコマンドを実行してフルクローンを取得します。

git clone https://git.openwrt.org/openwrt/openwrt.git

Ubuntu Server のバックアップを取得

次回に備えてきれいな環境でビルドできるように、ここで基となる全体バックアップを取得しておきます。 イメージの取り出しが終わったらこの時点のバックアップに戻して次回以降に備えます。

GitHub からソースコードを Pull クローン

SSHUbuntu に接続し、以下のコマンドを実行して差分でクローンを取得した上で目的のバージョンをチェックアウトします。

cd openwrt
git pull
git tag
git checkout v22.03.5
git branch -a

コメント
git tag チェックアウト可能なバージョンを表示するコマンド
git branch -a 実際にチェックアウトされたかを確認するコマンド
IPIP6 用の feed の修正と、インストール

このあとビルド用の設定を行いビルドするわけですが、公式なモジュールではない IPIP6 パッケージはそのままでは選択できません。 そのため、作成者の指示に従って IPIP6 のパッケージも Github から追加でダウンロードできるようにします。SSHUbuntu に接続し、以下のコマンドを実行します。

cp feeds.conf.default feeds.conf
cat << EOF >> feeds.conf
src-git ipip6 https://github.com/HiraokaHyperTools/openwrt-ipip6.git
EOF
./scripts/feeds update -a
./scripts/feeds install -a

イメージのビルド

実際のビルドは ImageBuilder のようにコマンドを直接実行するわけではなく、.config ファイルにオプションを記載してコマンド実行する形になります。 この .config を作成するために GUI のようなインターフェースが用意されていて、それが make menuconfig コマンドとなります。

  1. SSHUbuntu に接続し、以下のコマンドを実行します。

    make menuconfig
  2. 以下のような画面が起動しますので、設定をすべて行って、Exit → Save で終了してください。これで .config に内容が反映されます

    コメント
    Target System x86
    Subtarget x86_64
    Target Images tar.gz/squashfs/Build GRUB images の選択を外す
    LuCI -> 1. Collections luci
    Network ipip6

    ※ パッケージ追加ぐらいなら大丈夫だと思いますが、オプション追加はこける可能性もあるのでほどほどに (減らす分には問題なさそう)
    ※ ダウンロードページの config.buildinfo はオリジナルのビルドオプションで、これをダウロードして .config と差し替えることも可能。ただ、すごい数のオプションが選択済みでうんざり。。。
    ※ モジュール選択は、M と * を選択できますが、* を選択すること
    ※ 任意ではありますが、https 接続用の luci-ssl の設定箇所を失念しました・・・

  3. ビルドのために以下のコマンドを実行します。数字は並列で利用する CPU の数となり、オプション数とこの CPU の数で処理時間が変わります。一説には 6 時間かかる方も・・・。

    make -j 8 V=s
イメージの取り出し

ビルドが完了すると、~/openwrt/bin/targets/x86/64 ディレクトリ内に openwrt-x86-64-generic-ext4-combined-efi.img.gz というファイルが出来上がっているのでこのファイルを取り出します。

あとは、rufus アプリケーションなどで USB メモリに img.gz ファイルを焼きこんでミニ PC に挿入して起動します。万が一アップデート後に問題が出ても切り戻せるように、それまで使ってたのではない別の USB メモリを使ってください。

VMware 用のイメージの取り出し (おまけ)
  1. SSHUbuntu に接続し、以下のコマンドを実行します。 出来上がった .img.gz をコピーしてから qemu-img コマンドで VMware で利用可能な .vmdk ファイルに変換しています。

    cd ~/openwrt/bin/targets/x86/64
    cp openwrt-x86-64-generic-ext4-combined-efi.img.gz openwrt-x86-64-generic-ext4-combined-efi-vmdk.img.gz
    gunzip openwrt-x86-64-generic-ext4-combined-efi-vmdk.img.gz
    qemu-img convert -f raw -O vmdk openwrt-x86-64-generic-ext4-combined-efi-vmdk.img OpenWrt.vmdk
  2. 変換が完了すると、~/openwrt/bin/targets/x86/64 ディレクトリ内に OpenWrt.vmdk というファイルが出来上がっているのでこのファイルを取り出します。

  3. なお、ESXi 上ではこの .vmdk ファイルをそのまま仮想マシンにアタッチしても起動しないようなので、以下のコマンドで一度変換させてから既存の HDD としてアタッチする必要があります。

    vmkfstools -i OpenWrt.vmdk OpenWrt-cv.vmdk -d thin

    ※ このコマンド、データストアに .vmdk ファイルをアップロードして、カレントディレクトを移動した上で実行します。(ESXi 上で実行するのでお間違えなく)

OpenWrt の設定

今回は設定ファイルは戻していないため、起動した OS にはパッケージこそ必要なものが入っていますが設定がありません。 設定ファイルを戻すかコマンドで設定してください。私は、設定をコマンドに残しているので、5 分もあればインターネット接続まで完了できるようにしました。

Ubuntu Server のリストアを実行

OS 内にゴミが残らないように、OS ごときれいにリストアして次回以降に備えます。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

openwrt.org openwrt.org github.com

OpenWrt のアップデートイメージ作成を終えて

こうして OpenWrt 公式側がバージョンアップしても追従できるようになりました。ルーターをアップデートするのに一時的とはいえ別のルーターが必要なんてやっぱりないですよね。


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。

Image Builder で x86 用の OpenWrt のイメージを作成する

この記事では Image Builder を用いて OpenWrt のインストールイメージを作成する手法を記載しています。OpenWrt のアップデートに関する概論説明は以下の記事にて完了しています。 cube309b.hatenablog.com

Image Builder に求める要件

やりたいこと

OS を初回起動する時点で IPIP6 のパッケージがインストール済みな状態にしたい。

なぜ Image Builder 方式を採用したか

いくつか理由はあります。

  • ビルドに CPU の性能が不要 (ダウンロード時間にもよるが、慣れると 15 分以内)
  • Linux カーネルを変更するほどの使い方をしていない
  • ディスク容量もそんなにいらない (全部で 25GB でもかなり余裕あり)

Image Builder を用いたイメージ作成手順

フロー

全体の流れは以下の通りです。環境はすぐに OS を戻せる仮想環境が推奨です。 ビルド状態をリストアするコマンドなどもあるようですがゴミが残るケースもあるようなので、OS ごと戻した方がよいです。

Ubuntu Server をインストール

別に Ubuntu でなくても大丈夫で、画面最下部のリンク先に対応 OS の記載があります。なお、OS は既定値のインストールで特に問題ありません。 あえて言えば、SSH は利用するのでインストールウィザードの中で OpenSSH server はインストールしておきましょう。

なお、ビルドコマンドは特権昇格について内部で処理される仕組みのようで、sudo であらかじめ昇格してしまうとエラーが発生します。 そのため、明確に sudo を記載していないコマンドについてはそのまま一般ユーザーで実行してください。

Ubuntu Server にビルド用ツールをインストール

こちらも画面最下部のリンク先に対応 OS とビルドツールの準備手順が記載されています。あえて言えば、Ubuntu 22.04 の場合 python3 が含まれているため、python のインストールは不要でした。
SSHUbuntu に接続し、以下のコマンドを実行します。

sudo apt update
sudo apt install build-essential libncurses5-dev libncursesw5-dev zlib1g-dev gawk git gettext libssl-dev xsltproc rsync wget unzip
sudo apt install qemu-utils

qemu-utils は .img を .vmdk に変換するツールです。私の場合、検証で VMware 上に OpenWrt を構築することがあるので、変換ツールが必要でした。

Ubuntu Server のバックアップを取得

ビルドする度にゴミが残る可能性があるようなので、OS ごときれいに戻せるようにここで基となる全体バックアップを取得しておきます。 イメージの取り出しが終わったらこの時点のバックアップに戻して次回以降に備えます。

イメージのビルド
  1. SSHUbuntu に接続し、以下のコマンドを実行します。x86 における当該バージョン用の Image Builder をダウンロードして解凍しています。

    ovirsion="22.03.5"
    wget https://downloads.openwrt.org/releases/$ovirsion/targets/x86/64/openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64.tar.xz
    tar -J -x -f openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64.tar.xz
    コメント
    ovirsion アップデートするバージョンを指定します
  2. ovirsion 変数が消えないように SSH のセッションを切らずに以下のコマンドを実行します。外部から持ち込む必要がある .ipk ファイルを packages フォルダに配置します。

    cd openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64/packages
    wget https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-temp-status_0.3-5_all.ipk
    コメント
    luci-app-temp-status_0.3-5_all.ipk 温度表示を概要ページに表示させるモジュール
  3. また、以下を参考にして ipip6_0.1_all.ipk を作成して同じように packages フォルダに配置します。 cube309b.hatenablog.com

  4. ovirsion 変数が消えないように SSH のセッションを切らずに以下のコマンドでビルドします。

    cd ..
    make image PROFILE="generic" PACKAGES="uhttpd luci luci-ssl luci-i18n-base-ja luci-i18n-opkg-ja luci-i18n-firewall-ja openvpn-openssl luci-app-openvpn luci-i18n-openvpn-ja ip-full kmod-ip-vti kmod-crypto-gcm strongswan-minimal adblock luci-app-adblock luci-i18n-adblock-ja tcpdump-mini ipip6 luci-app-temp-status"
    コメント
    uhttpd Web サーバー。指定しないと Web 接続不可
    luci Web 表示機能。指定しないと Web 接続不可
    luci-ssl Web 表示時に https での接続を受け付ける機能。任意
    ipip6 V6 プラス固定 IP でインターネット接続する機能。一番大事
    luci-app-temp-status 温度表示を概要ページに表示させる機能

    ※ ほかのモジュールは過去の連載の中で私が導入してきたモジュールなので説明は割愛します。

ビルドのパラメーターや機能にまつわる余談
  1. Image Builder の .tar.xz を解凍したルートフォルダで make info を実行すると既定の情報がわかる

    1. make image の PROFILE 引数に与えるプロファイル名
    2. 既定でインストールされるパッケージ名の一覧
    3. 既定でインストールされるファームウェアの一覧
    Current Target: "x86/64"
    Current Architecture: "x86_64"
    Current Revision: "r20134-5f15225c1e"
    Default Packages: base-files ca-bundle dropbear fstools libc libgcc libustream-wolfssl logd mtd netifd opkg uci uclient-fetch urandom-seed urngd busybox procd procd-ujail procd-seccomp partx-utils mkf2fs e2fsprogs kmod-button-hotplug dnsmasq firewall4 nftables kmod-nft-offload odhcp6c odhcpd-ipv6only ppp ppp-mod-pppoe
    Available Profiles:   
    
    generic:
        Generic x86/64
        Packages: kmod-amazon-ena kmod-amd-xgbe kmod-bnx2 kmod-e1000e kmod-e1000 kmod-forcedeth kmod-fs-vfat kmod-igb kmod-igc kmod-ixgbe kmod-r8169 kmod-tg3
        hasImageMetadata: 0
  2. PACKAGES 引数内でパッケージ名の前に「-」をつけると、そのパッケージを現在のビルド予定のイメージから削除可能 (-ppp-mod-pppoe のような表記)

  3. パッケージ≠ .ipk ファイル名なので、あらかじめ現行機で echo $(opkg list-installed | sed -e "s/\s.*$//") を実行すると PACKAGES 引数内で定義可能な文字列が取得可能 (例:パッケージ名:ipip6、ファイル名:ipip6_0.1_all.ipk)
  4. make image に FILE 引数を用いると任意のコンフィグファイルを OS インストール時に配置可能
イメージの取り出し

ビルドが完了すると、~/openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64/bin/targets/x86/64 ディレクトリ内に openwrt-指定したバージョン-x86-64-generic-ext4-combined-efi.img.gz というファイルが出来上がっているのでこのファイルを取り出します。

あとは、rufus アプリケーションなどで USB メモリに img.gz ファイルを焼きこんでミニ PC に挿入して起動します。万が一アップデート後に問題が出ても切り戻せるように、それまで使ってたのではない別の USB メモリを使ってください。

VMware 用のイメージの取り出し (おまけ)
  1. ovirsion 変数が消えないように SSH のセッションを切らずに以下のコマンドを実行します。出来上がった .img.gz をコピーしてから qemu-img コマンドで VMware で利用可能な .vmdk ファイルに変換しています。

    cd ~/openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64/bin/targets/x86/64
    cp openwrt-$ovirsion-x86-64-generic-ext4-combined-efi.img.gz openwrt-$ovirsion-x86-64-generic-ext4-combined-efi-vmdk.img.gz
    gunzip openwrt-$ovirsion-x86-64-generic-ext4-combined-efi-vmdk.img.gz
    qemu-img convert -f raw -O vmdk openwrt-$ovirsion-x86-64-generic-ext4-combined-efi-vmdk.img OpenWrt.vmdk
  2. 変換が完了すると、~/openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64/bin/targets/x86/64 ディレクトリ内に OpenWrt.vmdk というファイルが出来上がっているのでこのファイルを取り出します。

  3. なお、ESXi 上ではこの .vmdk ファイルをそのまま仮想マシンにアタッチしても起動しないようなので、以下のコマンドで一度変換させてから既存の HDD としてアタッチする必要があります。

    vmkfstools -i OpenWrt.vmdk OpenWrt-cv.vmdk -d thin

    ※ このコマンド、データストアに .vmdk ファイルをアップロードして、カレントディレクトを移動した上で実行します。(ESXi 上で実行するのでお間違えなく)

OpenWrt の設定

今回は設定ファイルは戻していないため、起動した OS にはパッケージこそ必要なものが入っていますが設定がありません。 設定ファイルを戻すかコマンドで設定してください。私は、設定をコマンドに残しているので、5 分もあればインターネット接続まで完了できるようにしました。

Ubuntu Server のリストアを実行

OS 内にゴミが残らないように、OS ごときれいにリストアして次回以降に備えます。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

openwrt.org

OpenWrt のアップデートイメージ作成を終えて

こうして OpenWrt 公式側がバージョンアップしても追従できるようになりました。ルーターをアップデートするのに一時的とはいえ別のルーターが必要なんてやっぱりないですよね。


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。

OpenWrt でアップデートを考える

この記事では OpenWrt の更新に関して概要的な内容を記載しています。実際の手順はまた別の記事に起こす予定です。

なぜ更新運用を (真面目に) 考えなければならなかったのか

OpenWrt におけるざっくりとした更新方式

私が調べた範囲では大きく分けて以下の二つの方式に大別されます。

  • アップデート
  • 新規インストール&設定残し

ただ、両方の方式が全てのプラットフォームに等しく提供されているわけではありません。 例えば、私が持っているプラットフォームで言うと、x86 (ミニ PC や VMware 仮想マシン) ではアップデートは行えません。 新規インストール用のイメージしか提供されていないためです。

sysupgrade.bin という名前のファイルがアップデート用のファイルなのですが、 プラットフォームのダウンロードページに存在しない場合、できないということになります。

【アップデート用のイメージが提供されている場合 (sysupgrade.bin が提供されている)】

【アップデート用のイメージが提供されていない場合 (sysupgrade.bin が提供されていない)】

自分でインストールしたパッケージは消滅する運命

アップデート/新規インストールいずれの手法を採用したとしても自分でインストールしたパッケージは消えてなくなります。 誤解なきように伝えると、公式/非公式関係なく自分で導入したパッケージが消えるのです。

IPIP6 パッケージが消滅するとインターネットには接続できなくなる問題

以前の記事で投稿したように、私の環境では V6 プラスで固定 IP を実施するために有志が作成したモジュールをインストールしています。 cube309b.hatenablog.com

このモジュールも当然アップデートに伴って消滅していますので、設定が残っていようといまいとモジュール再インストールまでの間インターネットには接続できなくなってしまいます。 ところが、このモジュールはインターネットを含むネットワークから完全に途絶した状態では導入がかなり難しいです。(※)

※ .ipk ファイルを使ってローカルでインストールしようにも、今度は依存関係のあるモジュールもインストールが必要で。。。

これは、インターネットに接続するためのモジュールを手に入れるためにインターネットが必要という、絵にかいたような「ニワトリが先かタマゴが先か」問題なのです。

一時的に別のルーターの配下に入れてアップデートをする?

そのままやろうとするとこの方法しかありません。つまり、一時的に別のルーターにインターネット接続を行わせ、 その下でアップデートを終えたルーターを切り替えるという流れです。

  1. 対象機のネットワーク情報 (LAN 側のアドレスなど) を一時的なものに変更
  2. 一時機を設置しインターネットに接続できる環境を作成
  3. 対象機をアップデートし、本番の設定を復元 (LAN の情報は復元しない)
  4. 一時機を停止
  5. 対象機のネットワーク情報 (LAN 側のアドレスなど) を正式なものに変更

ルーターの機種変更等であれば動作検証のためにこのようなやり方もありでしょうが、毎回のアップデートでこんな時間をかけるわけにはいきません。

OpenWrt のインストールイメージを自分でビルドすることで解決

こうなると出来合いのインストールイメージだと問題は解決できないため、自分でインストールイメージを作る必要が発生します。 自分でインストールイメージを作る際に IPIP6 のパッケージも込みで作成すればよいということで手法を調査することになりました。

その 1:Image Builder を用いたイメージ作成

自作 PC でいう BTO に近いイメージです。Linux カーネルという基本部分はあらかじめビルドが完了しているものを使って、 上に乗せるパッケージや設定ファイルを足し引きして自分だけのイメージを作る形です。

実際にはビルド用の Linux 環境を用意して、ビルドに関連するツールをインストールした後にビルドします。 WSL の環境でも動くには動きそうですが、そもそも OpenWrt 自体 WSL でビルドすることを明確に非推奨にしているようです。

その 2:一からビルドするイメージ作成

自作 PC でいうカスタムメイド PC に近いイメージで、Linux カーネルという基本部分から全てパラメーターを決めて一から作る形になります。 設定に関しては GUI っぽいメニューもあるのでわかりやすい方ではあります。

なお、こちらの方式は CPU の性能次第でビルド時間が 30 分から数時間と延びるようなので、ビルドマシンの性能が今一つな場合、採用は難しいかもしれません。 アップデートの度にこれやるんですか?という質問の回答になるので・・・。

Image Builder の場合と同様にビルド用の Linux 環境を用意して、ビルドに関連するツールをインストールした後にビルドします。 WSL の注意事項も同じです (非推奨)。

検討を終えて

両方試した結果、私は前者の Image Builder 方式でビルドすることにしました。続く

cube309b.hatenablog.com


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。

OpenWrt で豆腐フィルタを使って広告をブロックする

この記事では OpenWrt の Adblock に関する設定を記載しています。既に OpenWrt を用いたインターネット接続は以下の記事にて完了しています。 cube309b.hatenablog.com

Adblock に求める要件

やりたいこと

広告フィルタです。説明は・・・不要ですね。インターネットを閲覧している際に発生する広告をブロックしたい。

OpenWrt における Adblock の実装方法

OpenWrt では追加のモジュールを導入して設定をすることで、Adblock を構成できます。

Adblock の設定方法

方式概要

Adblock を設定する際に必要なのは以下の 1 つのファイルとなります。

  1. /etc/adblock/adblock.sources.tofu.gz:豆腐フィルタが追加されたブロックリスト提供元ファイル

Adblock 及び関連モジュール
  1. [システム]-[ソフトウェア] フィルターadblock と入力し、インストール を押します。
    ※ 一度 OS を再起動してしまうとパッケージリストの取り直しが必要なので、その場合は「リストを更新..」を実施してください。
  2. 依存関係の確認が行われるので インストール を押します。
  3. パッケージが読み込まれるので、閉じる を押します。
  4. 1-3 を繰り返します。パッケージ名は luci-app-adblock です。
  5. 1-3 を繰り返します。パッケージ名は luci-i18n-adblock-ja です。
  6. 1-3 を繰り返します。パッケージ名は tcpdump-mini です。このモジュールは直接広告ブロックに使われるものではないですが、意図せずブロックしてしまったドメインを解除するホワイトリスト運用の際に必要になります。
  7. ログアウトすると、画面上部に [サービス]-[Adblock] が出現します。
/etc/adblock/adblock.sources.tofu.gz の記述
  1. SSH で OpenWrt に接続し、以下のコマンドを実行します。基になる /etc/adblock/adblock.sources.gz ファイルがモジュールのアップデートで上書き消去されるため、コピーして解凍してから使います。

    cp /etc/adblock/adblock.sources.gz /etc/adblock/adblock.sources.tofu.gz
    gunzip /etc/adblock/adblock.sources.tofu.gz
  2. vi エディタなどで /etc/adblock/adblock.sources.tofu ファイルに以下を追記します。

            "tofu": {
                    "url": "https://raw.githubusercontent.com/tofukko/filter/master/Adblock_Plus_list.txt",
                    "rule": "BEGIN{FS=\"[|^]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+\\^(\\$third-party)?$/{print tolower($3)}",
                    "size": "S",
                    "focus": "ads_analysis",
                    "descurl": "https://github.com/tofukko/filter"
            },
    コメント
    rule サンプルの日本語フィルタのルールに合わせてみました
    size 行数が 7000 未満でドメイン数はさらに少ないので S にしました ※

    ※ サイズに関しては、本記事最下部のリンクより確認可能です。

  3. 以下のコマンドを実行します。圧縮して /etc/adblock/adblock.sources.tofu.gz にしています。

    gzip /etc/adblock/adblock.sources.tofu
Adblock 設定
  1. SSH で OpenWrt に接続し、以下のコマンドを実行します。カスタムファイルを読み込む設定にしています。

    uci set adblock.global.adb_srcarc="/etc/adblock/adblock.sources.tofu.gz"
    uci commit adblock
  2. [サービス]-[Adblock]-[設定]-[ブロックリスト提供元] ソースtohu を追加選択し、保存&適用を押します。

  3. 同じく [サービス]-[Adblock] 再起動を押します。statusenabled になっていることを確認します。

Adblock の運用方法

ホワイトリスト運用

広告ブロックを設定すると意図せず動作しないサイトが発生することになります。そんな時はいずれのドメインがブロックされたのかを確認し、ホワイトリストに設定する運用が必要になります。

  1. [サービス]-[Adblock]-[設定]-[一般設定] DNS レポートをチェックし、保存&適用を押します。もちろんこれは初回のみです。

  2. [サービス]-[Adblock]-[DNS レポート] リフレッシュしながら、対象のドメインを特定します。

  3. [サービス]-[Adblock]-[ホワイトリストの編集] ブロックされて困るドメインを入力し、保存を押します。

OS を再起動すると Adblock が動かない?

サービス起動に時間がかかる関係なのか、OS を再起動すると広告ブロックが動きません。起動後に手動でリロードなりサービス再起動なりをすれば動くのですが。。。きれいなやり方ではないのですが、Try&Error で自動起動に成功する秒数を計測して rc.local の中でサービスをリロードすることにしました。

[システム]-[スタートアップ]-[ローカルスタートアップ] 以下を設定し、保存を押します。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

github.com

OpenWrt の Adblock 設定を終えて

こうして OpenWrt を使って豆腐フィルタでの広告ブロックが可能になりました。


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。