SoftEtherによる踏み台用VPNサーバーの構築手順 on IDCFクラウド CentOS 7
はじめに
(2024.11.11追記)
VPN接続時の通信速度を改善した新しい記事をかきましたので、そちらもご参照ください。
・SoftEtherによる踏み台用VPNサーバーの構築手順 on IDCFクラウド~VPN接続時の通信速度を改善
https://inaba-serverdesign.jp/blog/20241111/softether-vpn-idcf-cloud-speedup.html
(2024.11.11追記ここまで)
インターネット上で公開しているサーバーの運用において、メンテンナンス用のSSHやWeb管理画面などのセキュリティ強化のため、アクセス元IPアドレスを自社ネットワークのアドレスに限定するケースは多いと思います。
そのような場合、自宅や出張先から、あるいは社外スタッフなど、登録されていないIPアドレスからメンテナンスのアクセスをしたいときはどうしたらよいでしょう。
そのために、
「(アクセス許可登録済みのIPアドレスをもつ)自社ネットワークにVPN接続してからサーバーにアクセスする」
というのはよくあるケースだと思います。
しかし、この用途のために、社外スタッフに自社ネットワークにアクセスさせるのは抵抗がある場合もあるかもしれません。
社内にVPNルーターを設置すると、法定停電で使用できない時間帯も生じます。
僕はふだんはモバイルルーターで仕事をしていて、そもそも「自社ネットワーク」がありませんし、固定IPアドレスを持っていません。
お客様からアクセス元IPアドレスによる制限を要求されることもあるので、その場合は、NTTCom. Cloudn上に立てている、プロジェクトサーバー(Redmine, Subversion, 監視ツールなど)のIPアドレスを許可していただいて、踏み台にしてアクセスしています。
僕の主な業務はサーバー構築ですので、たいていはSSHができれば問題ありません。
しかし、CMSのWeb管理画面(HTTP or HTTPS)や、Plesk管理画面(TCP/8443)へアクセスするときなどSSH以外のポートを使用するときは、SSHポートフォワードで工夫するのにいちいち手間がかかりますし、VMwareの管理画面なんかは、使用するポートが多すぎて、SSHポートフォワードではうまくアクセスできないこともありました。
前置きが長くなりましたが、上記のような問題を解決するため、
「任意のポートを使用できる、固定IPアドレスをもつ踏み台サーバー」
として、IaaSクラウドのLinux仮想サーバー上に、
「SoftEther VPNによる踏み台用VPNサーバー」
を構築します。
今回構築するVPNサーバー、クライアントの構成は以下のとおりです。
- クラウドサーバー: IDCFクラウド Light.S1(1vCPU, メモリ1GB, 500円/月)
- OS: CentOS 7
- VPNサーバー: SoftEther VPN
- VPN接続ポート: TCP/5555
- VPNクライアントOS: Windows 10
VPNサーバー、クライアントの構成イメージは以下のようになります。
IDCFクラウドを選択したのは、以下の理由からです。
- サーバーを再作成しても同じグローバルIPアドレスを使用できる。
- 500円で使用できる最小サーバーのコストパフォーマンスがよい。
- ネットワーク転送料金が In/Out合計3TBまで無料 In無料、Out3TBまで無料。
基本的な構築手順は、他のクラウドサーバーやVPSサーバーを使っても同じです。
AWS EC2のt2.nano、GCP GCE f1-microでも同じぐらいの料金で実現できますね。
※さくらのクラウドは、ルータを契約しない限り、サーバーを再作成したときに違うIPアドレスとなり、アクセス先メンテナンス対象サーバー側での、アクセス元IPアドレス制限設定の変更が必要となってしまいます。
また、VPN接続ポートとしては、マイナーなポート番号のほうがよいだろうと、TCP/5555を選択しましたが、接続元のネットワーク環境でOutbound通信ポートが制限されている場合は、HTTPSと同じTCP/443を使用するとよいでしょう。
その場合は、以降のTCP/5555の設定箇所を、TCP/443に読み替えてください。
この踏み台用VPNサーバーのアイデアおよび構築手順は、以下の記事がとても参考になりました。
・月額500円のIDCFクラウドにSoftEtherを入れて固定IPプロバイダ費用を節約するの巻
http://www.guilz.org/2015/04/07/idcfクラウドにsoftetherを入れ固定ipプロバイダ費用を節約/
また、CentOS 7でのSoftEhter VPNの設定については、以下の記事を参考にしました。
・VPSでSoftEther VPNを使って自宅LANに外部から接続する。
http://dsp74118.blogspot.jp/2016/02/vpssoftether-vpnlan.html
以下は、2017年8月時点の構築手順です。
構築手順は、ほぼ上記の参考記事のとおりなのですが、構築するうえで気になった点などを補足します。
※SoftEther VPNサーバーを稼働させる「IaaSクラウドのLinux仮想サーバー」のことを「仮想マシン」と呼ぶことにします。
SoftEther VPNについて
SoftEther VPNは、日本発のオープンソースVPNソフトウェアで、任意の個人的または業務用途において無償で使用することができます。
・SoftEther VPN プロジェクト(公式)
https://ja.softether.org/
有償製品のPacketiX VPNと比べて、一部機能制限があります。
・SoftEther VPN 現在の制限事項
https://ja.softether.org/3-spec/cureent_limitations
今回やりたいことと同じことは、SoftEther VPN以外の、OpenVPNなどのソフトウェアでも実現できますが、SoftEther VPNは日本語のマニュアルが充実しており、また、Windows/Mac用のVPNサーバー管理ツールおよびVPNクライアントツールといったGUIツールが用意されているのが大きなメリットといえます。
もちろん、コマンドラインでもVPNサーバーの設定は可能です。
仮想マシンの作成、事前準備
IDCFクラウドで仮想マシンを作成し、インターネットからアクセスできるよう、ファイアウォール、ポートフォワードの設定を行います。
IDCFクラウドのクラウドコンソールでの操作手順は、同サービスのご利用ガイドを参照してください。
・IDCFクラウド ご利用ガイド
https://www.idcf.jp/help/cloud/guide/
仮想マシンの作成
仮想マシンを作成します。
ゾーンはどこでもよいと思いますが、東日本リージョン2のweber, luxや西日本リージョンaugustaなどの新しく追加されたゾーンのほうが、サーバーの性能が良いと思います。
マシンタイプは「light.S1」、イメージは「CentOS 7.3 64bit」を選択します。
ボリュームはデフォルトの15GBで十分です。
SSK KeyとプライベートIPアドレスはお好みで。
今回は、IDCFクラウドのluxゾーンを使用し、仮想ルータのプライベートセグメントが、10.32.0.0/21だったので、仮想マシンのプライベートIPアドレスは、10.32.0.11としました。
ファイアウォール、ポートフォワードの設定
「IPアドレス」メニューで、仮想ルーターに付与されたグローバルIPアドレスを確認します。
このあと、このグローバルIPアドレスが「メンテナンス用アクセス時のアクセス元IPアドレス」となるよう、設定していきます。
ここではとりいそぎ、SSH接続ができるよう、ファイアウォール設定でTCP/22ポートのルールを追加し、ポートフォワード設定で、同ポートへのアクセスを仮想マシンに転送するルールを追加します。
SSH接続の確認
クライアントPCのSSHクライアントツールで、グローバルIPアドレスを指定して接続し、仮想マシンにSSHログインできることを確認します。
仮想マシンの基本設定
サーバーとして動作させるための基本的な設定を行います。
なお、IDCFクラウドのCentOSでは、初期状態で以下が設定済みです。
- 文字コード(ロケール)は ja_JP.UTF-8
- タイムゾーンは Asia/Tokyo(JST)
- IDCFクラウドのタイムサーバーを参照したNTP
- IDCFクラウドのDNSサーバーの参照
その他、お好みの設定を行います。
ちなみに僕は、どんなサーバーでも、以下を行います。
- スワップの設定
- Development Toolsのグループインストール(gccなどを含む)
SoftEther VPNサーバーのインストール
仮想マシンにSSHログインし、SoftEther VPNサーバーをインストールします。
gccとopenssl-develのインストール
SoftEther VPNサーバーのビルドのため、gccとopenssl-develとのことで、インストールします。
# yum install gcc openssl-devel
SoftEtherのダウンロード、ビルド、インストール
インストール先は、/usr/local/vpnserver とします。
SoftEther公式ダウンロードページ
http://www.softether-download.com/ja.aspx?product=softether
より、SoftEther VPN Server Linux向けのRTM最新版のURLを取得し、ダウンロードします。
# cd /usr/local/ # wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz
展開、ビルドします。
# tar zxvf softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz # cd vpnserver/ # make (途中、利用規約に目を通して agree します) make[1]: ディレクトリ `/usr/local/vpnserver' から出ます
ファイルを確認し、rootユーザーのみ読み書き可能、VPNサーバーコマンドはrootユーザーのみ実行可能とします。
「vpnserver」が、SoftEther VPNサーバーです。
# ls -l /usr/local/vpnserver/ -rwxrwxrwx 1 root root 1881 4月 17 2016 Authors.txt -rwxrwxrwx 1 root root 2138 4月 17 2016 Makefile -rwxrwxrwx 1 root root 30801 4月 17 2016 ReadMeFirst_Important_Notices_cn.txt -rwxrwxrwx 1 root root 36297 4月 17 2016 ReadMeFirst_Important_Notices_en.txt -rwxrwxrwx 1 root root 50695 4月 17 2016 ReadMeFirst_Important_Notices_ja.txt -rwxrwxrwx 1 root root 58932 4月 17 2016 ReadMeFirst_License.txt drwx------ 2 root root 6 7月 20 16:20 chain_certs drwxrwxrwx 2 root root 41 7月 20 16:20 code -rwxrwxrwx 1 root root 1295106 4月 17 2016 hamcore.se2 -rw------- 1 root root 867 7月 20 16:20 lang.config drwxrwxrwx 2 root root 170 7月 20 16:20 lib -rwxr-xr-x 1 root root 4594976 7月 20 16:20 vpncmd -rwxr-xr-x 1 root root 4595080 7月 20 16:20 vpnserver # cd /usr/local/vpnserver/ # chmod 600 * # chmod 700 vpncmd vpnserver # ls -l -rw------- 1 root root 1881 4月 17 2016 Authors.txt -rw------- 1 root root 2138 4月 17 2016 Makefile -rw------- 1 root root 30801 4月 17 2016 ReadMeFirst_Important_Notices_cn.txt -rw------- 1 root root 36297 4月 17 2016 ReadMeFirst_Important_Notices_en.txt -rw------- 1 root root 50695 4月 17 2016 ReadMeFirst_Important_Notices_ja.txt -rw------- 1 root root 58932 4月 17 2016 ReadMeFirst_License.txt drw------- 2 root root 6 7月 20 16:20 chain_certs drw------- 2 root root 41 7月 20 16:20 code -rw------- 1 root root 1295106 4月 17 2016 hamcore.se2 -rw------- 1 root root 867 7月 20 16:20 lang.config drw------- 2 root root 170 7月 20 16:20 lib -rwx------ 1 root root 4594976 7月 20 16:20 vpncmd -rwx------ 1 root root 4595080 7月 20 16:20 vpnserver
vpncmd の check コマンドによる動作チェックを行います。
# ./vpncmd vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド) Version 4.20 Build 9608 (Japanese) Compiled 2016/04/17 21:59:35 by yagi at pc30 Copyright (c) SoftEther VPN Project. All Rights Reserved. vpncmd プログラムを使って以下のことができます。 1. VPN Server または VPN Bridge の管理 2. VPN Client の管理 3. VPN Tools コマンドの使用 (証明書作成や通信速度測定) 1 - 3 を選択: 3 VPN Tools>check Check コマンド - SoftEther VPN の動作が可能かどうかチェックする --------------------------------------------------- SoftEther VPN 動作環境チェックツール Copyright (c) SoftEther VPN Project. All Rights Reserved. この動作環境チェックツールを実行したシステムがテストに合格した場合は、SoftEther VPN ソフトウェアが動作する可能性が高いです。チェックにはしばらく時間がかかる場合があります。そのままお待ちください... 'カーネル系' のチェック中... [合格] ○ 'メモリ操作系' のチェック中... [合格] ○ 'ANSI / Unicode 文字列処理系' のチェック中... [合格] ○ 'ファイルシステム' のチェック中... [合格] ○ 'スレッド処理システム' のチェック中... [合格] ○ 'ネットワークシステム' のチェック中... [合格] ○ すべてのチェックに合格しました。このシステム上で SoftEther VPN Server / Bridge が正しく動作する可能性が高いと思われます。 コマンドは正常に終了しました。 VPN Tools>exit
サービス化
仮想マシン上でVPNサーバープロセスを常駐化させるため、Systemdでサービス化します。
サービス名は「vpnserver」とします。
CentOS 7 Systemd用のユニットファイルを作成します。
# vi /etc/systemd/system/vpnserver.service -- [Unit] Description=SoftEther VPN Server After=network.target [Service] Type=forking ExecStart=/usr/local/vpnserver/vpnserver start ExecStop=/usr/local/vpnserver/vpnserver stop [Install] WantedBy=multi-user.target --
VPNサーバーを起動し、サービスのステータスを確認します。
# 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 木 2017-07-20 16:22:07 JST; 8s ago Process: 1086 ExecStart=/usr/local/vpnserver/vpnserver start (code=exited, status=0/SUCCESS) Main PID: 1088 (vpnserver) CGroup: /system.slice/vpnserver.service tq1088 /usr/local/vpnserver/vpnserver execsvc mq1089 /usr/local/vpnserver/vpnserver execsvc (省略)
仮想マシンのOS起動時に、VPNサーバーを自動起動させるのであれば、systemctl enableを実行します。
# systemctl enable vpnserver
VPNサーバープロセスおよびLISTENポートを確認します。
→ TCP/5555, TCP/443, TCP/992, TCP/1194ポートをLISTENしていることがわかります。
# ps aux | grep vpnserver root 1088 0.0 0.0 17504 496 ? S<s 16:22 0:00 /usr/local/vpnserver/vpnserver execsvc root 1089 0.8 1.6 691844 16928 ? S<l 16:22 0:00 /usr/local/vpnserver/vpnserver execsvc root 1124 0.0 0.0 112664 968 pts/1 R+ 16:22 0:00 grep --color=auto vpnserver # ss -anp | grep vpnserver | grep LISTEN u_str LISTEN 0 5 /var/run/screen/S-root/869.pts-0.idcf-vpnserver 18329 * 0 users:(("screen",pid=869,fd=4)) tcp LISTEN 0 128 *:5555 *:* users:(("vpnserver",pid=1089,fd=39)) tcp LISTEN 0 128 *:443 *:* users:(("vpnserver",pid=1089,fd=27)) tcp LISTEN 0 128 *:992 *:* users:(("vpnserver",pid=1089,fd=31)) tcp LISTEN 0 128 *:1194 *:* users:(("vpnserver",pid=1089,fd=35)) tcp LISTEN 0 128 :::5555 :::* users:(("vpnserver",pid=1089,fd=41)) tcp LISTEN 0 128 :::443 :::* users:(("vpnserver",pid=1089,fd=29)) tcp LISTEN 0 128 :::992 :::* users:(("vpnserver",pid=1089,fd=33)) tcp LISTEN 0 128 :::1194 :::* users:(("vpnserver",pid=1089,fd=37))
VPN接続用のファイアウォール設定
VPN接続のため、以下のポートのアクセス許可設定を行います。
- TCP/5555: VPN接続用
- UDP/500, UDP/4500: L2TP/IPsec用
IDCFクラウドのクラウドコンソール、ファイアウォール設定で、これらのポートへのルールを追加し、ポートフォワード設定で、同ポートへのアクセスを仮想マシンに転送するルールを追加します。
仮想マシン上で、firewalldやiptablesを使用しているなら、これらのポートへのInboundアクセス許可ルールを追加します。
firewalldの場合。
サービス名ipsecで、UDP/500とUDP/4500が登録されています。
(恒久的に許可する場合は、–permanentオプションを付与します。)
# firewall-cmd --zone=public --add-port=5555/tcp # firewall-cmd --zone=public --add-service=ipsec
iptablesの場合。
(恒久的に許可する場合は、iptablesルールをsaveします。)
# iptables -A INPUT -m state --state NEW -p tcp --dport 5555 -j ACCEPT # iptables -A INPUT -m state --state NEW -p udp --dport 500 -j ACCEPT # iptables -A INPUT -m state --state NEW -p udp --dport 4500 -j ACCEPT
なお、firewalldやiptablesで、外向きの通信ポートも制限している場合は、以下の宛先ポートへのOutboundアクセス許可ルールを追加する必要があります。
(僕はこれでハマりました。。)
- UDP/32768-65535: UDP高速化通信用のエフェメラルポート
- UDP/80: Keepalive用
iptablesでのOutboundアクセス許可ルール追加。
# iptables -A OUTPUT -p udp --dport 32768:65535 -j ACCEPT # iptables -A OUTPUT -p udp --dport 80 -j ACCEPT
なお、接続元のネットワークやクラウドサーバーサービスによっては、TCP/5555やUDP/500を塞いだままでも、VPN接続できる場合があります。
VPNクライアントからの接続時に接続ポート(今回はTCP/5555)を使用できない場合は、いわゆる「NATトラバーサル」での通信となります。
インターネットへの公開ポートをギリギリまで減らしたい場合は、いろいろ試してみるとよいと思います。
SoftEther VPNサーバーの設定
クライアントPCから、GUIツールでSoftEther VPNサーバーの設定を行います。
(サーバー上のコマンドラインでも設定可能です。)
SoftEtherサーバー管理マネージャのインストール
PCのWebブラウザ等で、SoftEther公式ダウンロードページ
http://www.softether-download.com/ja.aspx?product=softether
より、「SoftEther VPN Server Manager for Windows(または for Mac OS X)」を選択し、RTM最新版「SoftEther VPN Server and VPN Bridge (Ver 4.20, Build 9608, rtm)」をダウンロードします。
ダウンロードしたインストーラを起動し、「サーバー管理マネージャのみ」を選択してインストールします。
管理マネージャで接続
インストールした「SoftEther VPNサーバー管理マネージャ」を起動します。
「新しい接続設定」で接続設定を作成します。
- 接続設定名: (お好みの接続名、ここでは「bastion-vpn」)
- ホスト名: (仮想マシンのグローバルIPアドレス)
- ポート番号: 5555
- 管理モード: サーバー管理モード
- 管理パスワード: (空) // 初期状態では、管理パスワードは設定されていない
接続設定リストで、作成した接続名を選択して、「接続」します。
初回接続時は、新しいパスワードの設定を促されるので、設定します。
※管理マネージャの認証は、「パスワード」のみです。不正アクセスされないよう、英数記号を含めたランダムな文字列を設定しましょう。
初回接続時は「SoftEther VPN Server / Bridge 簡易セットアップ」のウィザード画面が表示されますが、このあとひとつずつ設定していくので、ここでは何も設定せずに閉じます。
リスナーの管理
管理マネージャのメイン画面「リスナーの管理」のところで、VPN接続ポートは「TCP/5555」と決めたので、それ以外の使用しないポート「TCP/443」「TCP/992」「TCP/1194」を削除します。
仮想マシン上のssコマンドで確認すると、管理マネージャでの削除が即座に反映され、vpnserverのLISTENポートがTCP/5555のみとなっていることがわかります。
# ss -anp | grep vpnserver | grep LISTEN tcp LISTEN 0 128 *:5555 *:* users:(("vpnserver",pid=1101,fd=36)) tcp LISTEN 0 128 :::5555 :::* users:(("vpnserver",pid=1101,fd=38))
暗号化と通信関係の設定
管理マネージャのメイン画面で「暗号化と通信関係の設定」をクリックして、編集画面を開きます。
「使用する暗号化アルゴリズム」が、デフォルトでは「RC4-MD5」という弱いアルゴリズムとなっているので、強いアルゴリズム「DHE-RSA-AES256-SHA」に変更します。
それ以外の設定はデフォルトままで問題ないでしょう。
ダイナミックDNS機能の無効化
今回の「踏み台」としての用途では、VPNサーバーのIPアドレスは固定したほうがよく、ホスト名によるアクセスは必要ないので、ダイナミックDNS機能は不要です。
ダイナミックDNS経由の不正アクセスの可能性もゼロではないので、無効にします。
管理マネージャのメイン画面で「ダイナミックDNS設定」をクリックして、編集画面を開きます。
左下の「ダイナミックDNS機能を無効にする」をクリックします。
仮想HUBの作成
「仮想HUB」は、VPN専用のネットワークセグメントを管理する仮想的なハブです。
PC等のVPNクライアントは、VPN接続によって、仮想HUBに接続することになります。
・SoftEther VPN: 3.3.2 SoftEther VPN Server と仮想 HUB
https://ja.softether.org/4-docs/1-manual/3/3.3#3.3.2_SoftEther_VPN_Server_.E3.81.A8.E4.BB.AE.E6.83.B3_HUB
複数の仮想HUBを作成し、それぞれ異なるVPN環境を用意することもできますが、今回は一つしか作成しません。
管理マネージャで、デフォルトの仮想HUBを削除し、新しい仮想HUBを作成します。
まず、管理マネージャのメイン画面上部で、仮想HUB「DEFAULT」を削除します。
続いて、「仮想HUBの作成」をクリックして、編集画面を開きます。
仮想HUBの情報を指定します。
- 仮想HUB名: (お好みの名前、ここでは「VPN1」)
- 仮想HUB管理用パスワード: (お好みのパスワード)
- 匿名ユーザーに対してこの仮想HUBを列挙しない: チェックする
- 最大同時接続セッション数を制限する: (お好みで)
SecureNATの設定
「SecureNAT」機能については、マニュアルの説明がとてもわかりやすいです。
・SoftEther: 3.7 仮想 NAT および仮想 DHCP サーバー
https://ja.softether.org/4-docs/1-manual/3/3.7
家庭や企業内ネットワークで使用する一般的なブロードバンドルータは、内側のPC等のデバイスにプライベートIPアドレスを付与して、NAT(IPアドレス変換)機能でグローバルIPアドレスに変換してインターネットとの通信をうまくやってくれていますよね。
「SecureNAT」は、そういったブロードバンドルータと同じような機能で、「仮想HUB」によるVPN専用のネットワークセグメントと、(VPNサーバーが稼働している)仮想マシンが実際に使用するネットワークセグメント間の通信をうまいことやってくれます。
管理マネージャのメイン画面で、仮想HUB「VPN1」を選択して、「仮想HUBの管理」をクリックします。
続いて、仮想HUBの管理画面で、「仮想NATおよび仮想DHCPサーバー機能」をクリックします。
仮想NATおよび仮想DHCP(SecureNAT)の設定画面で、「SecureNATの設定」をクリックして、SecureNATの設定内容を確認します。
SecureNATの設定画面が開きます。
仮想NAT機能と仮想DHCP機能を使用するチェックがついていることと、設定内容を確認しますが、基本的にはデフォルトままでOKです。
IPアドレスまわりについては、(今回は)仮想マシンのプライベートIPアドレスは 10.31.0.11なので、それに合わせる必要があるのではないかと気になってしまうかもしれません。
ですが、ここで設定するのは、仮想HUBによるVPN専用のネットワークですので、デフォルトの 192.168.30.0/24 で問題ありません。
SecureNATが、VPN専用のネットワークセグメント 192.168.30.0/24 と仮想マシンが属するプライベートネットワークセグメント 10.31.0.0/21 間の通信時にアドレス変換(=NAT)を行ってくれるというわけです。
仮想NATのMTU値については、僕の環境では「1500(バイト)」のままで問題ありませんでしたが、うまくVPN接続できなかったり、VPN通信が遅い場合は、「1280」など調整してみるとよいと思います。
仮想NATおよび仮想DHCP(SecureNAT)の設定画面に戻って、「SecureNAT機能を有効にする」をクリックして有効にします。
なお、ネット上の他の記事では、「ローカルブリッジ(およびtapデバイス)」を設定する手順が多いようですが、僕が試した限りでは、SecureNAT機能で仮想NATと仮想DHCPを有効にすれば、ローカルブリッジの設定は不要です。
※さらに補足すると、もしローカルブリッジを設定する場合は、接続先を既存のLANデバイスにするとCPU負荷が高く、かつ通信速度が遅くなるので、tapデバイスを作成することをおすすめします。
また、SecureNATを使用せずに、iptablesの設定でNATする記事も見られます。
このあたりの設定は各自の好みだとは思いますが、僕は、VPNサーバーを使用するための設定はVPNサーバーソフト(今回はSoftEther VPN)の機能に任せて、仮想マシン側の設定は極力少なくするべきだと考えているので、SecureNATを使用します。
IPSec / L2TPの設定
クライアントからVPN接続する際、スマホやWindows, Mac OS XなどのOS標準のVPNクライアントを使用する場合は「IPSec / L2TP」機能を有効にします。
運用で、「SoftEtherのVPNクライアントソフトの使用が必須」とできるのであれば、有効にする必要はありません。
有効にする場合は、管理マネージャのメイン画面で、仮想HUB「VPN1」を選択して、「IPSec / L2TP 設定」をクリックします。
「L2TPサーバー機能を有効にする(L2TP over IPsec)」をチェックし、IPsec事前共有鍵として、8文字程度の文字列を設定します。
こちらも有効無効は好みになりますが、可能であれば、
「VPN接続はSoftEtherのVPNクライアントソフトに限定=IPSec / L2TPは無効」
としたほうが、VPNアクセスする手段が少なくなるので、少しだけ安全になると思います。
(2021.8.16追記)
2021年8月、「IPsec VPN装置宛へのサイバー攻撃が増えている」という情報がありました。
・2021/08/16 日本の広範囲のグローバル IP の IPsec VPN 装置宛へのサイバー攻撃の注意喚起と「SoftEther VPN」/「PacketiX VPN」への影響を防ぐための設定の確認のお願い・新ビルドのお知らせ – ソフトイーサ
https://ja.softether.org/9-about/news/901-210816
「L2TP over IPsec」機能を有効にしたときは、上記のソフトイーサ社のお知らせのとおり、IPSec事前共有鍵の文字数を8文字以上にする、SoftEther VPNのアップデートなどを実施してください。
「L2TP over IPsec」機能を無効にしているときは、このサイバー攻撃の影響を受けません。
(2021.8.16追記ここまで)
VPNユーザーの設定
仮想HUBに対して、VPN接続のユーザーエントリーを作成します。
管理マネージャのメイン画面で、仮想HUB「VPN1」を選択して、「仮想HUBの管理」をクリックします。
続いて、「ユーザーの管理」をクリックします。
ユーザーの管理画面で、「新規作成」をクリックして、ユーザー情報を入力します。
認証方法は「パスワード認証」とします。
必要に応じて、グループ名やアカウントの有効期限を設定します。
なお、認証方法で「固有証明書認証」を使用すれば、ユーザーごとに発行される証明書を持っていないと認証が通らなくなるのでよりセキュアになるのですが、残念ながら、「固有証明書認証」は、無償のSoftEther VPNでは使用できないようです。
以下の画像は、このときのアラート表示です。
以上で、VPNサーバー側の設定は完了となります。
VPN接続の確認
ここでは、クライアントPCで、VPN接続ユーザーとしての確認を行います。
SoftEther VPNクライアントを使用します。
SoftEther VPNクライアントのインストール
SoftEther公式ダウンロードページ
http://www.softether-download.com/ja.aspx?product=softether
より、「SoftEther VPN Client」を選択し、さらにプラットフォーム、CPUを選択し、RTM最新版をダウンロード、
ダウンロードしたインストーラを起動し、「SoftEther VPN Clientのみ」を選択してインストールします。
初回接続
インストールした「SoftEther VPNクライアント」を起動します。
「新しい接続設定の作成」をクリックします。
初めて接続設定を作成するときは、仮想LANカードの作成が必要となります。
仮想LANカード「VPN」を作成します。
仮想LANカードが作成されたら、再度「新しい接続設定の作成」をクリックします。
先ほどまで設定した、VPNサーバーのLISTENポート、仮想HUB名、使用するLANカード、ユーザー名、パスワードを設定します。
- 接続設定名: (お好みの接続設定名)
- ホスト名: (仮想マシンのグローバルIPアドレス)
- ポート番号: 5555
- 仮想HUB名: VPN1
- 使用する仮想LANカード: VPN
- ユーザー名: (作成したVPNユーザー)
- パスワード: (VPNユーザー作成時に設定したパスワード)
設定画面でパスワードを入力しなければ、接続時に入力が求められます。
「パスワードを保存しない」設定も可能です。
ここまでのVPNサーバーやクライアントの設定が問題なければ、VPN接続が完了し、VPNサーバーの仮想DHCP機能により、IPアドレス 192.168.30.10 が付与されます。
付与されたIPアドレスは、Windowsのコマンドプロンプト上で、ipconfigコマンドを実行することで確認できます。
> ipconfig Windows IP 構成 イーサネット アダプター VPN - VPN Client: 接続固有の DNS サフィックス . . . . .: リンクローカル IPv6 アドレス. . . . .: fe80::4582:a4c:a717:xxxxxxx IPv4 アドレス . . . . . . . . . . . .: 192.168.30.10 サブネット マスク . . . . . . . . . .: 255.255.255.0 デフォルト ゲートウェイ . . . . . . .: 192.168.30.1
動作確認
本来の目的であった「踏み台」としての動作、VPN接続時の通信速度、仮想マシンのサーバー負荷などを確認します。
まず、クライアントPCのブラウザから、アクセス元IPアドレスを表示してくれるWebサイトなどにアクセスしてみて、IPアドレスが、仮想マシンのグローバルIPアドレスとなっていることを確認します。
(参考)
・あなたのグローバルIPとホスト名を表示
http://dog.tele.jp/lookup.php
クライアントPCからメンテナンス対象のサーバーにSSHログインしてみて、サーバー側のセキュアログで、接続元IPアドレスが、仮想マシンのグローバルIPアドレスとなっていることを確認するのもよいですね。
VPN接続時の通信速度は、インターネット上のスピードテストサイトで確認できます。
僕の場合は、VPN接続時は、通常時の50%~90%ぐらいの速度となりました。
VPNサーバーが稼働する仮想マシンのCPU負荷は、VPNサーバーの有無やVPN接続の有無でほとんど変わらないはずです。
VPN接続時にCPU負荷が上がるのであれば、「ローカルブリッジで既存デバイスを使用している」など、好ましくない設定があると思われるので、設定を見直すべきでしょう。
VPNサーバープロセスが使用するメモリは、20MB前後です。
# ps aux | grep vpn root 1323 0.0 0.0 17504 492 ? S<s 13:05 0:00 /usr/local/vp server/vpnserver execsvc root 1324 0.3 2.2 692036 22380 ? S<l 13:05 0:07 /usr/local/vp server/vpnserver execsvc
このように、SoftEther VPNサーバーが使用するCPU、メモリリソースは非常に小さいので、使用するクラウドサーバーはスペックが低いもので十分です。
ここまで確認できれば、踏み台用VPNサーバー環境はひとまず完成となります。
クライアントからのVPN接続完了後の、ネットワーク構成イメージは以下のとおりです。
VPNサーバーの運用について
この踏み台用VPNサーバーの運用にあたり、より便利に使う方法やセキュリティ強化について考えてみます。
スプリットトンネリングの設定
クライアントPCからVPN接続すると、インターネットへの通信がすべてVPNサーバー経由となります。
通信そのものは問題ありませんが、通常時と比べると通信速度はやや遅くなりますし、クラウドサーバーの通信でネットワーク転送量課金があるサービスの場合は、転送料金がかかります。
これを、
「特定の宛先への通信のみVPNサーバー経由とし、
それ以外の通信はVPNサーバーを経由せずに直接宛先に向ける」
ようにするのが、「スプリットトンネリング」です。
具体的には、クライアントPC側での静的ルーティング設定です。
SoftEther VPNでは、SecureNATの仮想DHCPサーバーで、あらかじめ設定した静的ルーティング情報をクライアントPCにプッシュしてくれる機能があります。
この設定方法は、以下の記事の説明がわかりやすいです。
・AWS/プライベートサブネットにEC2をたてる(VPNクライアント編)
https://mashpote.net/2016/12/30/post-578/
ところが、この機能も無償のSoftEther VPNでは使用できないようです。
以下の画像は、このときのアラート表示です。
しょうがないので、クライアントPCのOSの機能で、静的ルーティングを設定します。
Windowsでは、routeコマンドで設定可能です。
まず、コマンドプロンプトを管理者権限で起動します。
現在のルーティング設定とインタフェースを確認します。
> route print =========================================================================== インターフェイス一覧 10...96 e9 79 f4 94 xx ......Microsoft Wi-Fi Direct Virtual Adapter 13...00 ac ce b8 00 xx ......VPN Client Adapter - VPN 7...94 e9 79 f4 94 xx ......Qualcomm Atheros QCA61x4A Wireless Network Adapter 4...94 e9 79 f4 94 xx ......Bluetooth Device (Personal Area Network) 1...........................Software Loopback Interface 1 5...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface =========================================================================== IPv4 ルート テーブル =========================================================================== アクティブ ルート: ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック 0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.26 50 127.0.0.0 255.0.0.0 リンク上 127.0.0.1 331 127.0.0.1 255.255.255.255 リンク上 127.0.0.1 331 127.255.255.255 255.255.255.255 リンク上 127.0.0.1 331 192.168.0.0 255.255.255.0 リンク上 192.168.0.26 306 192.168.0.26 255.255.255.255 リンク上 192.168.0.26 306 192.168.0.255 255.255.255.255 リンク上 192.168.0.26 306 224.0.0.0 240.0.0.0 リンク上 127.0.0.1 331 224.0.0.0 240.0.0.0 リンク上 192.168.0.26 306 255.255.255.255 255.255.255.255 リンク上 127.0.0.1 331 255.255.255.255 255.255.255.255 リンク上 192.168.0.26 306 ===========================================================================
(192.168.0.0/24 は、僕が使用しているルーターのプライベートネットワークです。)
これより、デフォルトゲートウェイのメトリックは50であることがわかります。
また、VPNクライアントをインストールした際に作成した仮想LANカード「VPN」のインタフェース番号は 13 であることがわかります。
「VPN」インタフェースに対して、静的ルーティング設定を行います。
以下は、IPアドレス AAA.BBB.CCC.DDD へのアクセス時のみ、VPNサーバーを経由させる場合のコマンドです。
(192.168.30.1 は、VPNの仮想ホスト)
> route add AAA.BBB.CCC.DDD mask 255.255.255.255 192.168.30.1 if 13
-pオプションを付与すれば、恒久的な設定として保存されます
> route -p add AAA.BBB.CCC.DDD mask 255.255.255.255 192.168.30.1 if 13
また、クライアントPCのネットワーク接続で、VPNクライアントデバイスを選択し、
プロパティ > インターネットプロトコルバージョン4 (TCP/IPv4) > プロパティ > 詳細設定
で、インターフェースメトリックを 1 から 60(デフォルトゲートウェイのメトリック 50より大きい値)に変更します。
このあたりの、Windows PCのインタフェースメトリックの設定は、先ほどの参考記事にも説明があります。
・AWS/プライベートサブネットにEC2をたてる(VPNクライアント編)
https://mashpote.net/2016/12/30/post-578/
少々手間がかかりますが、これでスプリットトンネリングが実現できます。
なお、Windowsで静的ルーティングのエントリーを削除するときは、route deleteコマンドを使用します。
> route delete AAA.BBB.CCC.DDD
不正VPN接続への対策
SoftEther VPNによる踏み台用VPNサーバーを構築することで、メンテンナンス対象サーバーのアクセス元IPアドレスをVPNサーバーのアドレスに限定することができました。
しかし、このVPNサーバーに第三者から簡単に接続されてしまっては意味がないので、不正に接続されないよう、対策を実施します。
対策として、僕が思いつくのは以下のようなことです。
一般的なセキュリティ強化と同じで、複数の手法で不正アクセスするチャンスを減らすようにします。
※7. は、2019.12.5 に追記しました。
- 管理パスワードは複雑な文字列とする
- VPNユーザーのパスワードは複雑な文字列とする
- VPNサーバープロセスは、VPN接続時のみ起動
- firewalld, iptablesでVPN接続元IPアドレスを日本国内に限定
- IPSec / L2TP機能は無効化
- 公開Webサーバーやメールサーバーと併用しない
- 管理マネージャの接続元IPアドレスを限定
1,2については、管理マネージャでの接続やVPN接続は、SoftEtther無償版では残念ながらクライアント証明書は使用できず、パスワード認証のみなので、英数記号含め、12文字以上などある程度の長さを持った文字列とすべきでしょう。
また、VPNユーザーは、サーバーやクラウドのアカウント運用と同じように、担当者ひとりあたり1ユーザーを割り当てましょう。
担当者ごとの接続履歴を残せますし、VPNユーザーを共有使用すると、担当を外れた人でもVPN接続が可能な状態となってしまいます。
3は、毎回メンテナンス作業開始時にひと手間かかりますが、VPN接続時以外はVPNサーバープロセスを停止することで、不正VPN接続のチャレンジが可能な時間帯を大幅に削減します。
この場合、仮想マシンではVPNサーバーを自動起動設定せず、毎回VPN接続をするときに、いったん仮想マシンにSSHログインして、「systemctl start vpnserver」のコマンドを実行することになります。
※あるいは、ふだんは仮想マシンを停止しておいて、VPN接続時のみ仮想マシンおよびVPNサーバーを起動する、という方法もありますね。
また、firewalldまたはiptablesを使用している場合、VPNサーバーサービスの起動、停止に合わせて、VPNで使用するポート(TCP/5555, UDP/500, UDP/4500)のアクセス許可ルールを追加・削除するのもよいでしょう。
(この場合、クラウドのファイアウォールでは、恒久的にVPNで使用するポートを開けておきます。)
CentOS 7のfirewalldで実現するには、
- VPNサーバー使用ポートへのアクセス許可ルール追加スクリプト /root/bin/firewall_add_vpnserver.sh
- VPNサーバー使用ポートへのアクセス許可ルール削除スクリプト /root/bin/firewall_remove_vpnserver.sh
というスクリプトを用意して、Systemd用のユニットファイルで、ExecStartPost、ExecStopPostに追記して、サービス起動・停止後にスクリプトを実行するようにします。
※スクリプトに vpnserver start, stop も含めて、サービスの起動(ExecStart)、サービスの停止(ExecStop)に設定するのでもよいでしょう。
# vi /root/bin/firewall_add_vpnserver.sh -- #!/bin/bash firewall-cmd --zone=public --add-port=5555/tcp firewall-cmd --zone=public --add-service=ipsec -- # vi /root/bin/firewall_remove_vpnserver.sh -- #!/bin/bash firewall-cmd --zone=public --remove-port=5555/tcp firewall-cmd --zone=public --remove-service=ipsec -- # chmod 700 /root/bin/firewall_add_vpnserver.sh # chmod 700 /root/bin/firewall_remove_vpnserver.sh # vi /etc/systemd/system/vpnserver.service -- [Unit] Description=SoftEther VPN Server After=network.target [Service] Type=forking ExecStart=/usr/local/vpnserver/vpnserver start ExecStop=/usr/local/vpnserver/vpnserver stop ExecStartPost=/root/bin/firewall_add_vpnserver.sh // 追記 ExecStopPost=/root/bin/firewall_remove_vpnserver.sh // 追記 [Install] WantedBy=multi-user.target --
4は、海外からの不正VPN接続をブロックします。
ipsetで国別のIPアドレスを管理して、それをfirewalldやiptablesと組み合わせることで実現します。
firewalldとipsetの組み合わせは、以下の記事がわかりやすいです。
・firewalld + ipset でアクセス制限
http://www.server-memo.net/centos-settings/firewalld/firewalld_ipset.html
iptablesとipsetの組み合わせは、以前、僕が書いた記事があるので参考まで。
・ipsetとiptablesでSSHを日本国内からの接続に限定する (CentOS 7)
https://inaba-serverdesign.jp/blog/20150209/ipset_iptables_country_centos7.html
5は、VPNサーバーの構築手順でも記載しましたが、IPSec / L2TP機能を無効にすれば、OS標準のVPNクライアントからは接続できないので、VPNアクセスする手段が少なくなります。
なお、「IPSec / L2TP」では、VPN接続時にユーザー名、パスワードに加えて、IPSec事前共有鍵の入力が必要なので、SoftEtherのVPNクライアントソフトでの接続に比べると、認証が厳しくなります。
VPNサーバー側で
「SoftEtherのVPNクライアントソフトでの接続を禁止、IPSec / L2TPでの接続のみ可」
という設定ができればそちらのほうがセキュリティは強固になりますが、そうはできないようなので、それならばIPSec / L2TP機能を無効化したほうがよいのかな、という考え方です。
6は、以下のような意図があります。
- VPNサーバーの構築作業や運用時に公開Webサイトやメール送受信に影響を与える可能性がある。
- Webサイトへのアクセス集中やメール送受信量が多くサーバーの負荷が上がったときに、VPNが使えない可能性がある。
- 公開Webサイトにしている分、ホスト名による不正アクセスの試みが多い(かもしれない)
基本的には、公開Webサーバーには、他のサーバーを管理・メンテナンスするような機能を持たせるべきではありません。
ちなみに僕は、自分一人で使っているプロジェクトサーバー(Redmine, Subversion, 監視ツールなどが稼働)にSoftEther VPNサーバーを導入し、上記1~6の対策はすべて行っています。
7は、管理アクセスを制限します。
SoftEtherサーバー管理マネージャや vpncmd によるリモート管理のアクセス元IPアドレスを限定する機能を使用します。
(参考)
SoftEther VPNドキュメント 3.3.18 IP アドレスによるリモート管理接続元の制限
VPN Server(vpnserverコマンド)がインストールされているディレクトリ上に adminip.txt という名前のテキストファイルを作成し、アクセス元IPアドレスのリストを1行1レコードで記載します。
以下のような範囲指定も可能です。
203.0.113.0/24
ディレクトリは、ここで記載したインストール方法であれば、/usr/local/vpnserver となりますし、make install したのであれば、/usr/vpnserver となります。
設定したIPアドレス以外から、SoftEtherサーバー管理マネージャでアクセスした場合、以下のようなアラートが表示されます。
機能制限の解除
(この項は、2017.8.18に追記しました)
「無償のSoftEther VPNは、有償製品のPacketiX VPNと比べて機能制限がある」と書きましたが、この機能制限を解除する方法があることがわかりました。
(参考)
・SoftEther のリージョンロックを外して RADIUS や証明書認証を有効にする
https://blog.cles.jp/item/9524
ソースコードをダウンロードして、ソースの一部を改修してビルド&インストールすれば、機能制限を解除できるとのこと。
僕も実際に試してみたところ、うまくいきました。
ソースコードのコメントには、「自己責任で制限を外すことができる(和訳)」とあるので、規約違反ではないでしょう。
「接続時の固有証明書による認証」「静的ルーティングのプッシュ」といった機能はとても便利ですので、利用できるのはありがたいです。
ところでこの機能制限、ソースコードのコメントを読むとわかりますが、「サーバーが日本か中国で動作している」ときに制限されるようになっています。
実は僕はいくつかのIaaSクラウドサーバー上でSoftEther VPNを試していて、AWS EC2を使用したときだけ、機能制限が解除されていることを確認していました。
同じ手順で構築しているのになぜAWSのときだけ動作が違うのだろう、と不思議に思っていたのですが、AWS EC2のグローバルIPアドレスは、東京リージョンでも割り当て国が「US」なので、機能制限が解除されるんですね。
ということで、ソースコードの一部を改修しなくても、AWSなど、IPアドレスの割り当て国が日本か中国以外のIaaSクラウドサーバー上でSoftEther VPNサーバーを起動すると、機能制限が解除されます。
同一LAN環境内の複数Windows端末からの同時接続
(この項は、2019.12.5に追記しました)
L2TP/IPsecによるリモートアクセスVPNでは、
「同一LAN環境内の複数Windows端末から同時接続できない」
という問題があります。
これはNATとWindowsの仕様だそうで、例えば、さくらのクラウドのマニュアル「リモートアクセス(VPN)設定」にある説明がわかりやすいです。
「NAT環境下のWindowsからL2TP/IPsecでリモートアクセスを行う場合、同一NAT環境内から同時接続可能なWindowsクライアントは1台のみとなります。これはWindowsの仕様によりIPsecカプセリングされるパケットのソースポートが1701(=L2TP)となり、同じNAT環境内でソースポートが重複することでSAが個別に作成できなくなるためです。」
さくらのクラウド マニュアル「リモートアクセス(VPN)設定」
https://manual.sakura.ad.jp/cloud/network/vpc-router/vpc-remoteaccess.html
より。
SoftEther VPNでは、この問題は発生しません。
これは、SoftEther VPNは、L2TP/IPsecではなく、Ethernet over HTTPSによる独自実装を行っているためです。
SoftEther VPNのしくみについては、以下の説明が詳しいです。
SoftEther VPNの概要・特徴 1.極めて強力な VPN 接続性
SoftEther VPNで、L2TP/IPsec機能を有効にして、Windows端末でWindows標準のVPNクライアントで接続したときは、この問題が発生するでしょう。
まとめ
インターネット上のサーバーをメンテナンスするための
「固定IPアドレスをもつ踏み台サーバー」
として、IaaSクラウドのLinux仮想サーバー上に、
「SoftEther VPNによる踏み台用VPNサーバー」
を構築する手順を記載しました。
VPNルーター実機がなくても、クラウドサーバーを使えば、安価で可用性に富む踏み台VPNサーバーを構築・運用できます。
たくさん補足説明を加えたので、記事としては長くなってしまいましたが(笑)、SoftEther VPNサーバーの構築自体はとても簡単です。
ただし、VPNサーバー自体に不正アクセスをされてしまっては本末転倒なので、セキュリティ対策はしっかり実施しましょう。
(関連記事)
・SoftEtherによる踏み台用VPNサーバーの構築手順 on IDCFクラウド~VPN接続時の通信速度を改善
https://inaba-serverdesign.jp/blog/20241111/softether-vpn-idcf-cloud-speedup.html
・ipsetとiptablesでSSHを日本国内からの接続に限定する (CentOS 7)
https://inaba-serverdesign.jp/blog/20150209/ipset_iptables_country_centos7.html
・稲葉サーバーデザイン: 料金プラン
https://inaba-serverdesign.jp/plan