MacでSoftEther VPN Clientを使う


SoftEther VPN ClientのMac版を使って、VPN経由でインターネットに接続するお話。

~~**まだ、Beta版のためか、私の環境ではVPNの接続中にvpnclientのCPU使用率が常に100%付近をうろうろします。**~~
SoftEtherVPNのGitHubリポジトリにあるPull requests [#165](https://github.com/SoftEtherVPN/SoftEtherVPN/pull/165)を適用することで解決しました。

* SoftEther VPN Server側は設定済みな前提
(私はVPS上でSecureNATを有効にして利用しています)

* Mavericks(10.9.2)，Yosemite(10.10.1), El Capitanで動作確認

## 事前準備

* XcodeのCommand Line Toolsをインストール
SoftEther VPN Clientをmakeするのに必要です。

* [TunTap](http://tuntaposx.sourceforge.net/)をインストール
仮想LANカードの作成に必要になります。
Homebrew Caskにパッケージがあったので、それでインストールしました。
署名付きっぽいです。

```bash
$ brew cask install tuntap
```

## SoftEther VPN Clientのインストール

[SoftEther VPN プロジェクト](https://ja.softether.org/)から、SoftEther VPN Clientをダウンロードしてきます。

Mavericksで確認したバージョン
> SoftEther VPN Client (Ver 4.06, Build 9432, beta)
> softether-vpnclient-v4.06-9432-beta-2014.03.20-macos-x64-64bit.tar.gz (4.83 MB)

Yosemiteで確認したバージョン
> SoftEther VPN Client (Ver 4.12, Build 9514, beta)
> softether-vpnclient-v4.12-9514-beta-2014.11.17-macos-x64-64bit.tar.gz (5.15 MB)

作業としては、解凍してmakeするだけです。

```bash
$ tar zxvf softether-vpnclient-v4.06-9432-beta-2014.03.20-macos-x64-64bit.tar
$ cd ./vpnclient/
$ make

# 適当にディレクトリを移動します
$ cd ../
$ mv ./vpnclient/ /usr/local/
$ cd /usr/local/vpnclient/
```

## SoftEther VPN Clientの起動

sudoで実行させないと、仮想LANカードが扱えません。

``` bash
$ sudo ./vpnclient start
Password:
SoftEther VPN Client Service Started.
```

## SoftEther VPN Clientの設定

CUIで行います。

* VPN Clientへの接続

```bash
$ ./vpncmd
vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.06 Build 9432   (Japanese)
Compiled 2014/03/20 16:24:14 by yagi at pc25
Copyright (c) SoftEther VPN Project. All Rights Reserved.

vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス:

VPN Client "localhost" に接続しました。
```

* 仮想LANカードの作成

```bash
VPN Client>NicCreate
NicCreate コマンド - 新規仮想 LAN カードの作成
仮想 LAN カードの名前: VPN

コマンドは正常に終了しました。
```

* 接続設定の作成

```bash
VPN Client>AccountCreate
AccountCreate コマンド - 新しい接続設定の作成
接続設定の名前: Example

接続先 VPN Server のホスト名とポート番号: example.com:443

接続先仮想 HUB 名: default

接続するユーザー名: exampleuser

使用する仮想 LAN カード名: VPN

コマンドは正常に終了しました。
```

後は、適宜設定を行ってください。
私の場合は、追加でパスワード認証の設定を行います。

```bash
VPN Client>AccountPasswordSet
AccountPasswordSet コマンド - 接続設定のユーザー認証の種類をパスワード認証に設定
接続設定の名前: Example

パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。

パスワード: ********
確認入力  : ********


standard または radius の指定: standard

コマンドは正常に終了しました。
```

CUIで設定するのが面倒であれば、Windows版のClientに含まれる`SoftEther VPN クライアント接続マネージャ`をWineで動かせばGUIで設定できます。
(引数に`/remote`が必要？)

## SoftEther VPN Serverへの接続

* SoftEther VPN Serverへの接続

```bash
VPN Client>AccountConnect
AccountConnect コマンド - 接続設定を使用して VPN Server へ接続を開始
接続設定の名前: Example

コマンドは正常に終了しました。
```

* DHCPやルーティングの設定

ここからはvpncmdから抜けて、シェルでの作業。
各インタフェースやIPアドレス等は各自の環境に合わせてください。


```bash
# DHCPによるIPアドレスの取得
$ sudo ipconfig set tap0 DHCP

# IPアドレスの確認
$ ifconfig tap0
tap0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether 00:ac:xx:xx:xx:xx
 	inet 192.168.30.10 netmask 0xffffff00 broadcast 192.168.30.255
	open (pid 290)

# ルーティングテーブルの確認
$ netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.11.1       UGSc           15        0     en0
default            192.168.30.1       UGScI           0        0    tap0
...

# VPN Serverへの接続が切れないように静的ルーティングを追加
# (example.comのIPアドレスが203.0.113.100の場合)
$ sudo /sbin/route add -net 203.0.113.100 192.168.11.1 255.255.255.255

$ netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.11.1       UGSc           14        0     en0
default            192.168.30.1       UGScI           0        0    tap0
...
203.0.113.100/32   192.168.11.1       UGSc            1        0     en0
...

# 既存のデフォルトゲートウェイの削除
$ sudo route delete default 192.168.11.1
delete net default: gateway 192.168.11.1

# DHCPで設定されるデフォルトゲートウェイはうまく機能しないので、
# 手動でデフォルトゲートウェイを追加
$ sudo route add default 192.168.30.1
add net default: gateway 192.168.30.1

$ netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.30.1       UGSc            0        0    tap0
default            192.168.30.1       UGScI           1        0    tap0
...
203.0.113.100/32   192.168.11.1       UGSc            1        0     en0
...
```

後は、IPアドレスを確認するWebサイトで、IPアドレスが変わっているかどうかを確認してください。

## SoftEther VPN Serverとの切断

ルーティングを戻して、`vpncmd`で切断すればOKです。

```bash
# 追加したデフォルトゲートウェイを削除
$ sudo route delete default 192.168.30.1
delete net default: gateway 192.168.30.1

# 元々のデフォルトゲートウェイを追加
sudo route add default 192.168.11.1
add net default: gateway 192.168.11.1

# VPN Serverへの静的ルーティングを削除
$ sudo /sbin/route delete -net 203.0.113.100
delete net 203.0.113.100

$ netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.11.1       UGSc            2        0     en0
default            192.168.30.1       UGScI           4        0    tap0
...


# VPN Serverとの切断
$ ./vpncmd
vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.06 Build 9432   (Japanese)
Compiled 2014/03/20 16:24:14 by yagi at pc25
Copyright (c) SoftEther VPN Project. All Rights Reserved.

vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス:

VPN Client "localhost" に接続しました。

VPN Client>AccountDisconnect
AccountDisconnect コマンド - 接続中の接続設定の切断
接続設定の名前: Example

コマンドは正常に終了しました。

VPN Client>exit

# VPN Clientの停止
$ sudo ./vpnclient stop
Stopping SoftEther VPN Client Service...
SoftEther VPN Client Service Stopped.
```