リモートワーク実現のためSoftEther VPNを利用したVPNサーバを作ってみた | SEEDS Creators' Blog | 株式会社シーズ

リモートワーク実現のためSoftEther VPNを利用したVPNサーバを作ってみた

クラウドソリューション事業部 インフラエンジニアの上野です。

コロナウイルスの影響により、社会的にリモートワーク/テレワークが急激に広がってきています。シーズにおいても公共交通機関を利用する社員にはリモートワークが強く推奨され、来客や訪問についても許可制という方針になっています。

リモートワーク導入に向けた問題点

さて、リモートワークをしようという方針になったのはいいですが、ここでいくつか問題が発生します。特に大きな問題の1つにIP制限された社内のシステムにどうやって外部からの接続を許可するかというものがあります。

通常、社内のシステムに外部から無条件にアクセスは許可されておらず、許可されていたとしても特定のIPアドレスからのみアクセスできるなどの制限がかかっています。
一方でリモートワークで自宅からアクセスする場合は、接続元の自宅のIPアドレスが固定化されていない場合が多く、特定のIPアドレスだけを許可するという運用が難しくなります。

シーズではネットワークのアプライアンス機器を設置してVPNを行っていますが、お客様からも上記のような相談を受けることがあり、手軽に導入することができるSoftEther VPNを利用したVPNサーバを作ってみたいと思います。

サーバの構成

VPNサーバを経由したアクセスはこのような形になります。
今回はVPNサーバをAWS上にEC2インスタンスを立てます。

VPNサーバのインストール

それではVPNサーバを作っていきましょう。
今回はSoftEther VPN( https://ja.softether.org/ )を利用してVPNサーバを構築します。サーバ自体はAWS上にて動作していますが、AWS関連の作業手順は省略します。

まずはソフトウェアをダウンロードします。

cd /usr/local/src
wget http://jp.softether-download.com/files/softether/v4.34-9744-beta-2020.03.20-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.34-9744-beta-2020.03.20-linux-x64-64bit.tar.gz

インストールを実行します。

cd /usr/local/src/vpnserver/
make
make実行時に使用権許諾契約書に同意が求められるので、同意します。

cd /usr/local/
mv /usr/local/src/vpnserver /usr/local/
cd /usr/local/vpnserver
chmod 600 *
chmod 700 vpncmd
chmod 700 vpnserver

これで/usr/local以下にインストールができました。
インストールができたらcheckコマンドにて動作チェックします。
全ての項目でPassとなっていれば問題ありません。

/usr/local/vpnserver/vpncmd
Management of VPN Server or VPN Bridge 
Management of VPN Client
Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool) 

Select 1, 2 or 3: 3 【3を入力】 

VPN Tools>check

Checking 'Kernel System'… 
              Pass
Checking 'Memory Operation System'… 
              Pass
Checking 'ANSI / Unicode string processing system'… 
              Pass
Checking 'File system'… 
              Pass
Checking 'Thread processing system'… 
              Pass
Checking 'Network system'… 
              Pass

次に起動スクリプトを用意しましょう。
公式のマニュアルではinit形式の手順となっていますが、今回はAmazon Linux 2にてサーバを作成していますので、systemdで起動するように設定します。まずはserviceファイルを作成します。

vi /etc/systemd/system/vpnserver.service

[Unit]
Description=Softether VPN Server
After=network.target

[Service]
Type=forking
User=root
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Restart=on-abort
WorkingDirectory=/usr/local/vpnserver
ExecStartPre=/sbin/ip link set dev eth0 promisc on

[Install]
WantedBy=multi-user.target

作成したファイルをsystemdに読み込ませて、自動起動を有効化します。

chmod 644 /etc/systemd/system/vpnserver.service
systemctl daemon-reload
systemctl enable vpnserver

それではサービスを起動してみましょう。
無事に起動できたようですね。

