がらぱっぱ

自分用覚え書き中心(モバイル関係中心だったはずが)

SoftEtherVPNサーバを立てて外からアクセスできるようにする【Lubuntu18.04 on LOOX U】

せっかくLubuntuを入れて常時接続サーバとしたLOOX U
今度はVPNサーバを立てて、外出先から安全に接続できるようにしてみます。
LOOX U無線LAN接続でVPN、ちょっとはまったところもあるので覚書

初めに

VPN(Virtual Private Network)とは

今時VPNと呼んでいるほとんどがInternet VPNと思いますが、企業内のLANとか家庭内LANとか(イントラネット)とを公衆回線(インターネット)を用いて仮想的に専用線のように接続する技術です。(あんまり説明になってない...)

VPNでなにがやりたいの?

一言にVPNといっても色々な接続形態や方法がありますが、やりたいのは外部からおうちのLANにアクセスして、デスクトップPCとかNASとかにアクセスしたいわけです。
イメージこんな感じ
f:id:garapappa:20210310082233p:plain
外出先のノートPCやスマホからサーバ(LOOXU)経由で自宅LANにアクセスします。
物理的にはインターネット経由でサーバ(LOOXU)に接続するのですが、あたかも家の中からアクセスするように(VPNサーバをルータとして)アクセスできます。

VPNでなにができるか・何が嬉しいか

VPNでつなげるとこんないいことがあるよ!って事を洗い出してみましょう
VPNの特徴としては、外からつないで家の中のローカルLANと同じような環境で接続できるってのがあります。
これの何が嬉しいかというと

家庭内LAN(private network)につながっている機器にアクセスできる

家の中にいるのと同様に、デスクトップPCやNASに接続できる。
WOLでデスクトップ起動して、VNCで操作したり、NASにマウントしたりすることができます。
garapappa.hatenablog.com

Free Wifiとかでも安心

公衆WiFi(Free WiFiスポットとか)につないでいると、パスワードとか覗き見されてしまうなどの盗聴の危険性があります。
VPNにより盗聴の危険性を下げる事が可能です。
これだけで安心かというとそうではなく、PCに対する攻撃を防御するとかもほかにも必要ですが。。。。
また、接続元があくまでおうちLANからのアクセスとして見えるためどこのアクセスポイントから接続しているのかも隠ぺいできます。

外部からの接続に対するセキュリティが比較的高い

外部からの接続で利用するのは今回導入するSoftEther VPN ServerではUDP500、4500のみです。
なりすましとかでVPN自体が突破されなければ、セキュリティレベルを下げる事なく外部から好きな機器にアクセスすることが可能となります。

VPNを導入しよう

環境

VPNサーバ LOOX U/C30

LOOX U/C30 OS Lubuntu18.04.5 LTS 32bit版
garapappa.hatenablog.com

内臓無線LAN接続
固定IPを割り振っています。(F660Aの設定)
garapappa.hatenablog.com

ネット環境(NURO光 ONU F660A)

ポートフォワーディングとかでONU(ルータ)の設定をいじる事になります。

ソフトウエア

いくつかVPNソフトはありますが、高機能で性能もよさそげなSoftEtherを導入します。

SoftEther VPN

ja.softether.org
ダウンロード手順とかは後程

その他

パッケージマネージャとかではなく、ダウンロードして展開するので(多分)makeやgccが必要

sudo apt -y install make gcc

参考:
7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト

インストール

概要

以下の感じでインストールしていきます
・SoftEhterのダウンロード
・SoftEhterインストール
SoftEther自動起動設定
VPNサーバの設定(vpncmd)
・仮想HUB(ネットワーク)の設定

SoftEherVPNのダウンロード

以下からダウンロードしてます。
SoftEther ダウンロード センター
LOOX Uは32bitなので

ダウンロードするソフトウェアを選択
SoftEther VPN (Freeware)
コンポーネントを選択
SoftEther VPN Server
プラットフォームを選択
Linux
CPU を選択
Intel x86 (32bit)

と選んで検索されたrtm版の最新ビルドを選びます。
2021/3/11現在での最新版は
SoftEther VPN Server (Ver 4.34, Build 9745, rtm)
softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-x86-32bit.tar.gz (6.74 MB)
[Non-SSL (HTTP) Download Link] Try this if the above link fails because your HTTP client doesn't support TLS 1.2.
リリース日: 2020-04-05 <最新ビルド>
バージョン更新履歴 (ChangeLog)
言語: English, Japanese, Simplified Chinese
OS: Linux, CPU: Intel x86 (32bit)
(Linux Kernel 2.4 / 2.6 / 3.x / 4.x)

