panda大学習帳外伝

素材の味を活かしたリール動画。

ASUS TUF-AX5400のether-wakeの実行用及びOpenVPNの起動用のシェルスクリプト等をNVRAMに置くことにした話。 | メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー


ARMv7用のstaticリンクされたOpenVPNをビルドしてみた。

最終更新日: Mon Feb 21 06:24:04 2022 +0900

はじめに

ASUS TUF-AX5400(以下、単に「TUF-AX5400」と書きます。)は無線LANルーターなのですが、ARMv7のプロセッサ(しかも3コア)が搭載されていて、SSHでログインが可能なように設定できます。

これは何か別の目的に使わないともったいないような気がしたことと、TUF-AX5400のファームウェアにはOpenVPNが含まれていない(よって、使用できない)ものと思い込んでいたので、TUF-AX5400にUSB経由で接続したストレージ上にstaticリンクされたOpenVPNをインストールして使うことができないか試してみることにしました。

スポンサーリンク

ビルド環境の準備

Ubuntu 20.04 LTS

当たり前といえば当たり前の話ですが、TUF-AX5400のファームウェアにはgccをはじめとする開発ツール群は含まれていません。

そこで、クロスビルドを行うことを考えます。

「とりあえず、Fedoraでクロスビルド環境を作ろうかな。」と思ったのですが、dnfコマンドでインストールできるgccのクロスコンパイラではビルドができませんでした。

そこで、参考文献[1]を参考にしつつ、VirtualBoxにUbuntu 20.04 LTSをインストールしてビルド環境とすることにしました。なお、ビルド環境上で使用するユーザ名として”panda”を使用することにしたため、ホームディレクトリは”/home/panda”になっています。

クロスコンパイラのインストール

ビルド環境上で以下のコマンドを実行し、クロスコンパイラをインストールします。

$ sudo apt install gcc-arm-linux-gnueabihf



OpenVPNのビルドに必要なソフトウェアのビルド

OpenVPNのビルドにはOpenSSL及びLZOが必要なので、先にクロスコンパイラでビルドします。

OpenSSL及びLZOのこの記事を最初に書いた時点(2022年1月)における最新版をビルドします。

OpenSSL

以下の手順でビルドします。なお、最初のmkdirコマンドで作成したディレクトリ(/home/panda/openvpn-arm)の下にビルドの結果生成されたファイル等を置きます。

$ mkdir /home/panda/openvpn-arm
$ wget https://www.openssl.org/source/openssl-3.0.1.tar.gz
$ cd openssl-3.0.1
$ ./Configure gcc -static -no-shared --prefix=/home/panda/openvpn-arm --openssldir=/home/panda/openvpn-arm --cross-compile-prefix=arm-linux-gnueabihf-
$ make
$ make install

LZO

以下の手順でビルドします。

$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
$ tar zxvf lzo-2.10.tar.gz
$ cd lzo-2.10
$ ./configure --prefix=/home/panda/openvpn-arm --enable-static --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --disable-debug
$ make
$ make install

OpenVPNのビルド

OpenSSL及びLZOのビルドに成功すると、OpenVPNがビルドできるようになります。

OpenVPNは以下の手順でビルドします。configureコマンドの引数は長いため、バックスラッシュで折り返しています。

$ wget https://swupdate.openvpn.org/community/releases/openvpn-2.5.5.tar.gz
$ tar zxvf openvpn-2.5.5.tar.gz
$ cd openvpn-2.5.5/
$ export PREFIX=/home/panda/openvpn-arm
$ ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf \
              --prefix=${PREFIX} --enable-static --disable-shared \
			  --disable-debug --disable-plugins \
			  OPENSSL_LIBS="-L/home/panda/openvpn-arm/lib -lssl -lcrypto" \
			  OPENSSL_CFLAGS="-I/home/panda/openvpn-arm/include" \
			  OPENSSL_CRYPTO_LIBS="-L/home/panda/openvpn-arm/lib -lcrypto" \
			  OPENSSL_CRYPTO_CFLAGS="-I/home/panda/openvpn-arm/include" \
			  LZO_CFLAGS="-I/home/panda/openvpn-arm/include" \
			  LZO_LIBS="-L/home/panda/openvpn-arm/lib -llzo2"
$ make LIBS="-all-static"
$ make LIBS="-all-static" install

ビルドに成功すると、/home/panda/openvpn-arm/sbinの下にopenvpnが生成されます。

$ panda@resort:~/openvpn-arm$ ls -l /home/panda/openvpn-arm/sbin
合計 7836
-rwxr-xr-x 1 panda panda 8022284  1月 11 19:17 openvpn

スポンサーリンク

動作の確認

