Ubuntu ServerにはインストールされていないNetwork Managerをあえてインストールし、VPNクライアントとして使用する方法を解説します。
VPSとVPN接続
昨今のクラウドサービス(IaaS)の多くではVPN接続サービスをオプションで提供しています。特にクラウドサービスである必要はないものの、安価にVPSでVPNを設定したい、ルーターのVPNサーバー機能と組み合わせてまるでローカル接続のようにVPSを使用したいというニーズはあるのではないでしょうか[1] 。
ご家庭にあるようなルーターのVPN機能はPPTPをサポートしているものが多いですが、今となってはセキュリティ的に論外です。簡単に設定するならOpenVPNですが、対応しているルーターが少なく、またOpenVPNの特性上アプライアンスでOpenVPNサーバーを起動するのはあまりよくないように思います[2] 。
[2] OpenVPNはセキュリティをOpenSSLによって担保していますが、いうまでもなくOpenSSLはセキュリティアップデートが頻繁にあるため対応に時間がかかるアプライアンスには不向きであると筆者は考えます。そのことは『Software Design 2017年10月号 』の「Ubuntu Monthly Report 第90回 OpenVPNでおうちネットワークにログイン」で述べています。
次に候補になってくるのはL2TP/IPsecですが、対応するルーターは上位機種になるという問題はあるものの、対応モデルが多く、またPPTPと比較してセキュアなので魅力的です。そこで今回はどこのご家庭にもある[3] YAMAHA RTX1200を使用することにしました。
ではVPS側のL2TP/IPsecクライアントはどうすればいいでしょうか。順当に考えればstrongSwan +xl2tpd になりますが、設定が煩雑なので簡単に設定できるフロントエンドがあるといいです。そのため今回はNetwork Manager とNetworkMananger-l2tp を使用することにしました。VPSのOSはUbuntu Server 16.04 LTSとします。
NetworkMananger-l2tpはこの2年弱で開発が進み、安定して使用できるようになりました。ただしUbuntu 16.04 LTSのリポジトリにパッケージはないため、別途PPAからインストールする必要があります。なおUbuntu 17.10からリポジトリにあります。
簡単に説明しましたが、罠はいろいろとあります。まずUbuntu ServerにはNetwork Managerはインストールされていないため、インストールした上で設定を行う必要があります。VPSは固定グローバルIPアドレスが振られていることが多いので[4] 、設定の移植作業が必要になります。またNetwork Managerにはコマンドラインツール(nmcli)がありますが、残念ながらVPNの設定はコマンドラインからはできません。設定を手書きするか、GUIのNetwork
Managerで設定した項目をエクスポートし、nmcliでインポートする必要があります。今回は後者とします。よってUbuntu 16.04 LTSまたはUbuntu 17.10(デスクトップ)の用意も必要です。
ルーターには固定グローバルIPアドレスまたはダイナミックDNSサービスへの加入が必要です。今回は前者と仮定しますが、YAMAHAのルーターであればダイナミックDNSサービス(ネットボランチDNS)が付属するため、これを利用するのも手でしょう。
準備の工程が長いですが、詳しく見ていきましょう。
ルーターの設定
ルーターのL2TP/IPsecの設定方法はそれぞれなのでここで解説することはできませんが、RTX1200の設定例を掲載します(図1 ) 。YAMAHAのルーターでは設定名を「PP」と「anonyomous」から選択できますが、今回は固定IPアドレスのVPSを使用するので後者を使用します。しかし後述する理由により設定自体は「PP」と「anonyomous」の両方を同じ設定で作っておくと確認が楽になります。
図1 RTX 1200のL2TP/IPsecの設定例
L2TP/IPsecの設定
前述のとおりnmcliではVPNプラグインの設定はできないため、GUIで設定してエクスポートします。今回はUbuntu 17.10を使用することにしました。まず端末から"network-manager-l2tp-gnome"パッケージをインストールします。通常設定は「設定」 -「 ネットワーク」 -「 VPN」から行いますが、今回はこれを使用しません。なぜならここからだと設定のエクスポートができないからです。端末あるいはAlt+F2キーを押したあとに「nm-connection-editor」と入力し、起動します(図2 ) 。
図2 Alt+F2キーでコマンドを入力する
「ネットワーク接続」が起動したら(図3 ) 、左下の「+」ボタンをクリックします。「 接続の種類を選んでください」が表示されるので、「 Layer 2 Tunneling Protocol (L2TP)」を選択し、「 作成」をクリックします(図4 ) 。
図3 「 ネットワーク接続」が起動したら、左下の「+」をクリック
図4 「 接続を選んでください」で「Layer 2 Tunneling Protocol (L2TP)」を選択
「VPN」タブ(図5 )で「ゲートウェイ」( ルーターのホスト名あるいはIPアドレス)とユーザー名とパスワードを入力し(パスワードは必須ではありません) 、「 IPsec Settings」をクリックします(図6 ) 。「 Pre-shared key」はルーターの設定したものでいいのですが、「 Phase1 Algorithms」と「Phase2 Algorithms」に入力する文字列はまちまちです。今回RTX1200に接続するための設定はそれぞれ「3des-sha1-modp1024」「 aes128-sha1」ですが、ドキュメント を参考に適宜変更してください。
図5 ゲートウェイ、ユーザー名、パスワードを入力する。パスワードは入力しなくてもいい
図6 Algorithmsの2つはあくまで例
「PP Settings」タブも変更が必要です(図7 ) 。「 MPPE暗号を使用する」にチェックを入れ、「 セキュリティ」を「128ビット(もっとも安全) 」に変更します。MSCHAPは使わないのでチェックを外し、「 MTU」と「MRU」を適切な数値に変更して「OK」をクリックします。
図7 これも全体的に例で、必ずしもこのままの設定でいいというわけではない
あとは「保存」をクリックし、ウィンドウが閉じたら右上のユーザーメニューをクリックして「VPNオフ」の「接続」をクリックします(図8 ) 。パスワードを入力後、設定に問題がなければ接続しますが、YAMAHAのルーターの場合はanonymous接続かPP接続かをよく確認してください。
図8 わかりにくいが「接続」をクリックする
問題なく接続したら、「 VPN」タブの「エクスポート」をクリックし、設定を保存します。ファイル名は何でもいいですが、拡張子は「conf」である必要があります。
Ubuntuサーバーの設定
ようやく舞台をVPSに移して設定を行います。VPSにはUbuntu 16.04 LTSがインストールされ、適切に設定されているものとします。なお、L2TP/IPsecクライアントとして使用する場合は、特別なポートが空いている必要はありません。
まずは/etc/network/interfacesファイルの中身を確認してください。通常はここでIPアドレス等の設定が行われているもと思われます。Network Managerはこの設定があると動作しないため、この設定を移植したあとこのファイルを削除またはリネームします。このファイルではないところで設定が行われている場合は、そちらを参照してください。
今回移植する/etc/network/interfacesの例は次のとおりです。
$ cat /etc/network/interfaces
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
auto ens3
iface ens3 inet static
address AAA.AAA.AAA.AAA
netmask BBB.BBB.BBB.BBB
gateway CCC.CCC.CCC.CCC
dns-nameservers DDD.DDD.DDD.DDD EEE.EEE.EEE.EEE
dns-search dns.example.com
続けてNetwork Managerをインストールします。次のコマンドを入力してください。
$ sudo apt install network-manager --no-install-recommends
インストール完了後、次のようなメッセージが表示されます。
The following network interfaces were found in /etc/network/interfaces
which means they are currently configured by ifupdown:
- ens3
If you want to manage those interfaces with NetworkManager instead
remove their configuration from /etc/network/interfaces.
「ens3」はこのとおりではないかもしれませんが、いずれにせよ前述のとおりの注意が表示されます。
Network Managerにinterfacesファイルの設定を移植します。
ポイントは、ネットマスクはprefix長で入力する必要があります。今回はBBB.BBB.BBB.BBBをFFとしています。
では次のコマンドを入力してください。
$ sudo service network-manager start
$ sudo nmcli connection add type ethernet con-name default ifname ens3 ip4 AAA.AAA.AAA.AAA/FF gw4 CCC.CCC.CCC.CCC
$ sudo nmcli connection modify default ipv4.dns "DDD.DDD.DDD.DDD,EEE.EEE.EEE.EEE" ipv4.dns-search "dns.example.com"
$ sudo mv /etc/network/interfaces /etc/network/interfaces.old
$ sudo reboot
defaultという接続名で設定しました。
再起動後、正しくネットワーク接続が行われていれば成功ですが、念のため次のコマンドを入力して確認してください。
$ nmcli device status
「connected」の文字があれば成功しています。
ようやくNetworkManager-l2tpをインストールします。次のコマンドを入力してください。
$ sudo apt install software-properties-common
$ sudo add-apt-repository ppa:nm-l2tp/network-manager-l2tp
$ sudo apt update
$ sudo apt install network-manager-l2tp
先ほどエクスポートしたL2TP/IPsecの設定をUbuntu Serverにコピーします。方法は任意ですが、通常はscpコマンドを使用することになるでしょう。ファイル名はrtx1200.confとします。
次のコマンドでインポートします。
$ sudo nmcli connection import type l2tp file rtx1200.conf
これで完了としたいところですが、Ubuntu Serverにはパスワードを保存する仕組みがインストールされていないため、設定ファイルに直接書くことにします。例としてパスワードはPASSWDとします。
今回の例だと設定ファイル名は/etc/NetworkManager/system-connections/rtx1200
になるので、これをvimなどのエディターで開いてください。
設定箇所は、[vpn]のセクションの一番下にpassword-flags=0
を追加し、ファイルの一番下に[vpn-secrets]
セクションを追加し、password=PASSWD
を指定します。例として次のようになります。
[connection]
(中略)
[vpn]
(中略)
password-flags=0
[ipv4]
(中略)
[ipv6]
(中略)
[vpn-secrets]
password=PASSWD
実際に接続するには次のコマンドを入力してください。
$ sudo nmcli connection up (接続名)
正しく接続されているかの確認にはipコマンドを使用するのがいいでしょう。
自動接続する場合は次のコマンドを実行してください。
$ sudo nmcli connection modify default connection.autoconnect yes
$ sudo nmcli connection modify default connection.secondaries rtx1200
運用について
設定方法の説明はこれで終わりですが、運用上の問題点はいくつかあります。まずNetwork ManagerにはVPN切断時の自動再接続の仕組みがないことです。これはチェックスクリプトを定時で走らせるくらいしか解決方法が思いつきません。
またルート(route)がVPNのもの、すなわちルーターの優先度が一番高くなるため、不都合なことがあるかもしれません。これはNetwork Managerでも設定可能ですが、今回は紹介を省略します。