raspi-zeroW にopenvpnを入れる

# 注意
 osmc(raspi0w)の場合、リブート直後はtunデバイスにIPアドレスが割当されておらずサーバが使えない。openvpnをrestartすると、tunデバイスにIPアドレスが割り当てられサーバが使用可能になる。

# osmc on raspi-zeroW にopenvpnを入れる
[2019/06/08、内部NWへのアクセスを追加](https://qiita.com/harasakih/items/c74e5ac72e9da752ca08)

[参考１](https://qiita.com/moyashimanjyu/items/3ee299acc3081630b1d6)
[参考２](https://www.marbacka.net/blog/openvpn_iphone/)
[CentOS](https://qiita.com/horus19761108/items/9c7879149218d9325c5e)

## install
```
apt-get install -y openvpn easy-rsa
cd /etc/openvpn
mkdir easy-rsa
cd easy-rsa
cp -R /usr/share/easy-rsa/* ./
```

## configation

```bash:/etc/openvpn/easy-rsa/vars
export EASY_RSA="/etc/openvpn/easy-rsa"
export KEY_SIZE=2048
export KEY_COUNTRY="JP"
export KEY_PROVINCE="Kanagawa"
export KEY_CITY="Yokohama"
export KEY_ORG="MyHome"
export KEY_EMAIL="mail@mymail.server"
export KEY_OU="MyOU"
```

### CA証明書
```
cd /etc/openvpn/easy-rsa
cp openssl-1.0.0.cnf openssl.cnf
source ./vars
./clean-all
./build-ca
```

### サーバ証明書
```
./build-key-server server 
A challenge password []: (電話番号を設定)
```

### クライアント証明書
```
./build-key foo
./build-key bar
```
challenge passwordは空白


## DH（Diffie-Hellman key exchange）パラメタ
＊ ３０〜６０分かかる

```
./build-dh
```

## TLS鍵を作成
```
cd /etc/openvpn/easy-rsa/keys
openvpn --genkey --secret ta.key
cp ta.key server.crt server.key dh2048.pem ca.crt /etc/openvpn
```

# OpenVPNサーバの設定ファイルを作成
```
cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
gunzip server.conf.gz
```
## 編集
ipv6化して、外部解放できるポートが限られているので、Listenするポート番号はHomeGWでポートフォワードしたポートに合わせる。

```/etc/openvpn/server.conf
# cat server.conf | grep -v '^[#;]' | grep -v ^\s*$
---
port xxxx
proto udp
dev tun
ca   /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key  /etc/openvpn/server.key
dh   /etc/openvpn/dh2048.pem
server 10.8.0.0 255.255.255.0    # デフォルトのまま
ifconfig-pool-persist ipp.txt    # 固定IP付与（未設定）
push "redirect-gateway def1 bypass-dhcp" # VPN-Clientからのパケットは全てVPN経由
push "dhcp-option DNS 192.168.1.1" # VPNから見て外のDNS
keepalive 10 120
tls-auth /etc/openvpn/ta.key 0   # 0:server 1:client
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log-append  /var/log/openvpn.log
explicit-exit-notify 1
```

## systemctlで起動
```
systemctl restart openvpn
systemctl enable  openvpn
```

## iptablesのポートを開放
exit 0の前に2行追加。xxxxは server.conf で指定したポート。

```/etc/rc.local
iptables -A INPUT -p udp -m state --state NEW -m udp --dport xxxx -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o wlan0 -j MASQUERADE
```

## VPNサーバにするためIPフォワードを有効にします。
```/etc/sysctl.conf
net.ipv4.ip_forward=1
```

## reboot＆NW構成図
<PRE>
      Inter-net
        ||
        ||  Global-address
    [ www.xxx.yyy.zzz ] IPoE-router
    [   192.168.1.1   ]
        ||  DNS#1
        ||
    [  192.168.1.254  ] Home-router
    [  192.168.0.1    ] 
        ||  DNS#2
        ||               192.168.0.0/24
++=======================(Home-NW)=========++
            ||             
 wlan0   [  192.168.0.102  ] VPN-Server 
 tun0    [  10.8.0.1       ] ip-mmasquerade
            ||
            ||               10.8.0.0/24
++=======================(VPN-NW)==========++
      ||             
      ||
  [ 10.8.0.2 - ** ] VPN-Clients

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
  inet 127.0.0.1  netmask 255.0.0.0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
  inet 10.8.0.1  netmask 255.255.255.255  destination 10.8.0.2
wlan0: flags=-28605<UP,BROADCAST,RUNNING,MULTICAST,DYNAMIC>  mtu 1500
  inet 192.168.0.102  netmask 255.255.255.0  broadcast 192.168.0.255

受信先サイト ゲートウェイ  ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0      192.168.0.1   0.0.0.0         UG    0      0        0 wlan0
10.8.0.0     10.8.0.2      255.255.255.0   UG    0      0        0 tun0
10.8.0.2     0.0.0.0       255.255.255.255 UH    0      0        0 tun0
192.168.0.0  0.0.0.0       255.255.255.0   U     0      0        0 wlan0
192.168.0.1  0.0.0.0       255.255.255.255 UH    0      0        0 wlan0

</PRE>