プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

リモートアクセスVPN を QNAP 上で動かす

今まで、こちらの記事にあるように、 SoftEther を利用して自宅LANへのリモートアクセスを実現していました。

しかし、SoftEtherVPN の Server を動かすために動かしていたマシンを廃棄したくなってきたため、これを QNAP 上に移動できないか検討したので、その際のメモをまとめておきます。

QNAP の機種は下記の TS-251+ を使ってます。

www.qnap.com

SoftEther VPN Server 立ち上げ

QNAP TS-251+ だと、 Virtualization Station と Container Station があり、仮想マシンとdockerコンテナを動かすことができます。 dockerコンテナで動かしたいなと思ったのですが、NIC周りでトラブルのが嫌だったので、とりあえずは Virtualization Station (KVM) 上で仮想マシンを立ち上げ、そちらで動かしてみました。

OS は、 Ubuntu 16.04.2 (64bit, サーバー)としました。 SoftEther VPN Server は現時点の最新版を使います(Ver 4.20, Build 9608, rtm)。ダウンロードページはこちらになります。

インストール手順としては、ほぼこちらの記事と変わりないのですが、若干違いがあったところだけ、追記しておきます。

起動方法

Ubuntu は 16.04 からスタートアップ処理が SysVinit から systemd に変更になったそうです。 これに伴い、 /etc/init.d にスタートアップスクリプトを書くスタイルから、 /etc/systemd/system に起動用設定ファイルを書くスタイルになったそうです。

で、ネットを探すと、そのものずばりのサイトがありました。

Systemd用SoftEther設定ファイル - blog.204504byse.info

qiita.com

実際に作成したスクリプトは下記になります。

