MacでL2TP over IPSecサーバを建てる（CUI編）


MacでVPNサーバを建てたい時があるかと思います。
自分はスマートフォンのトラフィックをPCを経由させたくてVPNサーバを建てました。
Macには標準で`vpnd`が入っているようで、これを使えば簡単です。
ただ、設定ファイルが結構めんどくさいのでメモとして残しておきます。

以下の手順でできると思いますが、もしできなければ教えて下さい。
なお、今回はL2TPを対象とします。

# 検証環境
- Mac
	- OS X Yosemite(10.10.3)
- VPN
	- L2TP over IPSec


# 参考ページ
- [MacのVPNサーバー機能](http://qiita.com/yu-ichiro/items/d20476ef7097961cf581)

# 使い方
設定ファイルとしてplistを用意します。

## 設定ファイル
### com.apple.RemoteAccessServers.plist
`vpnd`の起動時に必要なplistの設定です。
設定ファイルのパスは`/Library/Preferences/SystemConfiguration/com.apple.RemoteAccessServers.plist`です。
設定ファイルは以下になります。なかったら作ります。

```shell-session:com.apple.RemoteAccessServers.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>ActiveServers</key>
	<array>
		<string>com.apple.ppp.l2tp</string>
	</array>
	<key>Servers</key>
	<dict>
		<key>com.apple.ppp.l2tp</key>
		<dict>
			<key>DNS</key>
			<dict>
				<key>OfferedSearchDomains</key>
				<array>
					<string>Replace with DNS search domain(s) - remove if not needed</string>
				</array>
				<key>OfferedServerAddresses</key>
				<array>
					<string>8.8.8.8</string>
					<string>8.8.4.4</string>
				</array>
			</dict>
			<key>IPv4</key>
			<dict>
				<key>ConfigMethod</key>
				<string>Manual</string>
				<key>DestAddressRanges</key>
				<array>
					<string>192.168.1.10</string>
					<string>192.168.1.100</string>
				</array>
			</dict>
			<key>Interface</key>
			<dict>
				<key>SubType</key>
				<string>L2TP</string>
				<key>Type</key>
				<string>PPP</string>
			</dict>
			<key>L2TP</key>
			<dict>
				<key>IPSecSharedSecret</key>
				<string>password</string>
				<key>Transport</key>
				<string>IPSec</string>
			</dict>
			<key>PPP</key>
			<dict>
				<key>AuthenticatorProtocol</key>
				<array>
					<string>MSCHAP2</string>
				</array>
				<key>LCPEchoEnabled</key>
				<integer>1</integer>
				<key>LCPEchoFailure</key>
				<integer>5</integer>
				<key>LCPEchoInterval</key>
				<integer>60</integer>
				<key>Logfile</key>
				<string>/var/log/ppp/vpnd.log</string>
				<key>VerboseLogging</key>
				<integer>1</integer>
			</dict>
			<key>Server</key>
			<dict>
				<key>Logfile</key>
				<string>/var/log/ppp/vpnd.log</string>
				<key>MaximumSessions</key>
				<integer>128</integer>
				<key>VerboseLogging</key>
				<integer>1</integer>
			</dict>
		</dict>
	</dict>
</dict>
</plist>
```


上記の設定ファイルで設定しているのは以下になります。
値は状況に応じて変えてください。


| 設定項目 |値 |
|:-----------|------------:|
| DNSサーバ（プライマリ） | 8.8.8.8 |
| DNSサーバ（セカンダリ） | 8.8.4.4 |
| DHCPサーバ アドレスレンジ（From）| 192.168.1.10|
| DHCPサーバ アドレスレンジ（To）| 192.168.1.100|
| 共有シークレット | password|
| logファイルのパス | /var/log/ppp/vpnd.log|


### pppdの設定
`man vpnd`すると書いてありますが、`vpnd`はVPNで受け取ったデータを`pppd`に流しているので、ユーザー情報などは`pppd`の設定に書く必要があります。
`pppd`の設定は`/etc/ppp/`に書くらしいです。
参考サイトによるとMSCHAPv2認証の場合の設定方法のようですが、`/etc/ppp/users.plist`にユーザ情報を書きます。

```shell-session:users.plist
<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
         <key>Password</key>
         <string>password</string>
         <key>User</key>
         <string>username</string>
 </dict>
 </plist>
```

上記ファイルでは認証を行うための情報を書いています。
設定項目は以下になります。値は状況に応じて変えてください。

| 設定項目 | 値 |
|:-----------|------------:|
| ユーザ名 | username |
| パスワード | password |


## 起動
起動方法ですが、

```console
$ sudo vpnd
```

とすると`ActiveServers`に書かれているplistが読み込まれるみたいです。
なので、`ActiveServers`に複数書いてある場合は、

```console
$ sudo vpnd -i com.apple.ppp.l2tp
```

のようにすると、明示的に起動できます。

## 確認

```console
$ ps aux | grep vpnd
root            27055   0.0  0.0  2455448    804   ??  Ss   11:33AM   0:00.16 vpnd -i com.apple.ppp.l2tp
```

`vpnd`が見えていれば大丈夫です。
見えていない場合は設定がおかしいかもしれません。　

## 停止
停止方法が見つかりませんでした。仕方ないので`killall`しております。
良い方法を見つけた人がいたら教えて下さい。

```console
$ sudo killall vpnd
```

#まとめ
設定ファイルだけ最初に書けば、次回以降はコマンド一つでVPNサーバが起動します。
色々と使い道はあると思うので試してみてください。