中国にプロキシ立ててWebコンテンツがどう見えているかを日本から確認してみた

#モチベーション
中国では金盾、いわゆるグレートファイヤーウォールにより、中国法上違法なコンテンツへのアクセスがフィルタさていますが、その「ブラックリスト」に何がリストされているのか中身が公開されていません。一般論としてはGoogleやYoutubeの閲覧が禁止されていると言われてますが、実際のところどうなんだでしょう。中国からアクセスしてみて検証してみましょう。

#方法
##方法1 中国のProxyに直接続（廃案）
中国(Alibaba Cloud上海)にproxyを立て、日本からブラウザーの設定でそのプロキシのグローバルIPを設定して接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/726c5f15-87e4-96bf-a6c3-73150e564cae.png)
試してみましたが、ものすごく遅い、もしくは頻繁に切断されます。因みにsshは安定的に接続できていたので、特定のポート若しくはより上位レイヤ情報でフィルターされている可能性があります。ん? sshは安定？という訳で次の案は・・・
##方法2 中国にProxy立ててSSH port forwardingで接続（採用）
sshが安定しているということは、中国のプロキシへの接続をsshに乗せると接続できるはずですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/b49ba8aa-1eca-4757-02dc-85b0efbc168c.png)

##ssh port forwardingとは
いくつかの接続形態がありますが、ここではPCのローカルのTCP/33128への接続を、SSHで暗号化されたトンネルを用いてプロキシサーバのローカルホストのTCP/3128へそのままつなげます。ちなみにTCP/3128は代表的なオープンソースのプロキシサーバであるsquidのデフォルトのポートです。
ブラウザのようなアプリケーションからしてみれば、スタティックなDestination NATのように働いていて、ローカルのTCP/33128にアクセスしていますが、実はNATされていてプロキシサーバも動いているSSHサーバのTCP/3128と接続するような動きをします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/75e48599-0152-0d0e-183d-c8af503edd98.png)

##準備

####1.中国に設置してあるサーバ、或いはVM
中国にはかなり多くのパブリッククラウドがありますが、ほとんどが中国人以外の人が使用しようとすると中国の電話番号を求められたり、IDカードの番号を求められたり、クレジットカードが使えず、AlipayやWechatpayでしか決済できなかったりなどハードルが非常に高いです。裏技的な方法がないわけではないのですが、**Alibaba Cloud**は普通の日本人が中国のパブリッククラウドを利用できる非常に数少ない選択肢の一つです。私の知る限りTencent Cloudが唯一の代替案になります。中国の３大ネット企業(**BAT**:**B**aidu,**A**libaba,**T**encent)の残り1つのBaidu配下のBaidu Cloudは、残念ですが中国国民に付与されるIDカードの番号が必須となってしまいました。無料枠でテストするならAlibabaCloud一択です。この実験の範囲なら無料クーポンの範囲でも行けるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/08e4f565-f668-419c-9e4d-16b7c77e7482.png)

https://jp.alibabacloud.com/campaign/coupon-freetrial

####2.PC
ブラウザとsshクライアントが入れば何でもいいのですが、ここではwindows/Chrome/Teratermを例にあげます。

#設定
##中国のパブリッククラウドの設定
仮想サーバを作成し、squidをインストールします。以下はubuntu16の例です。特別な設定は不要です。

```
$sudo apt update
$sudo apt install squid
#自動的に起動しますが、念のため
$sudo service squid restart
```

設定ファイル`/etc/squid/squid.conf`はデフォルトのまま変更していませんが、squidがインストールされたときの初期値としてコメント行以外はこんな感じの設定になっていました。

```bash
$sudo cat /etc/squid/squid.conf | grep '^[^#]'
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320
```

##PC側の設定
SSHクライアントならなんでもいいのですが、ここではTeratermを使います。ダウンロードはこちらから。
https://ja.osdn.net/projects/ttssh2/

普通にSSHで先ほどの中国のVMへ接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/2a59697d-bf22-3f87-afc8-cfd9df13b42e.png)


設定＞SSH転送を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/a8f22e74-b296-3dc5-b0b1-d0ccc98c20cd.png)

「ローカルのポート」はブラウザがアクセスするPCローカルのポートで、ブラウザからはProxyのポートに見えます。ここでは33128を入力します。「ポート」は実際に接続するSSHサーバのポートで、ここではSSHとSquidは同一ホストなので、リモート側ホスト未入力、ポートはSquidのサービスポートである3128を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/96fcd3d7-b887-b7fd-409a-bb594879fdad.png)