動作の確認は前節までの手順で生成したOpenVPNの実行ファイル(以下、「openvpn」と書きます。)をTUF-AX5400にコピーすることにより行います。

コピーができたら、TUF-AX5400上で以下のコマンドを実行します。なお、以下のコマンドの実行時にはopenvpnを/jffs/openvpnディレクトリの下にコピーしています。

pandanote@TUF-AX5400-AA38:/jffs/openvpn/conf# nohup /jffs/openvpn/openvpn --config client.conf 2>&1 /dev/null &

上記のコマンドを実行後、ip addr showコマンドを実行します。

pandanote@TUF-AX5400-AA38:/jffs/openvpn/conf# ip addr show
(中略)
44: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 192.168.aaa.bbb peer 192.168.aaa.ccc/32 scope global tun0
       valid_lft forever preferred_lft forever

pingが通るかどうか確認してみます。

pandanote@TUF-AX5400-AA38:/jffs/openvpn/conf# ping 192.168.aaa.ddd
PING 192.168.aaa.ddd (192.168.aaa.ddd): 56 data bytes
64 bytes from 192.168.aaa.ddd: seq=0 ttl=64 time=27.576 ms
64 bytes from 192.168.aaa.ddd: seq=1 ttl=64 time=27.688 ms

実はTUF-AX5400のファームウェアにはOpenVPNが含まれていることが作業中に判明したので、/var/log/openvpn.logに出力されているログ出力を確認し、新たにビルドしたopenvpnが起動されているかどうか確認します。

2022-01-15 01:32:03 OpenVPN 2.5.5 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] bu
ilt on Jan 10 2022
2022-01-15 01:32:03 library versions: OpenSSL 3.0.1 14 Dec 2021, LZO 2.10

新たにビルドしたバージョンのopenvpnが起動されていることが確認できます。

スポンサーリンク

おまけ: Fedora35で試してみたところ、うまくいかなかった件。

Fedora35でもクロスビルドができないか試してみましたが、OpenSSLのConfigureコマンドを実行後にmakeを実行すると…

[panda@pandanote.info openssl-3.0.1]$ make
make depend && make _build_sw
make[1]: Entering directory '/home/panda/openvpn-arm/openssl-3.0.1'
make[1]: Leaving directory '/home/panda/openvpn-arm/openssl-3.0.1'
make[1]: Entering directory '/home/panda/openvpn-arm/openssl-3.0.1'
aarch64-linux-gnu-gcc  -I. -Iinclude -Iapps/include  -pthread -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DOPENSSLDIR="\"/home/panda/openvpn-arm/openssl-3.0.1/target/ssl\"" -DENGINESDIR="\"/home/panda/openvpn-arm/openssl-3.0.1/target/lib/engines-3\"" -DMODULESDIR="\"/home/panda/openvpn-arm/openssl-3.0.1/target/lib/ossl-modules\"" -DOPENSSL_BUILDING_OPENSSL -DNDEBUG  -MMD -MF apps/lib/libapps-lib-app_libctx.d.tmp -MT apps/lib/libapps-lib-app_libctx.o -c -o apps/lib/libapps-lib-app_libctx.o apps/lib/app_libctx.c
In file included from include/openssl/types.h:20,
                 from apps/include/app_libctx.h:13,
                 from apps/lib/app_libctx.c:9:
include/openssl/e_os2.h:234:12: fatal error: inttypes.h: No such file or directory
  234 | #  include <inttypes.h>
      |            ^~~~~~~~~~~~
compilation terminated.
make[1]: *** [Makefile:3508: apps/lib/libapps-lib-app_libctx.o] Error 1
make[1]: Leaving directory '/home/panda/openvpn-arm/openssl-3.0.1'
make: *** [Makefile:2518: build_sw] エラー 2

…となって、makeの実行に失敗してしまいました。

Fedora35のパッケージとしてダウンロードできるgccのクロスコンパイラは必要最低限のものらしく(参考文献[2])、ユーザスペースのビルドには対応していないとのことなので、この先の作業は断念することにしました。

まとめ

OpenVPNがTUF-AX5400に含まれていることが判明したため、OpenVPNを使えるようにするという観点からは冗長な作業となりましたが、ARMv7用のソフトウェアをクロスビルドする機会はあまりないので、その手順を確認することには役立ったと思います。

何かの参考にしていただけると幸いです。

参考文献

  1. How to compile statically linked OpenVPN client for ARMv5
  2. Cross compiling to ARM

リンク

ASUS TUF-AX5400のether-wakeの実行用及びOpenVPNの起動用のシェルスクリプト等をNVRAMに置くことにした話。 | メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー


スポンサーリンク