[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target

リンク先サイトまんまですね。 これを、 /etc/systemd/system/vpnserver.service として保存しておきます。

OS再起動後、vpnserverプロセスが立ち上がっていたらOKです。

(参考)

systemd 一般の話のリンクも載せておきます。

eng-entrance.com

qiita.com

qiita.com

NIC の追加とプロミスキャスモード

SoftEther VPN Server を使って、リモートアクセスを可能にするためには、ローカルブリッジを作る必要があります。

以前の環境だと、 ESXi 上で動かしていたため、ポートグループを作成して、そちらでプロミスキャスモードを設定するという方法を取っていました。 詳しい手順などは、下記を参考にしてください。

blog.mori-soft.com

QNAPの場合、仮想スイッチがあり、物理NICと仮想マシン上の(仮想)NICがこの仮想スイッチを経由して接続されているようです。 でも、仮想スイッチの設定に『プロミスキャスモード』みたいなものがありません。

どう設定すればいいのだろうか? と思って、あれこれ調べたのですが、これといった決め手が見つかりませんでした。

ただ、仮想スイッチは大きく3つの動作モードを持っているようで、仮想マシンと物理NICを直接つなげるような使い方でできるようです(外部専用ネットワーク)。

www.qnap.com

これを使えば、実現できそうな気がします。

ということで、とりあえず、今回は下記のように対応することにしました。

  • 外部専用ネットワークの仮想スイッチを作成する
  • TS-251+ の物理NICが1つ余っているので、これを作成した仮想スイッチにつなげる
  • 仮想マシンに(仮想)NICを追加し、この仮想スイッチに接続する
  • OS側の設定で、追加した仮想NICに対して、IPアドレスを 0.0.0.0 として設定する

外部専用ネットワークの仮想スイッチは、仮想スイッチの作成画面で、

f:id:junichim:20170710161302p:plain

『IPアドレスを割り当てない』を選択すると作れるようです。

設定後の TS-251+ のネットワークの設定画面をみると、こんな感じになります。

f:id:junichim:20170710160613p:plain

ちょっとわかりにくいですが、下側の Virtual Switch 4 というのが外部専用ネットワークで作成した仮想スイッチで、ここにつながっている仮想NICが上記で追加したものです。

/etc/network/interfaces の設定内容はこんな感じです。

mor@ubuntu-vpn:/etc/network$ cat interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens3
iface ens3 inet dhcp

# nic for SoftEther VPN Server
# added by Junichi MORI
# 2017/7/9
auto ens4
iface ens4 inet static
address 0.0.0.0

mor@ubuntu-vpn:/etc/network$ 

ens3 が一つ目のNIC、ens4が追加した二つ目のNICになります。

ちなみに、今回は起動時に rc.local とかで ifconfig ens4 promisc としていないのですが、ifconfig で設定内容を表示させると、ens4 に対して PROMISC が表示されていました。 以前セットアップした際は必要かと思っていたのですが、必要ないのかな? Ubuntu 16.04 だからなのか、Linuxは一般にこうなるのか、IPアドレスが 0.0.0.0 だからなのかまでは、ちょっとわからなかったです。

(参考)nicのデバイス名

Ubuntu 15.10 からnicのデバイス名の命名方法が変わっているようです。 eth0 や eth1 じゃなくて、 ens3 や ens4 となっています。

CentOS7 の記事ですが、命名規則がわかりやすかったです。

www.atmarkit.co.jp

お気を付けください。

その他

以前の方法だと、SoftEther VPN Server の設定として VPN Azure を使っていたのですが、結構おもい印象でした(いろんな要因があるので、これだけではないとは思います)。

今回はVPN Azure のよくある質問ページにも書いてある NATトラバーサル(NAT-T, 一般的には UDP ホールパンチング)を使うように変更しました。

とはいっても、クライアントとして SoftEther VPN Client を使えば接続時に自動的に試してくれるので、特別な設定は必要ないです。

SoftEther VPN Client の設定

NAT-Tを使うため、クライアント側では、 Softether VPN Client を使う必要があります。

Windows の場合

下記の手順に従って、インストール、設定をすれば完了です。

8.2 Windows へのインストールと初期設定 - SoftEther VPN プロジェクト

初回起動時に仮想LANカードが作成されます。接続設定として

  • VPN サーバー名(DDNS名)
  • ポート番号
  • VPN接続ユーザー名とパスワード

を入力すればOKです。

特に設定が間違っていなければ、これで接続できるはずです。

Linux の場合

SoftEther VPN Client はLinux版もあります。設定用のGUIツールがないので、やることはWindows版と同じですが、vpncmd で設定することになります。 設定時に使う主なコマンドとしては

  • NicCreate, 仮想LANカードの作成
  • AccountCreate, 新規接続設定の開始
  • AccountPasswordSet, 認証情報の設定

  • AccountConnect 接続

  • AccountStatusGet 接続状態の確認
  • AccountDisconnect 切断

かと思います。必要に応じてhelpコマンドで調べてください。

また、上記設定だけだと、VPN接続が成功しても、仮想LANカードにIPアドレスが割り当てられません。 なので、仮想LANカードがDHCPからアドレスを取得できるように /etc/network/interfaces に設定を書いておきます。

例えばこんな感じです。

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

allow-hotplug vpn_vpn0
iface vpn_vpn0 inet dhcp

ここでは仮想LANカード名を vpn0 としました。

これで接続を試して、問題なく接続できれば、OKです。

おわりに

これで問題なく QNAP 上で運用できるようになると、今まで使っていた古いサーバーを処分できるので、部屋が少しは涼しくなりそうです。 当面は問題が起こらないか様子見ですね。

あと、Linux 上で VPN Server を動かす場合 tap デバイスを使うのが定番のような印象を受けています。おいおい、このあたりも調べて試してみようと思います。

QNAP TS-251+ の設定(UPSおよび他NASとの連携)

昨年10月頃に購入した、 QNAP TS-251+ にやっとUPSをつないだので、その経緯をまとめてみました。

QNAP の NAS は USBでUPSを接続して、簡単に停電時の電源断などの設定ができます。このとき、自分をマスターにして、ネットワーク経由で他のNASをUPSと連動させることもできます。1台のUPSに複数の機器を接続しているときに有効ですね。ちなみに、他社製のNASでも類似の機能はよくあります。

なので、TS-251+ にUPSを繋げて、既存のNETGEARのReadyNASと連動させればいいんじゃないの?と簡単に考えて、設定したのですがこれがどうもうまくいきません。 久しぶりにドはまりしました。何とかして連携させるようにしたので、その顛末をまとめておきます。

の前に、やりたいことをまとめるとこうなります

同じUPSについないでいる2台のNASを連動させたい

  • UPS : APC ES 550G
  • QNAP TS-251+
  • NETGEAR ReadyNAS Ultra2

ところで、NAS の UPS 機能、自社シリーズしか対応していないというのが多いような印象ですが、これなんとかならないですかね? > 各メーカーさん

NUTについて

ReadyNAS (Ultra2) は古い機種なので、同じようなことで悩んでいる先人がきっといるはず、ということで、ググってみると、一応それなりに情報が出てきました。 基本的には、QNAP も ReadyNAS も NUT (Network UPS Tools) というのを元に、これらの機能を実現しているようです。NUT自体はオープンソースのようです(ライセンスGPL2、こちらで言及)。

なので、NUTの設定さえなんとかなれば、なんとかなるんじゃないかという甘い期待を持ちつつ、いろいろと調べていきました。

実現方法

どちらのNASも一方をマスターにして、その他のNASをスレーブ(ネットワーク経由でUPSを監視)として動作させることができます。 結論からすると、今回の場合、最終的に実現したのは、

  • QNAP : master
  • ReadyNas : slave

として動作させることでした。

基本的な設定方法としては、

http://www.ryanbibbey.com/2014/10/26/setup-nas-remote-ups-monitoring/

https://community.netgear.com/t5/New-to-ReadyNAS/Duo-V2-Remote-UPS-monitoring-sorted-v-5-3-7/td-p/862527

に従っています。

QNAP 側の設定

まず、UPSを TS-251+ に接続します。 この状態で、NASにログインすると、外部機器が接続されました』というダイアログが表示されます。

f:id:junichim:20170224112426p:plain

『外部デバイス設定を表示する』を選択するとUPSの設定画面が表示されます。 正しく接続できていれば、画面下部に、UPSのバッテリー残量などの情報が表示されます。

f:id:junichim:20170224102228p:plain

表示されていない場合は、接続に問題ないか、TS-251+ で使えるUPSかどうか、などを調べてみてください。

まずは、TS-251+ 側でUPSを設定します。

f:id:junichim:20170224102900p:plain

このとき、必ず『ネットワークUPSサポートを有効にする』にチェックを入れて、通知先になるNAS(スレーブとして動作するReadyNAS)のIPアドレスを入力しておきます(ちょっと面倒ですが、GUIからは、個別のIPアドレスでの入力になります)。

次に、SSH経由でログインします。NUT関係の設定は、 /etc/config/ups にあります。 upsd.users ファイルを開き、masterに接続する際のユーザー情報を修正します。

[admin]
                password = 123456
                allowfrom = localhost
                actions = SET
                instcmds = ALL
                upsmon master           # or upsmon slave

とある、allowfromを

                allowfrom = ALL

のように、ローカルホスト外からでも接続できるように変更しておきます。

設定を変更したら、

upsd -c reload

として、変更後の設定を読み込ませておきます。

ReadyNAS (Ultra2) 側の設定

まず、SSHでログインします。

ReadyNAS のNUT関係の設定は、 /etc/nut にあります。 upsmon.conf ファイルを開き

MONITOR UPS@localhost 1 monuser pass master

の行を

MONITOR qnapups@ts-251+のIPアドレス 1 admin 123456 slave

と変更します。

『qnapups』がUPS名で、QNAPの /etc/config/ups/ups.conf で定義されている名前になります。 『admin 123456』がネットワーク経由で接続する際のユーザー名とパスワードで、QNAP の /etc/config/ups/upsd.users で定義されています。

QNAP側のUPSの機能として、これらの名前を変更することができないようです。なお、ReadyNAS側は、UPS名が UPS で固定です。これが、メーカー間の連動ができない一因ですかね。

次に、 /etc/init.d/readynas_startup を開いて

if [ "$ENABLE_REMOTE_UPS" = "1" ]; then
  if [ -s /etc/frontview/ups.conf ]; then              
    . /etc/frontview/ups.conf                          
    UPSID="`upsc UPS@$UPS_SERVER 2>$DBG|awk -F': ' '/ups.mfr:|ups.model:/ { if($1==\"ups.mfr\") printf $2 \" \"; else print $2; }'`"
    if /sbin/upsmon -p &>$DBG; then                                                                                      
      echo "${UPSID}!!OK" >/var/log/frontview/ups.log
    else                                             
      echo "${UPSID}!!FAIL" >/var/log/frontview/ups.log
    fi                                                 
  else                              
    echo "Unknown UPS!!FAIL" >/var/log/frontview/ups.log
  fi                                                    
fi                    

の部分を

if [ "$ENABLE_REMOTE_UPS" = "1" ]; then
  if [ -s /etc/frontview/ups.conf ]; then              
    . /etc/frontview/ups.conf                          
    # change for qnap nas    
    #UPSID="`upsc UPS@$UPS_SERVER 2>$DBG|awk -F': ' '/ups.mfr:|ups.model:/ { if($1==\"ups.mfr\") printf $2 \" \"; else print $2; }'`"
    UPS=`awk '/^MONITOR/ { print $2 }' /etc/nut/upsmon.conf`                                                                         
    UPSID="`upsc $UPS 2>$DBG|awk -F': ' '/ups.mfr:|ups.model:/ { if($1==\"ups.mfr\") printf $2 \" \"; else print $2; }'`"
    if /sbin/upsmon -p &>$DBG; then                                                                                      
      echo "${UPSID}!!OK" >/var/log/frontview/ups.log
    else                                             
      echo "${UPSID}!!FAIL" >/var/log/frontview/ups.log
    fi                                                 
  else                              
    echo "Unknown UPS!!FAIL" >/var/log/frontview/ups.log
  fi                                                    
fi                    

と変更します。

(たぶん)ReadyNAS起動時に、 upsc を使って、接続先となるUPSの情報を取得して、/var/log/frontview/ups.log に書き込んでいる処理になります。 この際に、UPS名が固定だったのを、設定ファイルの内容を反映するようにしました。

このままでは、リモートUPSの設定が有効ではないので、 /etc/default/services を開いて

ENABLE_REMOTE_UPS=0

ENABLE_REMOTE_UPS=1

と変更します。 また、 /etc/frontview/ups.conf を開いて

UPS_SERVER= ts-251+のIPアドレス

と、リモートUPSサーバーのIPアドレスを指定しておきます(upsmon.conf のIPアドレスと同じです)。 なお、下記設定ファイル

  • /etc/nut/upsmon.conf
  • /etc/default/services
  • /etc/frontview/ups.conf

は管理画面から設定を行うと書き換えられるので、その点には注意してください。

ここまで、設定したらいったん再起動します。 設定に問題がなければ、ReadyNAS の管理画面にログインすると UPS のアイコンがグリーンに点灯していると思います(マウスを重ねるとバッテリー残量などの情報も見れます)。

ここまでくれば、最後は動作テストです。 UPSの電源ケーブルを抜いて、しばらく待つと、TS-251+, ReadyNAS Ultra ともにシャットダウンしました。問題ないようですね。

実は、現在手元にあるNASだと、最初に示したリンク先の設定方法(/etc/init.d/ups-monitor を使う方法)では、GUIのアイコンにUPSの情報が反映されませんでした。 一連の動作を見ていたら、/var/log/frontview/ups.log が正しく作られないようです。 詳細なところは不明だったのですが、上記の readynas_startup スクリプト中に ups.log を作成するところがあったので、ここを修正したら、動くようになったという次第です。

(参考)うまくいかなかった方法など

上記とは逆に、

  • QNAP : slave
  • ReadyNAS : master

で構成することも考えられます。ネット上にもいくつか参考となる情報があり、

https://forum.qnap.com/viewtopic.php?t=81908 https://forum.qnap.com/viewtopic.php?f=182&t=60166

上記の方法でやろうとしたのですが、今のReadyNAS には、dummy-ups ドライバが入っていなくて断念しました。

nasxxx:/etc/nut# ls /lib/nut/
hidups  newhidups  snmp-ups  usbhid-ups
nasxxx:/etc/nut# 

なお、dummy-ups ドライバーを使う場合は、下記の様に起動に失敗するときがあるそうです。

http://serverfault.com/questions/655797/nut-ups-dummy-driver-in-repeater-mode-for-synology-nas

次善の方法として、upsutilを切って、upsmonで起動する というのも試しました。 upsmonを起動できるとあるので、upsutil をkill後起動してみたが、 いつの間にやら、upsutilのプロセスが立ち上がってました。

https://xn3.wiki/qnap/qnap-upsmon http://www.mtom.cz/url/Linux/QNAP+a+NUT

あと、upsmonについては起動できているようで、マスター側(ReadyNAS側)のログに接続成功が出ていたのですが、QNAP側のGUIにはUPSのステータスなどが表示されませんでした。 ということで、この方法は断念しました。

なお、参考までに、upsutilをapcupsdに入れ替える記事というのがあったので、

http://itarou.blogspot.jp/2010/05/ts-419papcupsd.html

これを参考にして、 upsutil を upsmon に入れ替えれば実現できるかもしれません(やってないのでわかりませんが)。

その他にも、TS-251+ では docker/vm が動かせるので、 USB パススルーを使って仮想マシン側にUPSを管理さえればいいんじゃないか、とも思ったのですが、どうもうまくUSB(UPS)のパススルーが設定できなかったので実現できませんでした。

(参考)バージョンなど

QNAP TS-251+ NUT 2.6.5 Readynas Ultra2 NUT 2.0.5

ReadyNas 側の設定内容

  • 設定ファイルの場所:/etc/nut
  • UPS名 (ups.confのセクション名): UPS
  • ユーザー定義 (upsd.users) : monuser, pass

QNAP側の設定内容

  • 設定ファイルの場所:/etc/config/ups
  • UPS名 (ups.confのセクション名): qnapups
  • ユーザー定義 (upsd.users) : admin, 123456

QNAP TS-251+ メモリ増設しました

現在使用中の QNAP TS-251+ ですが、メモリ 2GB のモデルでした。 ちょっといろいろありまして、dockerを使おうと思い、それに先立ちメモリを増設することにしました。

基本的には、マニュアルを見て増設すればいいだけですが、ちょっとわかりにくかったので、メモ書きまとめておきます。

マニュアルは、下記のページより該当機種を選択してダウンロードします。

www.qnap.com

2ベイ、TS-251+を選択すると、

f:id:junichim:20161220184548p:plain

のような画面が表示されるので、『技術文書』を選択します。

f:id:junichim:20161220184800p:plain

日本語のマニュアルをダウンロードして、表示します。 マニュアルには、機種別のメモリの仕様、増設方法が詳しく載っているので、それに従います。

f:id:junichim:20161220185042p:plain

ということで、DDR3Lのメモリを購入しておきます。 今回は、これを買いました。

f:id:junichim:20161221104951j:plain

https://www.amazon.co.jp/%E3%83%8E%E3%83%BC%E3%83%88PC%E7%94%A8%E3%83%A1%E3%83%A2%E3%83%AA-PC3L-12800-DDR3L-1600-1-5V%E4%B8%A1%E5%AF%BE%E5%BF%9C-W3N1600CM-4G/dp/B01L6OCIRG/ref=sr_1_2?s=computers&ie=UTF8&qid=1482285499&sr=1-2

4GB2枚で4000円台。安くなったもんですね。 ちなみに、TS-251+は仕様としてはメモリは最大8GBとなっているのですが、16GB(8GBx2)で認識したというネットの記事もチラホラ見かけました。でも、今回は勇気が無くてやめました。

さて、実際の作業です。 まずは、電源を抜いて、筐体裏面の2本のネジを外します。

f:id:junichim:20161221103016j:plain

次に、カバーをスライドさせて取るのですが、これが取れない。どうやっても、スライドできなかったので、もしやと思い、HDDを取り出そうとしたら、いとも簡単にスライドしました。最初から外しておくべきだったのかな?うまくいかないときは、試してみてください。

f:id:junichim:20161221101606j:plain

これが、スライドできたときの写真。電源ボタンがあるほうに基盤があり、HDDの入る側がカバーとなっており、これがスライドします。 スライドできたら、簡単にカバーが取り外せます。

カバーを取り外したら、ドライブベイを外します。まず、写真のように、ドライブベイを止めている4本のネジを外します。

f:id:junichim:20161221102051j:plain f:id:junichim:20161221102108j:plain

実はこれだけではドライブベイを外せません。この外し方がマニュアルと異なっているところです。 この筐体の場合、ドライブベイが、この写真のようにステーで背面とつながっています。

f:id:junichim:20161221103110j:plain

なので、背面中央のネジも外す必要があります。

f:id:junichim:20161221103048j:plain

横から見た写真でわかるように、ネジを外した後、コネクタを抜く必要があるので、少し力が必要です。

無事に外せるとこんな感じです。丸で囲ってあるところが、メモリスロットです。

f:id:junichim:20161221103519j:plain

入っていたのは、Transcend のメモリでした。 既に入っているメモリを抜いて、新しいメモリを指します。

あと、写真上部の2つ目のメモリスロットにメモリを指すのですが、こちらは、1枚目(最初からメモリが入っていたスロット)とは裏表反対にして入れないといけません(メモリの切り欠きでわかると思います)。 メモリスロットの上に、金具があるので、少し作業がしにくいですが、慎重に作業すればまあなんとかなりました。

f:id:junichim:20161221104015j:plain

無事に入るとこんな感じになります。2枚目のメモリスロットを拡大するとこんな感じです。

f:id:junichim:20161221104034j:plain

これで、作業は完了です。 あとは、逆の手順で元通り組み立てれば終わりです。一応、HDDは戻すときに、スロットを間違わないように注意しました。もし、間違ったらどうなるんだろうか?ひょっとしてRAIDの再構築が始まるのかな?恐ろしくて試せませんので、勇気のある方は(バックアップを取ってから)お試しください。

組み立て終わったら、電源を投入します。NASにログインしてステータスを表示すると、増設前が、

f:id:junichim:20161221105648j:plain

だったのが、増設後は、

f:id:junichim:20161221105657j:plain

となり、無事に8GB認識されました。 めでたしめでたし。

(参考) 増設時の手順で、マニュアルと違うところがありましたが、下記のサイトを参考にさせていただき、なんとか乗り切りました。

QNAP TS-251+にメモリを増設しよう – ブログ、くまさい。