[メモ] (らずぱい)VPN Gateへ簡単接続スクリプト (OpenVPN使用)

７番のサーバを選ぶとこ
![vpngate1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/02ef9e7e-c953-4ae0-28ea-41e2c1189c1f.png)

\# githubにファイル置きました: https://github.com/mt08xx/vgc

## 環境
- Raspberry Pi (今回は3のEthernetポートでネット接続)
- (追記) Ubuntu 16.04 server でも確認しました。

## 手順
### 簡易版

```txt:こぴぺする
sudo apt-get install openvpn -y 
wget https://raw.githubusercontent.com/mt08xx/vgc/master/vgc -O ./vgc
chmod +x ./vgc 
./vgc update
```
- サーバ一覧がでてくるので、よさそうなやつの番号を覚えて、<br>`q`をおして、`Enter #`のプロンプトで、番号入れて `[Enter]`
- コンソールが占領されてしまうので、別ウインドウを開くとか、byobuをつかうとかする。

### 通常版
1. openvpn インストール: `% sudo apt-get install openvpn`
2. スクリプト取得 & 実行属性<br>
 `wget https://raw.githubusercontent.com/mt08xx/vgc/master/vgc -O ./vgc ; chmod +x ./vgc`
3. `./vgc` 実行
4. 鯖リストがless表示されるので、qを押して抜けたら、番号を入れて、[ENTER]
5. 接続しにいくはず
6. 切断は
    - フォアグランドなら、`CTRL-C` で。（いいのか？)
    - バックグラウンドで起動したら、`sudo killall openvpn`
7. 確認できたら
    - `OPT_DAEMON=--daemon`にすると、バックグラウンドで実行される？
    - `./vgc update` で、鯖リストのアップデート。(`OPT_UPDATE=update`で毎回アップデートする)
8. openvpn起動中にスクリプト呼んで接続しようとすると、切断(`killall openvpn`)します。


\# vgc = VpnGate Connect


## その他

- daemonで起動時、うまく接続できなかった場合はどうしたらいいだろうか。
- `base64: invalid input` ぉ?!
- log
![vpngate1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/02ef9e7e-c953-4ae0-28ea-41e2c1189c1f.png)

    ```txt:log(英国時間になっとる...)
     20 vpn764604678   98.148.134.172   397647  30   21613015   United States
     21 vpn978276515   121.243.46.164   374020  10   9880742    India
     22 vpn674770516   87.138.118.198   348185  17   10658117   Germany
     23 vpn973108027   180.252.102.89   337768  24   11555931   Indonesia
Enter #7
base64: invalid input
Fri Jun  3 01:34:19 2016 OpenVPN 2.3.4 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jan 23 2016
Fri Jun  3 01:34:19 2016 library versions: OpenSSL 1.0.1k 8 Jan 2015, LZO 2.08
Fri Jun  3 01:34:19 2016 WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.
Fri Jun  3 01:34:19 2016 Socket Buffers: R=[163840->131072] S=[163840->131072]
Fri Jun  3 01:34:19 2016 UDPv4 link local: [undef]
Fri Jun  3 01:34:19 2016 UDPv4 link remote: [AF_INET]219.164.171.54:1990
Fri Jun  3 01:34:19 2016 TLS: Initial packet from [AF_INET]219.164.171.54:1990, sid=c471f658 60928f48
Fri Jun  3 01:34:19 2016 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Fri Jun  3 01:34:19 2016 VERIFY OK: depth=0, CN=avdh9.com, O=59c8ehhbt fx0s72, C=US
Fri Jun  3 01:34:19 2016 Data Channel Encrypt: Cipher 'AES-128-CBC' initialized with 128 bit key
Fri Jun  3 01:34:19 2016 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Fri Jun  3 01:34:19 2016 Data Channel Decrypt: Cipher 'AES-128-CBC' initialized with 128 bit key
Fri Jun  3 01:34:19 2016 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Fri Jun  3 01:34:19 2016 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 2048 bit RSA
Fri Jun  3 01:34:19 2016 [avdh9.com] Peer Connection Initiated with [AF_INET]219.164.171.54:1990
Fri Jun  3 01:34:22 2016 SENT CONTROL [avdh9.com]: 'PUSH_REQUEST' (status=1)
Fri Jun  3 01:34:22 2016 PUSH: Received control message: 'PUSH_REPLY,ping 3,ping-restart 10,ifconfig 10.211.1.45 10.211.1.46,dhcp-option DNS 10.211.254.254,dhcp-option DNS 8.8.8.8,route-gateway 10.211.1.46,redirect-gateway def1'
Fri Jun  3 01:34:22 2016 OPTIONS IMPORT: timers and/or timeouts modified
Fri Jun  3 01:34:22 2016 OPTIONS IMPORT: --ifconfig/up options modified
Fri Jun  3 01:34:22 2016 OPTIONS IMPORT: route options modified
Fri Jun  3 01:34:22 2016 OPTIONS IMPORT: route-related options modified
Fri Jun  3 01:34:22 2016 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Fri Jun  3 01:34:22 2016 ROUTE_GATEWAY 10.10.0.1/255.255.248.0 IFACE=eth0 HWADDR=de:ad:be:af:c0:ff
Fri Jun  3 01:34:22 2016 TUN/TAP device tun0 opened
Fri Jun  3 01:34:22 2016 TUN/TAP TX queue length set to 100
Fri Jun  3 01:34:22 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Fri Jun  3 01:34:22 2016 /sbin/ip link set dev tun0 up mtu 1500
Fri Jun  3 01:34:22 2016 /sbin/ip addr add dev tun0 local 10.211.1.45 peer 10.211.1.46
Fri Jun  3 01:34:22 2016 /sbin/ip route add 219.164.171.54/32 via 10.10.0.1
Fri Jun  3 01:34:22 2016 /sbin/ip route add 0.0.0.0/1 via 10.211.1.46
Fri Jun  3 01:34:22 2016 /sbin/ip route add 128.0.0.0/1 via 10.211.1.46
Fri Jun  3 01:34:22 2016 Initialization Sequence Completed
```

