iOSやAndroid端末、あるいは Windows PC などからもリモートアクセスできるよう、VPS マシンに VPN 接続を設定しておく。
PPTPについては既に脆弱性が発見されており、OSによってはサポート対象外になっているため、VPN プロトコルとしては L2TP/IPsec を使う。
前提:
対象サーバはVPSのCentOS 7。
IPsec 実装としては strongswan、L2TP 実装としては xl2tpd を利用する。
1. インストール
[user@myvps1 ~]$ sudo apt-get install strongswan xl2tpd
カーネルパラメータをパケット転送できるよう設定する。
[user@myvps1 ~]$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1 #28行目のコメントを外す
[user@myvps1 ~]$ sudo sysctl -p /etc/sysctl.conf
ファイアウォール(ufw)を閉じている場合は、ESP、UDP 500・4500 を空けておくこと。
2. ipsec.confの設定
[user@myvps1 ~]$ sudo vi /etc/strongswan/ipsec.conf
以下の内容を追記する。
conn L2TP-PSK authby=secret auto=add closeaction=clear dpdaction=clear type=transport rekey=no left=203.0.113.180 leftprotoport=17/1701 right=%any rightprotoport=17/%any
IPsec はトランスポートモードを使用する。ペイロードに L2TP を通すので、ルーティングはそちらに任せる。
再接続等はクライアント側に任せたいため、こちらからは何もしない設定である。接続が切れた場合はセッションをクリアする。
3. IPsecの事前共有鍵の設定
[user@myvps1 ~]$ sudo vi /etc/strongswan/ipsec.secrets
事前共有鍵を平文で記述する。
: PSK "mypresharedkey"
4. xl2tpd.conf の設定
[user@myvps1 ~]$ sudo vi /etc/xl2tpd/xl2tpd.conf
以下の設定を追記する。
[global] port = 1701 [lns default] ip range = 172.16.1.11-172.16.1.30 local ip = 172.16.1.254 length bit = yes require chap = yes refuse pap = yes require authentication = yes name = myvps1.vpsnet.example.jp ppp debug = no pppoptfile = /etc/ppp/xl2tpd-options
接続クライアント側には、172.16.1.11 から 30 の間でアドレスが割り振られる。
5. xl2tpd-options の設定
[user@myvps1 ~]$ sudo vi /etc/ppp/xl2tpd-options
L2TPの設定を記述する。
ipcp-accept-local ipcp-accept-remote ms-dns 172.16.1.254 (myvps1:172.16.1.254にキャッシュDNSサーバが立っている前提) noccp auth crtscts idle 1800 mtu 1300 mru 1300 nodefaultroute lock connect-delay 5000 refuse-pap refuse-chap refuse-mschap require-mschap-v2
6. chap-secrets の設定
[user@myvps1 ~]$ sudo vi /etc/ppp/chap-secrets
username * "l2tppassworddesu" *
一般ユーザで読めない権限にしておく。
7. デーモンの起動
[user@myvps1 ~]$ sudo service strongswan restart
[user@myvps1 ~]$ sudo service xl2tpd restart
この状態で、iPhoneなどから接続してみる。
iPhoneであれば「設定」→「VPN」→「VPN構成を追加…」で「L2TP」を選択して設定を追加する。
「サーバ」欄にはVPSのホスト名(IPアドレス)、「アカウント」にはL2TPユーザ名、「パスワード」にはL2TPパスワード、「シークレット」にはIPsec事前共有鍵を設定する。
クライアント機器が公衆無線LANなどのプライベートネットワーク中に居る状態では、自動的に NAT-Traversal が利用される。ESP だけでなく、UDP 4500番ポートについてファイアウォールが空いている必要がある。