RaspberryPI(というかUbuntu)上にVPNサーバー構築(PPTP)

 
# RaspberryPIについて
25$で買えちゃうスーパー小さいスーパーオススメPCです。
2014年7月に新しいバージョン、「Raspberry Pi Model B+」が発表・発売されました。今から購入される方はこちらをおすすめします。
参考リンク: [TechCrunch](http://jp.techcrunch.com/2014/07/14/20140714raspberry-pi-model-b-plus/)

VPNサーバとして使う際、有線LAN接続であれば別段の問題はありませんでしたが、Wi-fi無線LANアダプタ(USB)で使う場合には、無線LANアダプタに十分な電力を安定的に供給できないという問題が旧モデルにはありました。有志な人々はコンデンサを追加するなどしてこれに対応してきました。
参考リンク: [RaspberryPiにコンデンサ追加で電源強化
](http://blog.bnikka.com/raspberrypi/raspberrypi-capacitance.html)

新しい「Raspberry Pi Model B+」であればコンデンサのハンダ付けなどの作業をすること無く、安定的に動作させられると思います。

# pptpdのインストールと設定
5分あればできると思いますです。

##必要があればシステムを最新の状態に更新する

```console
$ sudo apt-get update
$ sudo apt-get upgrade
```
 
## pptpdのインストール

```console
$ sudo apt-get install pptpd
```
 
##pptpdの設定(自身のIPと接続クライアントへの割り当てIP)

```console
$ sudo vi /etc/pptpd.conf
```

ファイル末尾にコメントアウトされている部分のコメントアウトを外しましょう。
localipはVPNサーバとなる設定中のこの端末のIPを設定してください。もし、は？というかたはとりあえず、ルーターの設定画面からこの端末に固定的にDHCPにてIPアドレスを設定してください。
知っていると思いますが、一応、```$ ifconfig``` でMACアドレスを調べられます。

```/etc/pptpd.conf
localip 192.168.0.2
remoteip 192.168.0.234-238,192.168.0.245
```

## DNS設定
接続してきたクライアントが使うDNSサーバを設定しましょう。
通常の場合、ルータのIPか、適当に```8.8.8.8```でも突っ込んでおくといいかと思います。

```console
$ sudo vi /etc/ppp/pptpd-options
```

```/etc/ppp/pptpd-options
ms-dns 192.168.0.1
```

## 接続クライアント用アカウント設定
pptpにてアクセス出来るユーザアカウントを追加する
パスワードは平文保存のため、注意。

```console
$ sudo vi /etc/ppp/chap-secrets
```

```/etc/ppp/chap-secrets
# User名　　サーバ名　　パスワード　　割り当てIP
hoge　　　pptpd　　　hogehoge　　　*
```

## IPフォワード設定
Linux自体の設定にて、IPフォワードを有効にする(デフォルトでは無効)
宛先アドレスが自分では無いパケットも転送するようにしなければ、VPN経由で接続した端末からのパケットはすべて破棄されてしまう

```console
$ sudo vi /etc/sysctl.conf
```

``` /etc/sysctl.conf
net.ipv4.ip_forward=1 # コメントアウトを外す
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
```
 
# MTU/MRUの設定
この設定をしなくてもマシンによっては繋がるんですが、iOSとかMacとかはぶっちぶっちきれます。っていうか使えないです、はい。デフォルトではどちらも1500設定だったと思います。これが切れる理由はVPNによるトンネリングするため、それに用いるヘッダ情報が多くなり、1500を超過してしまうためです。

```console
$ sudo vi /etc/ppp/options
```

```/etc/ppp/options
mtu 1280
# Set the MRU [Maximum Receive Unit] value to <n> for negotiation.  pppd
# will ask the peer to send packets of no more than <n> bytes. The
# minimum MRU value is 128.  The default MRU value is 1500.  A value of
# 296 is recommended for slow links (40 bytes for TCP/IP header + 256
# bytes of data).
mru 1280
```
余談ですが、mruのコンフィグには上記のように、低速だったら296bytesをおすすめするぜーと書いてあります。

# 次はルーターの設定をしましょう

ルーターは別にあるよ(普通はそうだと思います)という方はルーターのポートフォワード設定をしましょう。

> 一般的な家庭では、ブロードバンドルータの類の下にサーバをぶらさげているかと思います。このように pptpd サーバが LAN の内部にある場合、ポート転送が必要になります。ルータの設定にて TCP の 1723 番ポートと、プロトコルの 47 番を pptpd サーバに転送してください。TCP の 47 番ポートではなく、47 番のプロトコル(GRE)であることに注意してください。
http://d.hatena.ne.jp/MIZUNO/20090927/1254001541

**ここまでで動作するようになります。おめでとう！**


# 動作テスト
iPhone / Android / Mac などから、PPTPプロトコルにて接続してみましょう。
サーバのIPはこの設定したVPNサーバ端末及びルーターのグローバルIP、もしくはDNSを設定してください。
RSA SecureIdとかは設定していないのでオフです。
アカウントとパスワードはさっき設定したものを入れてください。
今回はプロキシなども設定してないので、普通は設定はしなくてよいです。

# 必要な方は、VPNサーバにファイアウォールを設定しましょう
## ufwのインストール(IPTablesでもいいけどね)

```console
$ sudo apt-get install ufw
$ sudo ufw status
```

## 許可するポートの設定
今回はVPNサーバをデフォルトポートの1723にて動かしているので、1723を許可する。
それ以外は各自設定してね。というか、IPTables設定済みの方が多いと思うので、各自設定してね。
sshをallowするの忘れてやっちゃうと***オシマイ***だよ気をつけてね当たり前だけど。

```console
$ sudo ufw allow ssh
$ sudo ufw allow 1723/tcp
```

一応、デフォルトの設定はdenyにしておく

```console
$ sudo ufw default deny
```

## パケットの転送の許可設定
```console
$ sudo vi /etc/default/ufw
```

フォワードポリシーをACCEPTに変更

```/etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"
```

NAT系の設定を追加します

```console
$ sudo vi /etc/ufw/before.rules
```

ファイル先頭に下記行を追加してください。192.168.0.0/24 からのパケットを eth0 に転送するという意味です。
eth0以外のethをお使いの方はもちろん変更してくだい。
何を使ってるかは知ってると思うけど、```ifconfig```コマンドで確認出来ると思いますよ。

```/etc/ufw/before.rules
# NAT Table Rules
*nat
: POSTROUTING ACCEPT [0:0]
# Allow forward traffic from eth0:0 to eth0
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

COMMIT

```

さいごにufwを再起動して設定反映

```sh
sudo ufw disable && sudo ufw enable
```

これでおわりです。お疲れ様！

# 速度測定

ためしにLTE接続したiPhoneで通信してみつつ、```top```してみましたが、ロードアベレージ的にはCPUなどがボトルネックにはなっていないっぽいです。
もちろん、純粋なLTEよりはだいぶ劣りますけどね。


LTE->自宅(100M)->SPEEDTEST_SERVER(iOSアプリ)

- DL: 8Mbpsぐらい
- UP: 400kbpsぐらい

LTE->SPEEDTEST_SERVER(iOSアプリ)

- DL: 12Mbpsぐらい
- UP: 400kbpsぐらい

うん、UPが遅いのはSPEEDTESTのせいですね、はい。

# おわりに
raspberrypiがvpnサーバになりました。おめでとう！
raspberrypiがすごいというよりかは、Linuxなんでもサーバ系のこと出来るよね凄いよねUbuntuはapt-get便利だよねって感じですが、やっぱりなにより、25$で買えてGUIさえも動かせる、ほんとにほんとにほんとに小さいPCであるRaspberryPIが凄いです。

ちなみにデフォルトロケールはen_GBなので、ちょっとGBってレアいよねって思っちゃいました。ja_JPについしちゃいましたけど、日本語でifconfig結果とか出てきちゃうとちょっときもいです。。。