## 技術的説明 (ggって、こぴぺ..)
- VPNGate鯖一覧csvファイルがダウンロードできて、各行に1鯖の情報、さらにbase64でエンコードされた設定がくっついてる
<br>http://www.vpngate.net/api/iphone/
- `base64 -d`: でコード
- `column`: csvをきれいに整形 
- `less`: -N 行番号, -S(--chop-long-lines) 長い行をラッピング。左右のカーソルキーでうごく
<br>https://stackoverflow.com/questions/1875305/command-line-csv-viewer
- `tail -n +3` :3行目以降取得
- `cut -d ',' -f 15` : ','で区切って、15番目のフィールドを取得


## 参考：https://github.com/mt08xx/vgc
githubにおきました。
- 下のbashスクリプトを作って、実行属性をつける。`cat > ./vgc; chmod +x ./vgc`で、こぴぺして、CTRL-d。


```bash:vgc
#!/bin/bash
# http://qiita.com/mt08/items/9f357be12c126d8976b3

OPT_DAEMON=  # --daemon
OPT_UPDATE=non_update

VPNGATE_CONF=/etc/openvpn/vpngate.conf
USER_VPNGATE=/etc/openvpn/user_vpngate.txt
VPNGATE_CSV=~/.vpngate.csv
CMD=$1
CMD=${CMD,,} #lowercase

if [ ! -z $CMD ] ; then
    if [ $CMD == "update" ] ; then OPT_UPDATE=update ; fi
    if [ $CMD == "clean" ] ; then sudo rm $USER_VPNGATE $VPNGATE_CSV $VPNGATE_CONF; echo cleaned ; exit ; fi
fi


function create_userpassfile() {
    echo -e "vpn\nvpn" | sudo tee $USER_VPNGATE
    sudo chmod 700 $USER_VPNGATE
}

function download_vpngate_csv() {
    wget http://www.vpngate.net/api/iphone/ -O - | tail -n +3 > $VPNGATE_CSV
    return 0
}


#
if [ -e $USER_VPNGATE ]; then
    echo found $USER_VPNGATE
else
    create_userpassfile
fi

#
if [ ! -e $VPNGATE_CSV ] || [ $OPT_UPDATE == "update" ] ; then
    download_vpngate_csv
else
    echo found: $VPNGATE_CSV
fi


# Show Server List
cat $VPNGATE_CSV | cut -d ',' -f 1-10 | column -s, -t  | less -#2 -N -S

# Select Server
echo -n "Enter #"
read
sudo rm -f $VPNGATE_CONF
cat $VPNGATE_CSV | sed -n ${REPLY}P | cut -d ',' -f 15 | base64 -d | sed -e "s/#auth-user-pass/auth-user-pass\ \/${USER_VPNGATE//\//\\\/}/g" | sudo tee $VPNGATE_CONF > /dev/null

# openvpn is running ???
pidof openvpn > /dev/null ; if [ $? -eq 0 ]; then sudo killall openvpn ; sleep 5; fi

# Connect
sudo openvpn ${OPT_DAEMON} $VPNGATE_CONF


```