SoftEhterインストール

参考:
7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト

ルートユーザで実行する

sudo su -

インストールフォルダを/usr/local/vpnserverにするので、/usr/localへ移動

cd /usr/local

パッケージファイルの展開
ダウンロードしたものを/tmpに置いた場合

tar xzvf /tmp/softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-x86-32bit.tar.gz

makeの実行

cd vpnserver
make

そうすると ./.install.shが実行されます。
まずは使用権許諾契約書の表示・同意を聞かれるので1の選択を複数回行うとvpnserverプログラムの生成が行われます。
プログラム生成が行われると自動的にチェックコマンドが実行されるので、チェック結果がすべて〇となって

すべてのチェックに合格しました。このシステム上で SoftEther VPN Server / Bridge が正しく動作する可能性が高いと思われます。

と表示されればOKです。

SoftEther自動起動設定

自動起動設定を行います。
ここもルートユーザで行います。
/etc/init.d/vpnserverファイルを作成します。
手順書と違うところ
・statusがないので、ロックファイルがある場合はrunningて表示するような簡易版
・Lutunts18はchkconfigがないためupdate-rc.dをつかうようなヘッダの設定を行う
内容

#!/bin/sh
### BEGIN INIT INFO
# Provides:                     vpnserver
# Required-Start:               $local_fs $network
# Required-Stop:                $local_fs $network
# Default-Start:                2 3 4 5
# Default-Stop:                 0 1 6
# Short-Description:            SoftEther VPN RTM
# Description:                  Start vpnserver daemon SoftEther VPN Server
### END INIT INFO
DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/subsys/vpnserver
test -x $DAEMON || exit 0
case "$1" in
start)
$DAEMON start
touch $LOCK
;;
stop)
$DAEMON stop
rm $LOCK
;;
restart)
$DAEMON stop
sleep 3
$DAEMON start
;;
status)
    if [ -e $LOCK ]; then
        echo "vpnserver is running."
    else
        echo "vpnserver is not running."
    fi
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
esac
exit 0

実行権限付与

chmod 755 /etc/init.d/vpnserver

サービスの登録

update-rc.d vpnserver defaults

自動起動の設定

systemctl enable vpnserver

サービスの起動・終了

systemctl start vpnserver
systemctl stop vpnserver

VPNサーバの設定(vpncmd)

SoftEtherのドキュメント 
7.4 初期設定 - SoftEther VPN プロジェクト
ではGUIWIndowsにインストールして利用)前提ですが、コマンドでも行えます。
GUIでの説明とともにコマンドをあるので、基本的にこの順番でコマンドを打って設定していきます。

vpncmdの起動
/usr/local/vpnserver/vpncmd
vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.34 Build 9745   (Japanese)
Compiled 2020/04/05 23:39:56 by buildsan at crosswin
Copyright (c) SoftEther VPN Project. All Rights Reserved.

vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 1

接続先の VPN Server または VPN Bridge が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
'ホスト名:ポート番号' の形式で指定すると、ポート番号も指定できます。
(ポート番号を指定しない場合は 443 が使用されます。)
何も入力せずに Enter を押すと、localhost (このコンピュータ) のポート 443 に接続 します。
接続先のホスト名または IP アドレス:

サーバーに仮想 HUB 管理モードで接続する場合は、仮想 HUB 名を入力してください。
サーバー管理モードで接続する場合は、何も入力せずに Enter を押してください。
接続先の仮想 HUB 名を入力:
VPN Server "localhost" (ポート 443) に接続しました。

VPN Server 全体の管理権限があります。
管理者パスワードの変更

VPN全体の管理者パスワードを設定する

VPN Server>ServerPasswordSet

仮想HUBの作成

最初から DEFAULTという仮想HUBができているのでこれを使うのもいいが、あえて別のものを作成
コマンド
大文字小文字はどっちでもいいらしい
以下の順でコマンドを実行。引数も指定できるがコマンドをたたくと対話型でパラメータを聞いてくる

仮想HUBのリスト HubList
仮想HUBの削除 HubDelete
仮想HUBの作成 HubCreate
仮想HUBへ移動 hub ハブ名

DEFAULTハブを確認して削除したのち、新しいHUBを作成する

