信頼できない・規制があるネットワークにおけるインターネット利便性の向上

#はじめに(ポエム)
先日、日本からほど近い「目覚ましい経済発展を遂げている赤い旗の国」に行ってきました。
インターネットの規制が激しいのは聞いていましたが、出張したのは9月中旬で10月頭にある建国記念の日の影響でインターネットの規制が厳しい状況でした。
そんな状況下では「安全性確保」「規制のない快適なブラウジング」が喫緊の課題になるわけです。
巷ではVPNだったりShadowsocksが流行っておりますが、私が予め用意したOpenVPNは軒並み全滅。Windowsからポート443で用意したSoftetherが使えたくらいでした。
Air SIM(https://www.amazon.co.jp/dp/B079TPLNKW/ref=cm_sw_r_tw_dp_U_x_fFWTDbR9XHAZK) (【AIRSIM正規代理店】AIRSIMを始めよう：ATLIKE 株式会社)を買えばスマートフォンの通信はまあ解決するわけですが、大容量の通信はできないわけです。
私は"一応にも"エンジニアなので、どうにかVPNなりを使いたいと思ったりもするわけであります。

赤い旗の国出身の上司にVPNやShadowsocksをどうにか使う術はないのかと相談したところ
「それはもう古い」
と言われる始末。いや、出張前に言ってくれよ・・・・

そこで上司が教えてくれたのが本稿で紹介するものになります。
上司曰く「このサーバを建てて1年半程度は某国政府に遮断されていない」とのこと。
本稿は帰国後の投稿となるため「実際に使えるか」は未検証ですが、
まだ日本語の記事が見当たらないので共有を兼ねて構築してみたのを書き記します。

 - 実際に赤い旗の国での動作検証はしておりません(上司は動作した)(動作報告お待ちしております)
 - 利用するソフトウェアの安全性については保証できません
 - お約束ですが「自己責任」でご利用ください(本稿に従い利用される場合、起こるすべての事象に対して筆者は一切の責任を負わないことに同意されたとみなします)


動作環境
 - Cent OS 7.5
 - Conoha VPS (東京リージョン、メモリ512MBプラン)
 - Nginx(Port 443開放済)
 - Let's Encrypt(発行済みとの前提で進めます)
 - V2 rayN
 - ドメイン:zhangtest.com(架空)
 -  - SELinux無効、 Root環境において実行

Conoha VPSの選定理由ですが、
 - 課金が1時間あたりであること
 - 仮に通信がブロックされたとしても、スナップショット機能で違うIPアドレスで同じサーバーが瞬時に構築できること
 - (常識的な範囲で)転送量無制限
のためです。Conohaである必要はありませんし、Conohaの宣伝でもありませんので紹介等リンクはございません。
VPSの比較において非常に有益であるWebサイトがあるので、自分にあったVPSを選択してください。

VPS性能比較最大サイト VPS Hikaku.com： https://vpshikaku.com/

VPSの契約、Port開放、Let's Encrypt(証明書取得)、SELinux無効等については本稿では解説しません。

#初期設定

```
#OSアップデート無効(事故防止)
echo exclude=kernel* centos* >> /etc/yum.conf

#いろいろUpdateしてインストール
yum -y update 
yum -y install vim nginx
```

#v2ray サーバー構築
```
#v2rayサーバ構築
bash <(curl -L -s https://install.direct/go.sh)

#v2Ray 設定
#idとpathは各環境ごとに書き換える。おそらくなんでもよいがNginx構築と認証時に使う。
cat >/etc/v2ray/config.json  <<"EOF"
{
"log" : {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "debug"
  },
  "inbounds": [
    {
    "port":10099,
      "listen": "127.0.0.1",
      "tag": "vmess-in",
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
          "id":"52e3h685-gug0-139d-4469-36df19h2fv1c",
          "alterId":64
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path":"/e57301r2/"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": { },
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": { },
      "tag": "blocked"
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": [
          "vmess-in"
        ],
        "outboundTag": "direct"
      }
    ]
  }
}
EOF

#フォルダ作成
mkdir -p /var/log/v2ray/

#起動
systemctl start v2ray 

```

##Nginx 構築

```
#backup
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org

cat >/etc/nginx/nginx.conf   <<"EOF"
user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  zhangtest.com;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#

        server {
            listen 443 ssl http2;
            server_name zhangtest.com;

            ssl_certificate "/etc/letsencrypt/live/zhangtest.com/fullchain.pem";
            ssl_certificate_key "/etc/letsencrypt/live/zhangtest.com/privkey.pem";


            ssl_protocols           TLSv1.2 TLSv1.1 TLSv1;
            ssl_ciphers             HIGH:!aNULL:!MD5;


            location /e57301r2/ {
            proxy_pass http://127.0.0.1:10099;
            proxy_redirect          off;

            proxy_http_version      1.1;

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';

            proxy_set_header    Host                $http_host;
            }
        }
}
 

#起動
systemctl start nginx
```

#Androidから接続
クライアントソフトウェアは主要なOS向けに多数ありますが、
本稿ではAndroidにて検証を行いました。

Kitsunebi： https://play.google.com/store/apps/details?id=fun.kitsunebi.kitsunebi4android&hl=ja

ダウンロード後、起動し
画面右上の「＋」をタップ→「Add Endpoint」をタップ→「Manual」をタップ→下記画像の通り、上記にて設定したものを設定

![Screenshot_2019-11-17-14-33-41-853_fun.kitsunebi.kitsunebi4android.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356296/f04efd38-813a-9a47-69c5-dd6d750b7323.png)

完了後、画面右上の「SAVE」をタップ

最初の画面に戻るので、作成されたプロファイル(本稿の場合は「zhangtest.com」)があるので一度タップして選択し、
画面右下の「▶(三角、再生マーク)」をクリックする。(サーバへの接続が開始されます)
VPNの接続のポップアップがでてきたらOK等をタップする。

https://ugtop.com/
等で、サーバへの接続前後で自分のIPアドレスが変化したかご確認ください。
本稿の場合、ConohaのIPアドレスに変化し、有効性を確認しました。

#おわりに

なお、サーバの構築が完了していると、ブラウザで該当サーバにアクセスすると
![Welcome to CentOS - Google Chrome 2019_11_17 14_49_34 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356296/7e8ad1f5-c434-b0d9-89ea-f0f477630448.png)

と、普通にWebサイトが表示されます。
ただ、通常(？)は正しく構築すると電卓が表示される(しかも電卓としてちゃんと動く！)ようです。
ゆえに、無責任な発言ですがどこか間違っている可能性があるので、もし見つかりましたらコメント等いただけるとうれしいです。

あまり有名になっても困ること、某国政府等に見つかって規制が厳しくなっても困るため
具体的な国・地域の名前等には言及しておりません。お察しください。

サーバのソフトウェア、クライアントのアプリも実態についてはきちんと確認していないゆえに、
信頼性については保証しません。自己責任で。
自己責任。
なにがあっても自己責任。

#追記(2019/12/26)
某オフ会にて本稿の内容を発表しました。
その後、協力者2名によって現地で使えることが確認されました。(2019年11月中旬)
1名には私が構築したサーバーを提供し、今の所使えなくなったという報告を受けていないので某国共産党にバレずに使えているのだと思います。