systemctl start vpnserver
systemctl status vpnserver
● vpnserver.service - Softether VPN Server
    Loaded: loaded (/etc/systemd/system/vpnserver.service; disabled; vendor preset: disabled)
    Active: active (running) since Fri 2020-03-27 05:14:43 UTC; 4s ago
   Process: 1246 ExecStart=/usr/local/vpnserver/vpnserver start (code=exited, status=0/SUCCESS)
   Process: 1244 ExecStartPre=/sbin/ip link set dev eth0 promisc on (code=exited, status=0/SUCCESS)
  Main PID: 1251 (vpnserver)
    CGroup: /system.slice/vpnserver.service
            ├─1251 /usr/local/vpnserver/vpnserver execsvc
            └─1252 /usr/local/vpnserver/vpnserver execsvc

VPNサーバの設定

VPNサーバのインストールができました。
次にVPNを使うための仮想HUBの作成とユーザの登録を行います。

まずはインストール直後のVPNサーバには管理者パスワードが設定されていないので、管理コマンドを使用して管理者パスワードを設定します。

/usr/local/vpnserver/vpncmd
Management of VPN Server or VPN Bridge 
Management of VPN Client
Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool) 

Select 1, 2 or 3: 1 【1を入力】

Hostname of IP Address of Destination: 【何も入力せずにEnter】

Specify Virtual Hub Name:【何も入力せずにEnter】

管理者パスワードを設定します。
VPN Server>ServerPasswordSet 
ServerPasswordSet command - Set VPN Server Administrator Password
Please enter the password. To cancel press the Ctrl+D key.
Password: 
Confirm input: 
The command completed successfully.

インストール時点でDEFAULTという仮想HUBがありますが、今回は新たにtest-hubという名前の仮想HUBを作成します。

VPN Server>HubCreate test-hub

作成した仮想HUBでIPsec/L2TPを有効化します。
事前共有キーの入力を求められるので、キーを登録します。
ここで入力したキーは後ほどVPN接続する際に利用します。

VPN Server>IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /DEFAULTHUB:test-hub
 IPsecEnable command - Enable or Disable IPsec VPN Server Function
 Pre Shared Key for IPsec (Recommended: 9 letters at maximum): "事前共有キー"

仮想HUBでSecureNATの機能を有効化します。

VPN Server>HUB test-hub
VPN Server/test-hub>SecureNatEnable

仮想HUBにVPN接続用のユーザ(ここではseeds-ueno)を作成します。

VPN Server/test-hub>UserCreate seeds-ueno /Group:none /REALNAME:ueno /NOTE:none
VPN Server/test-hub>UserPasswordSet seeds-ueno

これでVPN接続するための準備が整いました。

VPN接続してみる

今回はMacを利用してVPN接続を行います。
ネットワークの設定からVPN用の設定を作成します。

サーバアドレスにはVPNサーバのIPをアカウント名は作成したアカウントを入力します。
※ここで使用されているIPはテストで一時的に利用したもので、既に弊社では利用していません。

認証設定のボタンを押して、ユーザのパスワードと共有シークレットを設定します。共有シークレットは仮想HUBを作成したときに設定した 事前共有キー のことです。

次に詳細のボタンを押して、「すべてのトラフィックをVPN接続経由で送信」の項目にチェックを入れます。このチェックを入れないと外部に対する送信は既存のネットワーク経由でアクセスしてしまうことになるので注意が必要です。

VPN接続用のネットワーク設定ができました。
それでは接続ボタンを押してVPN接続してみます。
VPN接続後にアクセス元IPアドレスを確認できるサービス(今回は https://kakunin.net/kun/ )を利用してVPN接続できているか確認します。

接続元のIPアドレスがVPNサーバのIPアドレス(今回は18.182.4.9)になっていればVPN経由でアクセスされていることになります。

さいごに

無事にVPNサーバを経由して社内のシステムにアクセスすることができるようになりました。構築も1時間かからずに作成できました。

これで固定化されていない複数のIPアドレスをVPNサーバを経由させることにより特定のIPアドレスへ固定化させることが可能です。アクセス元IPを固定化させてしまえば、あとはファイアウォールなりでVPNサーバのIPを許可すれば社内システムへのアクセス制限も容易になりますね。

昨今のコロナウイルスによる影響で、急遽リモートワークが必要になった、けどアクセス制限が大変だという社内システムの担当者さんは、こういった方法もご検討してはいかがでしょうか。