VPN Server>HubList
HubList コマンド - 仮想 HUB の一覧の取得
項目            |値
----------------+-------------------
仮想 HUB 名     |DEFAULT
状態            |オンライン
種類            |スタンドアロン
ユーザー        |0
グループ        |0
セッション      |0
MAC テーブル    |0
IP テーブル     |0
ログイン回数    |0
最終ログイン日時|2021-03-11 20:31:23
最終通信日時    |2021-03-11 20:31:23
転送バイト数    |0
転送パケット数  |0
コマンドは正常に終了しました。

VPN Server>HubDelete
HubDelete コマンド - 仮想 HUB の削除
削除する仮想 HUB の名前: DEFAULT

コマンドは正常に終了しました。

VPN Server>HubCreate TEST
HubCreate コマンド - 新しい仮想 HUB の作成
パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。

パスワード: ********
確認入力  : ********


コマンドは正常に終了しました。

VPN Server>HubList
HubList コマンド - 仮想 HUB の一覧の取得
項目            |値
----------------+-------------------
仮想 HUB 名     |TEST
状態            |オンライン
種類            |スタンドアロン
ユーザー        |0
グループ        |0
セッション      |0
MAC テーブル    |0
IP テーブル     |0
ログイン回数    |0
最終ログイン日時|2021-03-12 05:53:26
最終通信日時    |2021-03-12 05:53:26
転送バイト数    |0
転送パケット数  |0
コマンドは正常に終了しました。

VPN Server>hub TEST
Hub コマンド - 管理する仮想 HUB の選択
仮想 HUB "TEST" を選択しました。
コマンドは正常に終了しました。

グループ・ユーザの作成

接続するためのグループ・ユーザ/パスワードを作成します。
グループは作成しなくても可能
コマンド

グループ作成 GroupCreate
ユーザ作成 UserCreate
パスワード設定 UserPasswordSet
ユーザ一覧 UserList
VPN Server/TEST>UserCreate
UserCreate コマンド - ユーザーの作成
ユーザー名: test

参加するグループ名:

ユーザーの本名:

ユーザーの説明:

コマンドは正常に終了しました。

VPN Server/TEST>UserPasswordSet
UserPasswordSet コマンド - ユーザーの認証方法をパスワード認証に設定しパスワード を設定
ユーザー名: test

パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。

パスワード: ********
確認入力  : ********


コマンドは正常に終了しました。

VPN Server/TEST>UserList
UserList コマンド - ユーザー一覧の取得
項目            |値
----------------+--------------
ユーザー名      |test
本名            |
所属グループ    |-
説明            |
認証方法        |パスワード認証
ログイン回数    |0
最終ログイン日時|(なし)
有効期限        |無期限
転送バイト数    |0
転送パケット数  |0
コマンドは正常に終了しました。

L2TP/IPsecの設定を行う

iOSAndroidMacOS XWindows等で標準でサポートされているL2TP/IPsec VPNプロトコルで接続します。
初期では無効になっているため、設定を行います
IPsecEnable

PN Server/TEST>IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /DEFAULTHUB:TEST
IPsecEnable コマンド - IPsec VPN サーバー機能の有効化 / 無効化
IPsec 事前共有鍵の文字列 (9 文字以下を推奨): ********

コマンドは正常に終了しました。

SecureNat有効化、NatEnable、DHCPEnable

LOOXUを仮想ルータにしてVPN接続された端末からDHCP・NATでおうちLANにアクセスできるようにします。
他の方法としてはローカルブリッジ接続とかありますが、無線LANの制限で行えません。
VPNFAQ003. 無線 LAN カードを用いてローカルブリッジを構築する場合の注意事項 - SoftEther VPN プロジェクト
LOOX Uの内臓無線LANも当然ダメでした。
ちなみにSecureNatEnableとして有効化すると上記と同様の理由からか無線LANにつながらなくなります。
ですので、ここからはSSH接続ではなく、LOOXU本体での作業がいいです。

SecureNatEnable、NatEnable、DHCPEnableコマンド

そのままコマンド打つだけ
SecureNatEnable
NatEnable
DHCPEnable

VPN Server/TEST>SecureNatEnable
SecureNatEnable コマンド - 仮想 NAT および DHCP サーバー機能 (SecureNAT 機能) の有効化
コマンドは正常に終了しました。

VPN Server/TEST>NatEnable
NatEnable コマンド - SecureNAT 機能の仮想 NAT 機能の有効化
コマンドは正常に終了しました。