ブラウザのプロキシの設定でローカルホスト33128を指定します。このポートへの接続はSSHトンネルを通してSSHサーバのSquidがListenしているTCP/3128へ接続されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/8cdf1a3e-5b70-0aed-24e3-1231d38ab9d7.png)


#結果
##できなくなったこと
Yahoo!Japan は開けるが、ものすごく遅い。そして検索はできない
https://www.yahoo.co.jp/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/d084fa1d-e0d2-05d7-618b-a5700d96bfa1.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/6c728454-852f-b622-1118-35b443b1f65f.png)


Google/Youtube/Facebookは開けない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/13fcadaf-a4b1-ff95-fe28-2d7985c02177.png)

##できるようになったこと
爱奇艺や优酷のような動画サイトで特に日本のドラマやアニメのコンテンツに普通に日本から中国のプロキシを経由しないで接続しようとすると普通には閲覧できませんでした。この制限がプロキシ経由だと消えて自由に閲覧可能になります。
下記はその制限の例です。爱奇艺では「著作権の問題で、あなたのいる地域は見れません」的なことが書いてあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/5b806616-dbc9-3bff-443e-571b49bea8cc.png)

优酷では「セキュリティ上の理由によりログインしてください」と出ます。アカウントを作成するためには携帯電話の電話番号（SMS認証用）や中国のAlipayやWechatと紐づける必要がありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/a6634a63-7ee5-aee6-fbeb-4958ccf4faf4.png)

中国のプロキシ経由で接続すると上記メッセージは出ず、簡単に閲覧できます。コンテンツ屋さんのポリシーなのでグレートファイヤーウオールとは無関係ですね。
＊適法性を確認できないので、画面キャプチャは控えます。

今回は趣味の世界なので直SSHで接続しましたが、業務で自社コンテンツが中国からどう見えているかチェックしたり、違法に中国で公開されていないかを調べることを業務としてやるなら、SSHといえども日本と中国の間のインターネット品質はやっぱり不安定で、上位ISPによっては使い物にならない品質だったりします。そんな場合は帯域保証型の閉域ネットワークである**CEN（Cloud Enterprise Network）**を使うのが選択肢に入ってきます。3万円強で中国と日本の間の帯域2Mbps/月を確保できるし、2Mbpsもあれば普通の動画はみれるのではないでしょうか。

**お手軽にグローバルネットワークを構築！Cloud Enterprise Network (CEN) について**
https://techblog.sbcloud.co.jp/2018/08/01/cen-introduction/

構成例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/83093f60-03d7-e7d6-e274-f766f6a8cb67.png)


#その他
##金盾のDNSポイズニング機能について
金盾には正常のDNS名前解決の前に間違ったDNSレスポンスを返して正常な接続を阻害する機能もあります。今中国のサーバでテストしてみたらごくまれに正しいレスポンス返すようです。100%ブロックする必要はなくてユーザに使えないと思わせる程度で十分ということでしょうね。
`www.google.com`を引くとfacebookのIPが返ってきました。雑なようで実は合理的？

```
$ dig www.google.com @8.8.8.8
<省略>
;; ANSWER SECTION:
www.google.com.         116     IN      A       31.13.72.1
<省略>

$ whois  31.13.72.1
<省略>
% Information related to '31.13.72.0 - 31.13.72.255'
% Abuse contact for '31.13.72.0 - 31.13.72.255' is 'domain@fb.com'
inetnum:        31.13.72.0 - 31.13.72.255
netname:        LHR2
descr:          Facebook
country:        GB
<省略>
```

IPアドレスのフィルタリングでは、ホスト名ベースのwebの仮想ホストの場合、違法なホスト名が確認できた全てのIPがブロックさてれしまうので、合法なコンテンツもフィルタしてしまいます。そうするとほとんどのCDN経由のコンテンツが見えなくなります。上位レイヤを見ようにもTLSで隠されてしまえばわかりません。というわけで、技術的には理にかなった実装ですね。乱暴に言えば、全部フィルタしてしまえばいいだけの話ではありますが、そうしないということはそこまではインターネットから切り離したくないという思いもあるんでしょうね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/aa022526-274d-0931-8e41-9728000b597c.png)


##最後に
これは私の趣味の世界です。所属するどんな団体の考え方も全く反映していません。