1. はじめに
私が関わっているプロジェクトの中で、関係者だけが使える研究・開発環境が欲しいという要望があり、VPNを導入することにしました。
そこで今回はLinux上でVPNの環境を構築した手順を紹介していきます。
VPNが何なのかということについては、「4-1. VPNについて」で説明します。
2. 環境
- Ubuntu 20.04.6 LTS
3. 手順
3-1. サーバ側
※権限がないと言われたらコマンドの一番最初にsudo
をつけてください。
3-1-1. SoftEther VPNのインストール
まずはパッケージマネージャのアップデートを行う。
sudo apt update
次に、必要なパッケージをインストールする。
sudo apt install -y make gcc
次に、SoftEther VPN Serverのダウンロード先リンクを選択する。
以下のサイトから自分にあった環境を選択する。
※SoftEther VPNで検索→「ダウンロード」を選択→「SoftEther VPNのダウンロード」を選択してこのページに行ける。
私は下の画像のような選択をした。
ただし、「CPUを選択」の部分に関してはuname -m
のコマンドを入力することで確認できる。
選択したら、一番上に出てきた最新ビルドと書かれたもののリンクを右クリックしてコピーしておく。
コピーしたリンク先のファイルをwget
コマンドを使ってダウンロードする。
wget https://jp.softether-download.com/files/softether/v4.43-9799-beta-2023.08.31-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.43-9799-beta-2023.08.31-linux-x64-64bit.tar.gz
※URLは各自コピーしたものに置き換える。
ファイルのダウンロードが終わったら、そのファイルを解凍する。
tar -xzvf softether-vpnserver-v4.43-9799-beta-2023.08.31-linux-x64-64bit.tar.gz
※ファイルは各自のものに置き換える。
解答すると、vpnserver
フォルダが作成される。
そのフォルダの中に入り、ビルドをする。
cd vpnserver/
make
ビルドが終わったらディレクトリを/usr/local/
に移動する。
※パスについては公式ドキュメント 7.3.1 推奨するオペレーションシステムの構成に従った
cd ..
sudo mv vpnserver/ /usr/local/
これにより、/usr/local/vpnserver
に移動した。
最後にファイルの所有者と権限を変更する。
cd /usr/local
sudo chown -R root:root vpnserver
cd vpnserver
sudo chmod 600 *
sudo chmod 700 vpncmd
sudo chmod 700 vpnserver
以下のように表示されればOK。
xxx@xxx:/usr/local/vpnserver$ ll
-rw------- 1 root root 20245 12ŒŽ 8 16:14 License_ReadMeFirst.txt
-rw------- 1 root root 20317 12ŒŽ 8 16:14 License_ReadMeFirstSjis.txt
-rw------- 1 root root 30210 12ŒŽ 8 16:14 License_ReadMeFirstUtf.txt
-rw------- 1 root root 609 12ŒŽ 8 16:14 Makefile
-rw------- 1 root root 4018399 12ŒŽ 8 16:14 hamcore.se2
-rw------- 1 root root 1942994 12ŒŽ 9 02:23 libcrypto.a
-rw------- 1 root root 336070 12ŒŽ 9 02:23 libssl.a
-rwx------ 1 root root 1814216 12ŒŽ 9 02:23 vpncmd*
-rw------- 1 root root 1630858 12ŒŽ 9 02:23 vpncmd.a
-rwx------ 1 root root 1814120 12ŒŽ 9 02:23 vpnserver*
-rw------- 1 root root 1630304 12ŒŽ 9 02:23 vpnserver.a
3-1-2. SoftEther VPN Serverの開始
systemdを用いた方法で行う。
sudo vi /etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target
[Service]
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Type=forking
RestartSec=3s
[Install]
WantedBy=multi-user.target
ファイルの変更をsystemdに反映する。
sudo systemctl daemon-reload
vpnserverのサービスを開始する。
sudo systemctl start vpnserver
サービスの自動起動も有効にしておく。
sudo systemctl enable vpnserver
3-1-3. SoftEther VPN Serverの設定
sudo ./vpncmd
で対話式のユーザインタフェースで設定を始める。
下のように表示されたら1を選択する。
vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.38 Build 9760 (English)
Compiled 2021/08/17 22:32:49 by buildsan at crosswin
Copyright (c) SoftEther VPN Project. All Rights Reserved.
By using vpncmd program, the following can be achieved.
1. Management of VPN Server or VPN Bridge
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)
Select 1, 2 or 3:
そのあとの2つの質問はそのまま何も入力せずにEnterを押す。
Specify the host name or IP address of the computer that the destination VPN Server or VPN Bridge is operating on.
By specifying according to the format 'host name:port number', you can also specify the port number.
(When the port number is unspecified, 443 is used.)
If nothing is input and the Enter key is pressed, the connection will be made to the port number 8888 of localhost (this computer).
Hostname of IP Address of Destination:
If connecting to the server by Virtual Hub Admin Mode, please input the Virtual Hub name.
If connecting by server admin mode, please press Enter without inputting anything.
Specify Virtual Hub Name:
Connection has been established with VPN Server "localhost" (port 443).
You have administrator privileges for the entire VPN Server.
3-1-3-1. 仮想HUBの作成と選択
仮想HUBを作成する。
HubCreate main
※main
が仮想HUBの名前
HubList
と入力して、作成した仮想HUBの情報が表示されればOK。
作成した仮想HUBを選択し、設定を始める。
Hub main
以下のように表示されればOK。
VPN Server>Hub main
Hub command - Select Virtual Hub to Manage
The Virtual Hub "main" has been selected.
The command completed successfully.
VPN Server/main>
3-1-3-2. ユーザの作成
ユーザを作成する。
UserCreate user1 /GROUP:none /REALNAME:none /NOTE:none
※user1
の部分を変える。
ユーザのパスワードを設定する。
UserPasswordSet user1
UserList
と入力して、作成したユーザの情報が表示されればOK。
ここで設定したユーザ名とパスワードは、クライアントがVPNに接続するとき必要であるためメモしておく。
3-1-3-3. L2TP over IPsecの有効化
SoftEhter VPNがサポートするVPNプロトコルは色々ある1が、iPhoneで使えるプロトコルがIKEv2、IPsec、L2TPの3つであったため今回はL2TP over IPsecを選択した。
IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /DEFAULTHUB:main
事前共有キーを入力するように求められるので設定する。
設定した事前共有キーはクライアントがVPNに接続するとき必要であるためメモしておく。
3-1-3-4. SecureNAT機能の有効化
SoftEther VPNのために独自に開発されたSecureNAT機能というものがある
SecureNATについては、「4-2. SecureNATについて」で解説している。
SecureNatEnable
3-1-3-5. 仮想DHCPサーバの設定
以下のコマンドを入力する。
DhcpSet /START:192.168.30.10 /END:192.168.30.200 /MASK:255.255.255.0 /EXPIRE:7200 /GW:192.168.30.1 /DNS:192.168.30.1 /DNS2:none /DOMAIN:none /LOG:yes /PUSHROUTE:"xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy/192.168.30.1"
ただし、デフォルトゲートウェイなどの192で始まっているIPアドレスについては任意のものを設定できる。
しかし、クライアントの環境によってはWi-Fiに接続できなくなったりすることがあったため注意する。
今回は公式ドキュメントに書かれていた例を参考にした。
また、xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy
の部分を自身の環境に合わせて変える。
自身の環境の確認方法を紹介する。
まず、net-tools
パッケージをインストールする。
sudo apt install -y net-tools
以下のコマンドを入力する。
route
例えば、以下のように表示されれば、xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy
を10.0.0.0/255.255.255.0
とする。
xxx@xxx:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 ens1s0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens1s0
個人的にこのDhcpSetコマンドが一番ややこしかったため詳しく解説する。
まず、DhcpSetコマンドのパラメータ引数を以下のテーブルにまとめる。
パラメータ引数 | 説明 |
---|---|
/START | クライアントに対して配布するアドレス帯の開始点 |
/ENT | クライアントに対して配布するアドレス帯の終了点 |
/MASK | クライアントに対して指定するサブネットマスク |
/EXPIRE | 有効期限(単位は秒) |
/GW | デフォルトゲートウェイのIPアドレス |
/DNS | DNSサーバのIPアドレス |
/DNS2 | 2つ目のDNSサーバのIPアドレス |
/DOMAIN | ドメイン名 |
/LOG | セキュリティログを保存するかどうか |
/PUSHROUTE | ルーティングの設定。<社内LANなどのネットワークアドレス>/<社内LANなどのサブネットマスク>/<デフォルトゲートウェイ>の形で設定できる。 |
つまり、上のコマンドによって下の画像のようなイメージの構成に設定している。
3-1-3-6. 終了
exit
SoftEther VPN Server ではプログラム全体の構造が慎重に設計されており、どのような設定変更を行っても VPN Server のプロセス自体の再起動は一切必要ありません。2
3-1-4. ポートの開放
SoftEther VPNはデフォルトで、
- 443/tcp
- 992/tcp
- 5555/tcp
の3つのポートを使用する3。
また、L2TP/IPsecを使用するときには追加で、
- 500/udp
- 4500/udp
の2つのポートも使用する4。
今回はL2TP/IPsecを使用するため、計5つのポートを開放する必要がある。
mdxではポートの設定を独自のポータル画面で行うことができるため、今回はその画面でポートを開放した。
Ubuntuでポートの開放をしたい場合は以下の記事を参考にする。
3-2. クライアント側
Windowsの場合を説明する。
「設定」→「ネットワークとインターネット」→「VPN」と選択していく。
「VPN接続を追加する」を選択。
以下のように入力する。
変数 | 入力する値 |
---|---|
VPNプロバイダー | Windows(ビルトイン) |
接続名 | 任意 |
サーバ名またはアドレス | サーバのURLまたはIPアドレス |
VPNの種類 | 事前共有キーを使ったL2TP/IPsec |
事前共有キー | IPsecEnableコマンドを入力したときに設定した事前共有キー |
サインイン情報の種類 | ユーザー名とパスワード |
ユーザ名(オプション) | UserCreateコマンドを入力したときに設定したユーザー名 |
パスワード(オプション) | UserPasswordSetコマンドを入力したときに設定したパスワード |
設定したら保存を押す。
接続を押して接続済みと表示されればOK。
4. 解説
4-1. VPNについて
VPNとはVirtual Private Networkの略で、自宅にいながら社内LAN環境に接続したりするために使われる技術のことである。
それによって、外部に公開せず社内LAN内だけで動かしているサービスなどに自宅にいながらアクセスすることができたりする。
VPNにはプロトコルがいくつかあり、それぞれのプロトコルによって通信速度やセキュリティ性能、互換性などが異なる5。
具体的には以下のようなプロトコルがある5。
VPNプロトコル | 特徴 |
---|---|
PPTP | 通信速度は速いが、安全性が低い。 |
SSTP | セキュリティは高いがMicrosoftが所有するプロトコルでオープンソースではない。 |
L2TP | 暗号化の機能はないためIPsecというセキュリティシステムとセットで使用する。互換性に優れているが速度が遅くなりがち。 |
IKEv2 | 安全性が高く、通信速度も速いが、オープンソースではない。 |
OpenVPN | 安全性や速度に優れていてオープンソースである。 |
また、VPNに接続することでグローバルIPアドレスが変わり、国で制限されているサービスなどにアクセスしたりすることもできる。
例えばVPNに接続していない状態だと、
C:\xxx>curl ifconfig.me
xxx.xxx.xxx.xxx
だったものが、VPNに接続すると、
C:\xxx>curl ifconfig.me
yyy.yyy.yyy.yyy
という風になる。
※ifconfig.meというネットワークの接続情報を表示してくれるWebサービスにcurl
をすることでグローバルIPアドレスを確認することができる。
4-2. SecureNATについて
公式ドキュメントによると、
「SecureNAT (セキュアナット) 」機能は、SoftEther VPN のために独自に開発された、これまでに存在しなかった画期的な機能です。SecureNAT を使用すると、セキュリティ的により安心なネットワークを構築することができます。
と紹介されている。
SecureNAT機能には、
- 仮想NAT機能
- 仮想DHCPサーバ機能
の2つが搭載されている。
この機能によって、上の図のようにSoftEther VPNを動かしているサーバコンピュータ自体の変更を加えることなく既存の社内LANなどに接続することができる。
また、サーバコンピュータ自体の変更を加えないため、システム管理者権限を必要としないことも1つのメリットである。
4-3. ダイナミックDNSについて
SoftEther VPNにはダイナミックDNSという機能がついている6。
この機能を使えば、VPNに接続しているときにだけそのURLにアクセスするといったことができる。
ドメインの確認は以下の手順で行う。
sudo ./vpncmd
-
1
->Enter
->Enter
で管理画面に入る DynamicDnsGetStatus
また、DynamicDnsSetHostname {ドメイン名}
でドメインを設定できる。
5. Q&A
5-1. ログファイルってどこ?
実行可能ファイルが設置されているディレクトリ内のserver_log
, security_log
, packet_log
のディレクトリに入っている7。
xxx@xxx:/usr/local/vpnserver$ sudo ls -l ./*log
./packet_log:
total 4
drwx------ 2 root root 4096 Jun 18 19:47 main
./security_log:
total 4
drwx------ 2 root root 4096 Jun 18 19:47 main
./server_log:
total 45540
-rw------- 1 root root 3436732 May 25 23:51 vpn_20240525.log
おわりに
Linux上でVPNの環境構築をする手順を紹介しました。
いいねとストック、よろしくお願いします。
また、間違っている点や質問があればぜひコメントお願いします。
参考文献
-
筑波大学大学院研究プロジェクト SoftEther VPN. SoftEther VPN Serverがサポートする VPN プロトコル. https://ja.softether.org/3-spec ↩
-
筑波大学大学院研究プロジェクト SoftEther VPN. 3.3 VPN Server 管理. https://ja.softether.org/4-docs/1-manual/3/3.3 ↩
-
筑波大学大学院研究プロジェクト SoftEther VPN. 3.3.6 リスナーポート. https://ja.softether.org/4-docs/1-manual/3/3.3 ↩
-
筑波大学大学院研究プロジェクト SoftEther VPN. VPN Server 側での L2TP/IPsec 機能の有効化方法. NAT が存在する場合の注意事項. https://ja.softether.org/4-docs/2-howto/L2TP_IPsec_Setup_Guide/1 ↩
-
VPNのプロトコルの種類の比較と選び方!おすすめのVPNプロバイダーの特徴とは. https://www.itscom.co.jp/forbiz/column/vpn/1976/ ↩ ↩2
-
筑波大学大学院研究プロジェクト SoftEther VPN. ダイナミック DNS 機能および NAT トラバーサル機能. https://ja.softether.org/4-docs/2-howto/6.VPN_Server_Behind_NAT_or_Firewall/1.Dynamic_DNS_and_NAT_Traversal ↩
-
筑波大学大学院研究プロジェクト SoftEther VPN. 3.10 ロギングサービス. https://ja.softether.org/4-docs/1-manual/3._SoftEther_VPN_Server_%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/3.A_Logging_Service ↩