VPN Server/TEST>DHCPEnable
DhcpEnable コマンド - SecureNAT 機能の仮想 DHCP サーバー機能の有効化
コマンドは正常に終了しました。
SecureNATをユーザモードで動かす(無線LANがつながらなくなるのでその対処)

これこれ。
VPNFAQ036. SecureNAT の動作モードにはどのような違いがありますか。 - SoftEther VPN プロジェクト
どうやらSecureNATをユーザモードで動かさないとダメなようなのでRawIPモード・カーネルモードで動かないように制御します。
コマンドが見当たらないのでvpn_server.configを直接書き換え
VPNサーバ停止

sudo systemctl stop vpnserver

vpn_server.config書き換え

sudo vi /usr/local/vpnserver/vpn_server.config

以下2項目をfalse→trueへ変更する

 bool DisableIpRawModeSecureNAT true
 bool DisableKernelModeSecureNAT true

VPNサーバ起動

sudo systemctl start vpnserver

ネットワークが動いていないのでネットワークサービス再起動

sudo systemctl restart network-manager

※Lubuntu18.04はnetwork-managerってサービスになってました

ポート開放

外部からVPNで接続できるようにポート開放(ポートフォワーディング)の設定を行います。
F660Aの場合、
・ポートフォワーディング(アプリケーションリスト)
・ポートフォワーディング
の2通りのポートフォワーディング設定があるみたいなのですが、なぜかアプリケーションリストの方では接続できなかった。
そういうもんなのか(上記2つの違いもよくわからん)なにか設定が必要なのかがわからなかった。。。
という事で、アプリケーション>>ポートフォワーディングの設定で
VPNサーバ(LOOXU)へUDPの500と4500を通すように設定します。
f:id:garapappa:20210312111107p:plain

クライアントからつないでみる

おうちLANのグローバルIPアドレスを知る

これね、このために調べたんだから。
garapappa.hatenablog.com

Windows10からの接続

スタート>設定>ネットワークとインターネット>VPN>+VPN接続を追加する
f:id:garapappa:20210312100946p:plain:w600
接続名   自分でわかるような任意の名前を(例:自宅VPN
サーバ名またはアドレス おうちLANのグローバルIPアドレス
VPNの種類 事前共有キーを使ったL2TP/IPsec
事前共有キー IPsecEnableコマンドの時に設定したIPsec 事前共有鍵
サインイン情報の種類 ユーザ名とパスワード
ユーザ名(オプション) HUB上に作ったユーザID。ユーザ名@HUB名指定ができる(HUB名省略時はデフォルトのHUB)
パスワード 上記ユーザのパスワード

Andoroidからの接続

機種・Androidバージョンによって違うとは思いますが、Huawei honor 8での設定
設定>その他>VPNVPNネットワークの追加
名前   自分でわかるような任意の名前
タイプ  L2TP/IPSec PSK
サーバアドレス おうちLANのグローバルIPアドレス
L2TPセキュリティ保護 空白のまま
IPSec ID 空白のまま
IPSec事前共有鍵 IPsecEnableコマンドの時に設定したIPsec 事前共有鍵
詳細設定は不要かな?で保存
あとはユーザ名・パスワードを入力して接続

接続されたかの確認方法

ちゃんと接続されているのかを確認するのは何通りか方法ありますが、代表的なものを

プライベートの接続を試みる(NASとか)

外部から入って普通は接続できない家の中のNASとかPCにアクセスできるか

ブラウザアクセスしたら自宅LANのIPからアクセスしてる風になってるか?

【NURO光】グローバルIPアドレスをLINEで通知する仕組みをつくってみた - がらぱっぱ
でも紹介した
IP address information
で表示されるIPアドレスが、おうちLANのグローバルIPアドレスであればOK

VPNサーバのログを確認

/usr/local/vpnserver/server_log/
以下にVPNサーバのログが出力されます(日毎ローテート?)
これを確認して、接続がされたかを確認できます。

まとめ

とりあえず、ここまででVPNサーバを立てて外部から接続できるところまでできました。
非力マシン(LOOXU)だったり無線LANだったり、SecureNATがユーザモードだったり(オーバーヘッドがあるから速度は落ちるらしい)とか、性能に対する懸念はありますが、今のところそれほどストレスはないです。
あとは
・もう少しセキュリティを高める
・性能(ネットワーク?)チューニング
・接続の通知とか?(これもセキュリティかな)
あたりでしょうか。