DD-WRTにOpenVPNサーバーを立てる

はじめに
========================================
DD-WRTにOpenVPNサーバーを立てたときのメモ。
昔の記録の転載なので、間違ってるところもあるかも。

DD-WRT自体の導入方法は、Webにわかりやすい解説がゴロゴロ転がっているので、そちらを参照してください。

前提
----------------------------------------
- 作業OS : Windows 7 64bit
- Hardware : Buffalo WZR-HP-AG300H
- Firmware : DD-WRT v24-sp2 (12/22/14) std


参考
----------------------------------------

- [DD-WRTとiPhone5sでVPNの構築（OpenVPN）｜チョコボール室井の報告書](http://ameblo.jp/chocoball-muroi/entry-11788301407.html)


DDNS設定
========================================
[ieServer.net]でdomain.myhome.cxというドメインを取得し、設定が済んでいることを前提とします。設定値についてはDD-WRT設定 基本タブを参照。

[ieserver.net]:http://www.ieserver.net/

証明書の作成
========================================

OpenVPNユーティリティのインストール
----------------------------------------
[ダウンロード | OpenVPN.JP](https://www.openvpn.jp/download/)からインストーラをダウンロードして、フルインストール

準備
----------------------------------------
管理者としてコマンドプロンプトを実行する。
`easy-rsa\vars.dat`が生成される。

```text
cd /d %ProgramFiles%\OpenVPN\easy-rsa
init-config
```

vars.batを修正する。（内容は適当）

```text
set KEY_SIZE=2048
set KEY_COUNTRY=JP
set KEY_PROVINCE=Tokyo
set KEY_CITY=Setagaya
set KEY_ORG=hogehoge
set KEY_EMAIL=hoge@hoge.com
set KEY_CN=hoge
set KEY_NAME=hoge
set KEY_OU=hoge
set PKCS11_MODULE_PATH=hoge
set PKCS11_PIN=1234
```

以下を実行。

```text
vars
clean-all
```

認証局証明書と鍵作成
----------------------------------------

```text
mkdir c:\etc\ssl
copy openssl-1.0.0.cnf c:\etc\ssl\openssl.cnf
build-ca
```

CommonNameだけ`hoge-ca`と入力。あとはそのままEnter。
`easy-rsa\keys\`に以下のファイルが生成される。

- ca.crt
- ca.key


サーバー証明書と鍵作成
----------------------------------------

```text
build-key-server server
```

CommonNameだけ`hoge-sv`と入力。あとはそのままEnterまたはy。
`easy-rsa\keys\`に以下のファイルが生成される。

- server.crt
- server.key
- server.csr


セキュリティの強化
----------------------------------------

```text
build-dh
```

`easy-rsa\keys\`に以下のファイルが生成される。

- dh2018.pem
- 01.pem


TLS-auth鍵生成
----------------------------------------
```text
cd %ProgramFiles%\OpenVPN\bin
openvpn --genkey --secret ta.key
```

`OpenVPN\bin\ta.key`が生成される。


クライアントの作成
========================================

クライアント用鍵生成
----------------------------------------
下記は`client1`を追加する場合。クライアントごとに任意に変更する。
初めに2回パスワードを入力、CommonNameは`client1`と入力。あとはそのままEnterまたはy。

```text
build-key-pass client1
```

`easy-rsa\keys\`に以下のファイルが生成される。

- client1.crt
- client1.key
- client1.csr
- 02.pem


クライアント用設定ファイルの作成
----------------------------------------
```text:client1.ovpn
emote domain.myhome.cx 443
client
remote-cert-tls server
dev tun0
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
float
cipher AES-256-CBC
comp-lzo
tls-client
key-direction 1
ca ca.crt　# または<ca>ca.crtのBEGIN~ENDまで</ca>
cert client.crt　# または<cert>client.crtのBEGIN~ENDまで</cert>
key client.key　# または<key>client.keyのBEGIN~ENDまで</key>
tls-auth ta.key　# または<tls-auth>ta.keyのBEGIN~ENDまで</tls-auth>
```

DD-WRTの設定
========================================
OpenVPNサーバーの設定
----------------------------------------
ネットワークタブ > PPTPサーバー/クライアント > OpenVPN Server/Client

| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| OpenVPN | [x] 有効 [ ] 無効 |  |
| Start Type | [x] WAN Up [ ] System | WANが起きたら開始 |
| Config as | [x] Server [ ] Daemon |  |
| Server mode | [x] Router(TUN) [ ] Bridge(TAP) |  |
| Network | 10.16.0.0 | VPNセグメントの<BR>ネットワークアドレス |
| Netmask | 255.255.255.0 | VPNセグメントの<BR>サブネットマスク |
| ポート | 433 | VPNアクセスする際のポート |
| Tunnel Protocol | UDP | VPNアクセスする際の<BR>プロトコル |
| Encryption Chiper | AES-256 CBC |  |
| Hash Algorithm | SHA1 |  |
| Advanced Options | [x] 有効 [ ] 無効 |  |
| TLS Chiper | None |  |
| LZO Compression | Yes |  |
| Redirect default Gateway | [ ] 有効 [x] 無効 |  |
| Allow Client to Client | [ ] 有効 [x] 無効 |  |
| Allow duplicate cn | [ ] 有効 [x] 無効 |  |
| Tunnel MTU setting | 1500 |  |
| Tunnel UDP Fragment | （空欄） |  |
| Tunnel UDP MSS-Fix | [ ] 有効 [x] 無効 |  |
| Public Server Cert | server.crtの中身をコピペ | |
| CA Cert | ca.crtの中身をコピペ | |
| Private Server Key | server.keyの中身をコピペ | |
| DH PEM | dh2048.pemの中身をコピペ | |
| TLS Auth Key | ta.keyの中身をコピペ | |

### Additional Config
```bash
# packets to 192.168.1.0/24 will be sent to this server
push "route 192.168.1.0 255.255.255.0"

# tell where DNS server is
push "dhcp-option DNS 192.168.1.254"

# send ping constantly
keepalive 10 120

# use tun0 device
dev tun0
```


Firewall, MASQUARADEの設定
----------------------------------------
管理タブ > コマンド実行タブ > Firewallスクリプト

```bash
# open 443/UDP
iptables -I INPUT 1 -p udp --dport 443 -j ACCEPT

# accept reception/forwarding from VPN
iptables -I INPUT 1 -i tun0 -s 10.16.0.0/24 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -s 10.16.0.0/24 -j ACCEPT

# masquerade
iptables -t nat -I POSTROUTING 1 -o br0 -s 10.16.0.0/24 -j MASQUARADE
```

DNSMasqの設定
----------------------------------------
OpenVPNクライアントからの接続時、ローカル同様の名前解決ができるよう、下記2行を追加。


ネットワークタブ > サーバー/サービスタブ > Additional DNSMasq Options

```text
interface=tun0
no-dhcp-interface=tun0
```

クライアントを追加するとき
========================================
クライアント用鍵の生成
----------------------------------------

`easy-rsa\keys\`に「証明書の作成」で作成した各種ファイルが存在する状態で、以下を実行。

```text
cd /d %ProgramFiles%\OpenVPN\easy-rsa
build-key-pass client2
```

クライアント用設定ファイルの作成
----------------------------------------
上記参照