PINE A64+ で VPN Server 備忘録

Photo by hyt.

前回記事

の続き.PINE A64+ がどの程度の性能なのかを調...

で,PINE A64+ の性能評価をした結果,特に ANSI-NI 対応であること,Gigabit Ethernet 対応であることから,VPN Server として使うことにしたと書きました.今回はその詳細の備忘録です.

VPN として何を使うか?

なるべく色々なものに対応させたいと思います.ただし,

  1. MacOS と iOS の対応を考慮すると,L2TP/IPSec への対応
  2. ANSI-NI で高速化ができること

は必須としておきます.

その上で,VPN プロトコルごとに別のサーバーソフトウェアを設定は避けたいのですが,オープンソースなものでこのような用途に対応できるのは Softether 以外知りません.したがって,まずは Softether VPN Server で L2TP/IPSec への対応を目指すことにします.

事前準備

Softether VPN Server はバイナリパッケージとして導入するのが普通なのではないかと思いますが,残念ながら arm 版は32bit版しかありません.今回のシステムは arm ですが,64bit 環境ですので,ソースコードからコンパイルすることにします.まずはその事前準備から.

Softether の Git サイト

を見ると,

  • gcc
  • libncurses-dev
  • libreadline-dev
  • make
  • openssl-dev

が必要だと書いてありますが,Ubuntu の場合,openssl-dev の代わりに libssl-dev を指定しないといけません.

依存関係でかなりたくさんのパッケージが入ります.

Softether のコンパイルと AES-NI 対応についての注意

次は,Git で Softether のソースコードを取得し,コンパイルする準備をします.

このままだと /usr 以下にいろいろ入るので,Makefile を以下の通り変更して,/usr/local 以下に入る様調整します.

なお,2ch(今は 5ch かな?)を見ると,-m64 を削除しないと make できないような記述が見つかるのですが,実際にはやらなくても make できてしまいます(いろいろ WARNING は出るが).

ところで,Softether VPN Server はインテルのライブラリを用いて AES-NI を有効化する方法があるようです.

そのためには,Intel の AES-NI ライブラリを利用できる様コンパイルしなければならないのですが,そのソースコードを眺めると,x86 のインラインアセンブラで CPU の種類を判定している部分があります.当然,この部分は arm ではコンパイル不能ですし,私にはどうやって直したら良いのかも分からないので,今回は,Softether でインテルのライブラリを用いた AES-NI の有効化はあきらめました.

ただし,だからと言って,AES-NI の効果がないとは言えないと思っています.

と言うのも,Softether VPN Server は openssl の evp 関数を用いて暗号化を行っている様です(このあたり参照).前回記事を見てもらえるとわかりますが,evp を使う場合は,AES-NI による高速化が行われているみたいなので,結局,openssl のライブラリ経由で AES-NI 対応になるんじゃないかと.ただし,きちんとソースコードを追っかけた訳じゃありません.識者の方おられましたらお教えいただけると有り難いです.

Bridge インターフェースの準備

Softether のコンパイルとインストールが済んだら,次は Bridge インターフェース(br0)の準備を行います.と言うのも,

に説明があるのですが,Softether とLANのインターフェース(今回は eth0)を直接ブリッジしてしまうと,VPN 経由で当該インターフェースにアクセスできなくなってしまうからで,これを避けるため,Linux の仮想ネットワークデバイス(tap_se0)と eth0 を br0 にブリッジさせることにします.なお,もちろん,VPN 経由で eth0 にアクセスできなくて構わないのであればこの節の内容は省力して構わない訳です(セキュリティ的にはこちらの方が望ましいかもしれない).

このためには,まず,ネットワークブリッジの作成等を行うパッケージを導入します.

次にブリッジインターフェース(今回は br0)を起動時に作成するよう設定します.

なお,今回は固定アドレスとしましたが,

  • iface br0 inet static ⇒ iface br0 inet dhcp

のように記せば DHCP による割り当ても可能です(目的から言って固定にするのが普通だと思いますが).

インターフェース eth0 は br0 にブリッジされるので,アドレスの割当は行わないよう,以下の通り設定を変更します.

正しく設定できていれば,再起動後,以下の様な感じになるはずです.

Softether の初期設定と仮想インターフェースのブリッジの設定

正直,Softether の初期設定は,コマンドラインからではなく,GUI 版の「SoftEther VPN サーバー管理マネージャ」を使った方が分かり易いのですが,今回はあえてコマンドラインから設定していくことにします(GUI 設定アプリを導入するのが面倒だった).

