ZoraxyとOCIを使った簡単リバースプロキシ
こんにちは。
最近ようやくOCIを契約することができました。
トランザクションエラーに阻まれて苦節2年...長かった...
これでAlwaysfree枠が使えるようになったので、前々から気になっていたリバースプロキシをE2microに構築してみようと思いました。
初心者なのでわかりにくいところやどこか間違っているところがあれば指摘して欲しいです。
Zoraxy
Zoraxyはaroz.orgチームの作成する、ブラウザからアクセス可能な軽量リバースプロキシです。
とてもわかりやすい今風なwebダッシュボードと、なんと行ってもその軽さが魅力的です。
また、ダッシュボード内につなげたサーバーのアップタイムモニターや簡易的なwebサーバーなど、あったら地味に便利なツールが詰め込まれているのも嬉しい点です。
cpuはarm、amd、osはlinuxとwindowsに対応しています。
まだ結構新めのプロジェクトゆえにコミュニティが小さいのと、cliでの管理ができないのが少し難点かもですね。
環境
-
OCI E2micro
- ubuntu 24.04
- 2vcpu
- RAMは1gb
- 今回ストレージは50GB
-
ipv4とipv6に対応
-
プロキシと背後にあるサーバーとでtailscale vpnを使用
構築
ubuntu、tailscaleがすでに導入されている前提で書く。
構築方法としてdockerとバイナリの両方あるが、dockerがあまり好きじゃない、dockerに割くリソースを減らしたいのでバイナリで構築する。
また、今回はrootユーザーで構築していく。
バイナリのダウンロード
リリースページに行き、最新のものからサーバーにあったものを選択、ダウンロードする。
## 今回はwgetを使った。
$ wget https://github.com/tobychui/zoraxy/releases/download/v3.2.5r2/zoraxy_linux_amd64
systemdの設定
systemdを使ってプロセスを管理できるのでconfigを書く。
$ mkdir zoraxy
$ sudo nano /etc/systemd/system/zoraxy.service
[Unit]
Description=Zoraxy Reverse Proxy Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/バイナリがダウンロードされている場所/zoraxy
ExecStart=/バイナリのパス -port=:8000 -fastgeoip=false
## ポートは任意、geoipはリソースに余裕があるサーバーであれば基本的にtrueで大丈夫。
[Install]
WantedBy=multi-user.target
スタートアップと起動
$ systemctl enable --now zoraxy.service
$ systemctl start zoraxy.service
その後、http://[ip]:8000
にアクセスするとダッシュボードと対面できる。
OCIでの設定
今回はOCIのE2microに構築した。
インスタンスの構築手順は誰かに任せるとして、設定していてわかりにくいと思ったところのみを忘備録として書いていこうと思う。
ipv6アドレスの追加
初回vpc作成時にvcnの設定をするが、事前にvcn設定にてipv6接頭辞を設定しなければvpcにipv6が割り当てられないので、その設定を飛ばしてしまった時の追加の設定方法を書く。
まずはvcnの設定を開き、作成したvcnの設定画面までいく。
IP管理 → CIDRブロック/接頭辞
より、[オラクル社が割り当てたIPv6 /56接頭辞を割り当てます]にチェックを入れ追加作成。
コンピュートページに行き、vpcの設定画面までいく。
ネットワーキング → アタッチされたVNIC → [vpc名] → IP管理 → IPv6アドレス
より、[サブネットipv6接頭辞]から作成した接頭辞を選択、後は任意で割り当てする。
ポート開放
vcnの設定まで行き、
セキュリティ → セキュリティ・リスト : Default Security List for vcn-*** → セキュリティ・ルール → イングレスルール
より、任意の設定にして保存。
また、vpc側でもポート解放する必要がある。
ubuntuだとiptablesコマンドが動作する。
調べると/etc/iptables/rules.v4
、/etc/iptables/rules.v6
にルールを書き加え、restoreしろとのことなのでそれに従う。
$ nano /etc/iptables/rules.v4
$ nano /etc/iptables/rules.v6
...
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8000 -j ACCEPT
## 開けるポートは任意。
## 開けるとグローバルからアクセスできるようになってしまうので注意。
...
COMMIT
## rules.v6も同様
書き込み後リブート。
設定項目が深すぎてまじでわからん。
クラウドに慣れていないと難しいかも。
ダッシュボードでの設定
サイトに初回アクセスできたらアカウントを作成してログインしましょう。
まずは自身のドメインにociで割り当てられたAレコード、AAAAレコードを作成し、リバースプロキシと繋げる。
Create Proxy Rules
ページにドメインとホストのipを入れて登録したら完了。
ちゃんと繋がるかどうかを確認しましょう。
基本的なプロキシの設定
ここからは画像を貼るのがめんどくさいので文字で書きます。
TCPプロキシ
Stream Proxy
ページから、名前、ホストのポート、プロキシ側のポート、タイムアウト秒数を設定し作成。
リダイレクト
Redirection
ページから、リダイレクトurl、リダイレクト先url、サブディレクトリの同期の有無、307、301かの設定をし作成。
discordのurlとかを設定すると便利かも。
アクセスコントロール
Access Control
ページからルールを作成できる。
私はwhitelistで日本だけ許可するようにしています。
便利な機能
sslの設定
すごく便利なことにssl証明書を自動で設定してくれる機能があります。
設定する方法は主に2パターンあり、
- 自身で証明書を作成して、プロキシサーバーにアップロードする方法
- プロキシサーバーが CA(認証局)に証明書を申請し、自動で生成・設定する方法(ACME)
があります。
1つ目は証明書を取得できれば簡単、多分2つ目の方法の方がやる人多そうなのでここでは省略。
2つ目の方法で少し詰まったので記録として残しておきます。
TLS / SSL Certificates
ページに行き、ページ下部の
Certificate Renew / Generation (ACME) Settings → Open ACME Tool
を開く。
Email、ドメイン、任意のCAを選択し、Get cartificate
を押せば生成される。
Let's Encrypt、cloudflare dnsを使う場合
私の環境としてCAにLet's Encrypt、レジストラにcloudflareを使用しているので、DNS challenge が必要みたいです。(あんまりよくわかってない)
cloudflareにアクセスし,
アカウントの管理 → アカウントAPIトークン → トークンを作成する → ゾーンDNSを編集する
より、権限を下記のようにし、ゾーンリソースに自身のドメインを含め作成。
APIキーが出力されるので控えておく。
Zoraxyのwebダッシュボードに戻り、Use a DNS challenge
にチェックを入れ、AuthEmail
、AuthKey
は空欄に、AuthToken
、ZoneToken
に控えたAPIキーをどっちにも入れGet certificate
を押せば生成される。
ネットワークツール
whois、Traceroute、ポートipスキャナ、Web SSH、Wake On LAN、などあったら便利な機能が豊富にあります。
地味に便利。
アナライザ
アクセスしてきたipやロケーション、ユーザーエージェントなどを視覚的に表してくれます。
眺めてニヤニヤするのもいいと思います。
静的webサーバー
簡易的なwebサーバーが動作していて、webダッシュボードから管理画面にアクセスできます。
あくまで簡易的なものなので複雑な設定はできないと思われます。
まとめ
もともとプロキシにはcloudflareを使っていましたが、100mb制限があるのでnextcloudなどを鯖に立てていると正常にアップロード動作が完了しないことがよくあり、非常に不安定だったのですが、リバースプロキシに乗り換えてからものすごく安定しました。
OCIのAlwaysfree枠ってすごい太っ腹ですよね!!!!!!
参考文書
Discussion