HTTPSのポートしか開いてないローカル環境から、EC2を踏み台(プロキシ)にして、自由に通信する手順
いきなりどこかの建物に缶詰にされたり
スマホを没収されて、モバイルネットワーク環境を使えなくなったり
保護者がネットワーク管理者だったり
入院したりと
この世は様々な理由で、通信の自由さがなくなることがあります(した)
目の前にはPCが1台のみ
せめてWebページを見られれば……と
Chromeを開くと、ちゃんと見られる
……けど、それはPCの繋がってるLANに
プロキシサーバーがあり、そこを経由した場合のみ可能なこと
アクセスするURLはフィルタリングされてて
興味を持ちそうなサイトは、だいたい禁止されてたりする
ネットワーク全体を囲むファイアウォールがあり
SSHとか、VNCとか、RDPとか、Dockerとか
興味を持ちそうなポートは、だいたい禁止されてたりする
脱出したいワケではないので
Webサイトを通じて、助けを求めたり、通報したりに興味はなく
ただ、見たいサイトを見られないことだけを解決したい
使えるポートはHTTPS(443番ポート)のみ
初代ピッコロ大魔王は
悟空の左腕だけを、無事な状態で残してしまったことで
お腹に大きな穴が空いてしまいました
現実も、443番ポートが無事なら
AWSのEC2や、GCPのCompute Engineに入れたLinuxを
踏み台(プロキシ)にすることで、見たいサイトを見られます
そのための手順をメモ
AWSやGCPにアカウントを作る際に、たぶん2段階認証とかで
スマホが必要になるので、そこまでは監禁される前に事前に済ませておくのが無難
監禁後事後に
PCのある部屋で目を覚ましたら
最初にやることは、そのPCを使ってEC2かCompute EngineにLinuxを入れることです
EC2には期間限定で無料、Compute Engineにはずっと無料のプランがあるけど
プロキシ程度の性能は、その無料範囲で問題ないので
Compute Engineのほうが得
EC2やCompute Engineの管理画面は分かりやすいので
迷わずLinuxのインストール、初起動までは行ける
どっちだろうと、Ubuntuを選んどけば無難
めんどいのは初接続からで
フツーはローカルPCの .ssh
ディレクトリに鍵を置いて
権限を400とかにして
ターミナルとかから、ssh
すればイイけど
いまはSSH(22番ポート)が使えないので、その方法はムリ
ただ
EC2にもCompute Engineにも
管理画面から起動できる、ブラウザ上で動くターミナル画面があって
そこから接続できる
Ubuntuにログインできたら
vim /etc/ssh/sshd_config
して、
Port 22
の行を
Port 22
Port 443
のように増やす
22を消しちゃうと、いま使ってるブラウザ上のターミナル画面から
2度と接続できなくなって、詰む危険があるので残す
sudo systemctl restart sshd
で反映させる
これで、HTTPSに使ってる443番ポートで、SSHもできるようになるから
ローカルPCに入ってるターミナルから ssh
で接続可能になる
ローカルPCの
~/.ssh/config
にあらかじめ、接続の設定を書いといてもイイし
そこは編集せず
ssh
に長いオプションを付けて実行してもイイ
その長いオプション内で
OS内の別のコマンドを指定するので、それをあらかじめ入れておく
Ubuntuだったら
netcat-openbsd
とゆーのを apt
で
RPM系だったら
nmap-ncat
とゆーのを yum
で入れるっぽい
私はArchだったので
corkscrew
とゆーのを paru
で入れた
Windowsでも、なんかあると思う
コマンドはこんな感じ
ssh -i ~/.ssh/ec2-key.pem ubuntu@ec2-{グローバルIPをハイフンで繋いだ文字列}.{リージョンのID}.compute.amazonaws.com -p443 -o "ProxyCommand corkscrew {建物内のプロキシのIP} {建物内のプロキシのポート} {グローバルIP} 443"
このうち前半部分は
EC2の管理画面から
ssh -i "ec2-key.pem" ubuntu@ec2-{グローバルIPをハイフンで繋いだ文字列}.{リージョンのID}.compute.amazonaws.com
をコピーできて楽
-p443
の部分は
-p 443
と書いても認識される
これを実行すると
EC2にログインできる
そこまで確認できたら、次は
-L
オプションも足して実験してみる
例えば
ssh -i ~/.ssh/ec2-key.pem ubuntu@ec2-{グローバルIPをハイフンで繋いだ文字列}.{リージョンのID}.compute.amazonaws.com -p443 -o "ProxyCommand corkscrew {建物内のプロキシのIP} {建物内のプロキシのポート} {グローバルIP} 443" -L 59001:localhost:5901
5901はVNCの1画面目のポートだけど
こんなふうにすると、ポートフォワーディングされて
ローカルPCに入れておいたVNCのViewerで
接続先に localhost:59001
って入れると
EC2内のUbuntuのGUIが映る
このVNC上でFirefoxとかを起動すれば
プロキシで見られないはずだった
見たいサイトを自由に見られる
この方法は
あらかじめUbuntuに
LXDEとかXFCEを入れておく必要がある
しかも、素の設定だけだと
Ubuntuのデスクトップは映るけど
ブラウザは
DISPLAY
が見つからない的なエラーで起動にコケるので
~/.bashrc
とかに
XAUTHORITY=$HOME/.Xauthority
export XAUTHORITY
を追加しとく必要もある
そして
そこまでしても、この方法は
microなインスタンスタイプだと、めっちゃ遅くて
使い物にならないので
もっと速い方法が以下
ssh
の -D
オプションを使う
(ダイナミックポートフォワーディング)
ssh -i ~/.ssh/ec2-key.pem ubuntu@ec2-{グローバルIPをハイフンで繋いだ文字列}.{リージョンのID}.compute.amazonaws.com -p443 -o "ProxyCommand corkscrew {建物内のプロキシのIP} {建物内のプロキシのポート} {グローバルIP} 443" -D 1080
実行すると、フツーに ssh
した場合と同じく
Ubuntuにログインしてプロンプトが表示された状態になるのだけど
このSSHのセッションが切れない限り
SOCKSプロキシとしても動作してくれる
あとは
ローカルPC内のWebブラウザを
そのプロキシ経由で接続するように設定するだけ
どのプロキシを使うかの設定は
OS側でも持ってるけど
Webブラウザ側は、OSでの設定をそのまま使うか
独自に設定するかを選べるので
Webブラウザ側で
SOCK v5のプロキシとして
localhost:1080
を指定すればイイ
これで
いつ閉じ込められても
HTTPS(443番ポート)さえ開いていれば
見たいサイトを見られるようになった
Discussion