まず,vpnserver を起動と終了をテストします.

次に,Softether の DDNS 機能を無効化します.Softether VPN Server はデフォルトで Softether 社が運営する DDNS サーバーを用いるようになっているのですが,今回は Softether のものではなく,ルーターの DynamicDNS 機能を利用するからです.これは,vpnserver の設定ファイルの DDnsClient ディレクティブを無効にすることで行えます.

なお,Softether の設定ファイルは DOS 形式の改行コードを持つことから,vi で編集するときは行末に ^M が表示されますが,そのまま編集していることに注意してください.

次に,vpncmd で Softether の設定を行います.

まず,vpnserver のパスワードを設定します.

次に仮想スイッチ DEFAULT (標準で定義されている)と tap デバイスをブリッジします.

次に,現時点で有効な VPN 接続方式を確認し,L2TP over IPSEC(事前共有鍵 xxxxxx)のみを有効にします.

ここまでで,いったん vpncmd を終了させ,インターフェースの状態を見ると,以下の様になるはずです.

最後にブリッジインターフェースである br0 とブリッジします.ただし,この設定は再起動後に消えてしまうことに注意が必要です.

利用者の作成と仮想スイッチの設定

次は VPN の利用者(今回は vpnuser とします)の作成と仮想スイッチの設定を行います.

まずは,仮想スイッチのパスワードを設定します.

次に,利用者として vpnuser を登録します.

ここまで設定出来たら,ルーターの DynamicDNS の設定や,ポートの解放(今回は L2TP over IPSEC なので,たぶん UDP 500 と 4500)の設定を行い,クライアント(ios, MacOS Windows 等)から接続試験を行います.なお,

  • ID: vpnuser
  • Password: (設定した vpnuser のパスワード)
  • 共有鍵: vpn

です.また,MacOS や iOS の設定や DynamicDNS の設定は本 blog では解説しません.

などをご覧ください.

無事接続できることを確認できたら,次は vpnserver が起動時にサービスとして自動的に起動する様設定を行います.

Softether のサービス化

最近の Linux ディストリビューションだと,systemd を用いてサービス化するのが普通だと思うのですが,Ubuntu 16.04 の場合は昔ながらの init.d 以下にサービスを登録する方法も使えるようです.実際,/etc/init.d 以下をみると,

の様にずらっと見慣れたファイルがありますので,これに習い,今回は /etc/init.d 以下に vpnserver のサービス化ファイルを配置することにしました.

なお,途中で sudo systemctl daemon-reload としているのは,service コマンドで起動しようとすると WARNNING が出るからです.どうも ubuntu の場合,init.d 以下にサービス化ファイルを作ったとしても,init ではなく systemd を用いてサービスを起動しているようですね.これを見ると初めから systemd でサービス化する設定ファイルを準備した方が良かったかもしれません.

きちんと全て正常に動くかどうか再起動して試して終了です.

Softether のリージョンロック?

ここまででとりあえず最低限 L2TP/IPSec で接続できる VPN Server ができあがるはずです.Softether 自体は,L2TP/IPSec 以外にも

  • Softether
  • PPTP
  • OpenVPN
  • SSTP
  • L2TPv3
  • EtherIP

など,おおよそ考えうる限りの方式に対応した VPN サーバーとして振る舞えますが,その設定方法については,Softether のマニュアル

を参照してください.また,今回は最低限 L2TP/IPSec サーバとして動くよう設定しただけです.外部に公開されるサービスですので,追加的なファイヤーウォールの設定や監視等も必ず行なわなければならないことにご注意ください.

なお,参考にさせて頂いた記事

を見ると,リージョンロックなる文言があり,何のことかと追ってみると,これは

の通り,RADIUS 認証や固有証明書認証のロックのことらしいです.これを外すかどうかは自己責任とありますが,もちろん今回は見送りとしています.でも,この機能があれば,Windows の Radius と暗号化ありで連携できる可能性が高い訳で,以前の本件についての記事

ちょっとした興味から Free で使える Softether ...

で暗号化できないのが問題だと書きましたが,これがどうにかできるかもしれないと言うことです.しかしもちろんこんなこと個人レベルでやるようなことではないですし,実験的ならともかく本格的に利用するつもりなら当然 Softether の有料版を使うべきでしょうね.

以上!

スポンサーリンク
large rectangle advertisement
スポンサーリンク
large rectangle advertisement