🕳️

HTTPSのポートしか開いてないローカル環境から、EC2を踏み台(プロキシ)にして、自由に通信する手順

2023/08/09に公開

いきなりどこかの建物に缶詰にされたり

スマホを没収されて、モバイルネットワーク環境を使えなくなったり

保護者がネットワーク管理者だったり

入院したりと

この世は様々な理由で、通信の自由さがなくなることがあります(した)


目の前には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