TP-LINK WR841N による OpenVPN ルータの構築

# はじめに

ServersMan@VPS 上に OpenVPN サーバを動かして利用している．
便利だけれども，毎回接続処理が面倒で，Chromecast も利用できない．

外接ルータの配下にOpenVPN兼無線ルータを作ればいいのでは？ということでやってみた．

調べたところ，以下の構成が安くて簡単で面白そうだったので，これで行く．

TP-LINK WR841N + OpenWrt + OpenVPN -> Serverman VPS + OpenVPN の環境に
ipod touch と chromecast をつないで Hulu が視聴できる環境を作る．

TP-LINK WR841N は安くて(£13で購入) OpenWrt が利用できるけれど，Flash が 4MB しかないので，OpenVPN はそのままではインストールできない．
メモリは32MBあり，tmpfs 上に展開することはできるので起動スクリプトで毎回インストールするという方法があったので，それを利用してみる．

# 参考サイト
http://www.vesiluoma.com/development-projects/how-to-install-openwrt-to-tp-link-wr841nd/
https://blog.zauberstuhl.de/openwrt_tplink_openvpn/

- パス関連が異なる
- liblzo のインストールが必要
- kmod-tun のインストールが必要
- MASQUARADE の設定が必要

# TFTP を使ったリカバリー方法

失敗した時はこれで回復できる

Bricked TP-Link WR841N/ND Recovery Unbrick Without A Serial Connection
https://www.youtube.com/watch?v=0k1sxwX5pMk

# 事前準備

## 管理画面にログインして Firmware のバージョンを確認する
## Support Web から該当の Firmware のイメージをダウンロードする
## ファイル転送用に WinSCP をインストール
## OpenWrt のサイトからイメージをダウンロード

- OpenWrt のイメージ
　openwrt-15.05-ar71xx-generic-tl-wr841n-v9-squashfs-factory.bin

# OpenWrt のインストール
- login
- System Tools - Firmware Upgrade

# 初期設定

- telnet で 192.168.1.1 へ接続
- 'passwd' コマンドでパスワードを設定
- ssh, user -> root, pass -> xxx

# 設定

## Network 関連他

```
Hostname: OpenWrt
Timezone: UTC

WAN:  192.168.0.254/24
GW 192.168.0.1
DNS: 8.8.8.8,8.8.4.4

LAN: 192.168.1.1/24

WIFI
　SSID: OpenWrt
　Mode N, Channel Auto, Width 40MHz
　Security: WPA2 PSK(CCMP:AES)

DHCP
```

firewall の設定で forwarding が reject になっているので，accept にする

## OpenVPN 関連

```
# opkg install kmod-tun
# mkdir /etc/openvpn
```

- インストールスクリプトを winscp でコピー
- openvpn の設定ファイルを /etc/openvpn へコピー

```
 % /etc/init.d/openwrt-openvpn start
 % /etc/init.d/openwrt-openvpn enable
```

```bash:openwrt-openvpn
#!/bin/sh /etc/rc.common

START=99

. /etc/profile

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/libopenssl/usr/lib:/tmp/lilzo/usr/lib
export PATH=$PATH:/tmp/openvpn/usr/sbin

install() {  
  local OVPNPATH=/tmp/openvpn
  local OSSLPATH=/tmp/libopenssl
  local LLZOPATH=/tmp/liblzo
  [ ! -d ${OVPNPATH} ] && mkdir ${OVPNPATH}
  [ ! -d ${OSSLPATH} ] && mkdir ${OSSLPATH}
  [ ! -d ${LLZOPATH} ] && mkdir ${LLZOPATH}
  command opkg update || exit 1
  # install openvpn
  cd ${OVPNPATH}
  tar xzf $(opkg download openvpn-openssl |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
  tar xzf data.tar.gz
  # delete unnecessary things (save space)
  rm -f pkg.tar.gz data.tar.gz control.tar.gz debian-binary getopenvpn.sh
  # install libopenssl
  cd ${OSSLPATH}
  tar xzf $(opkg download libopenssl |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
  tar xzf data.tar.gz
  # delete unnecessary things (save space)
  rm -f control.tar.gz debian-binary data.tar.gz
  # install liblzo
  cd ${LLZOPATH}
  tar xzf $(opkg download liblzo |grep Downloaded |cut -d\  -f4 |sed '$s/.$//')
  tar xzf data.tar.gz
  # delete unnecessary things (save space)
  rm -f control.tar.gz debian-binary data.tar.gz
}

start () {  
  # lvl 99 is not enough the script is too
  sleep 10 # fast for the install step
  install # setup openvpn and libssl
  command openvpn --writepid /tmp/openvpn/ovpn.pid --daemon --config /etc/openvpn/client.conf

  sleep 30 

  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o tun0 -j MASQUERADE
}

stop() {  
  PIDOF=$(ps |egrep openvpn |egrep  -v grep |awk '{print $1}')
  kill ${PIDOF}
}
```