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


7番のサーバを選ぶとこ

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

環境

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

手順

簡易版

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

通常版

  1. openvpn インストール: % sudo apt-get install openvpn
  2. スクリプト取得 & 実行属性
    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

    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でエンコードされた設定がくっついてる
    http://www.vpngate.net/api/iphone/
  • base64 -d: でコード
  • column: csvをきれいに整形
  • less: -N 行番号, -S(--chop-long-lines) 長い行をラッピング。左右のカーソルキーでうごく
    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。

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