0
0

OCIでnostrリレーを動かそう (後編)

Last updated at Posted at 2024-06-26

前編まででstrfryのビルドまで行った
strfryの細かい使い方は他のドキュメントに任せるとして後編ではOCIで実際に動かす際に必要なネットワーク周りのセットアップを行っていく

OCI側のファイヤーウォールの設定

クラウド上で動くインスタンスはクラウドサービスの提供するファイヤーウォールとインスタンス内部で動くファイヤーウォールの二重になっていることが多い
OCIもそうなのでまずはクラウドサービス側の設定をしていく

まずインスタンスのページを覗くとVirtual cloud networkという項目があるのでそこをクリック
次にその中のsubnet(少なくとも初期状態では1つ)を選択
Security Listsが表示されるのでその中のDefaultを選択
Ingress Rules(外部から内部へのアクセスを管理するルール)という項目が表示されるのでAdd Ingress Rulesを押して

Source CIDR: 0.0.0.0/0
Protocol: TCP
Destination Port Range: 80

で設定する

ついでにpingが通るように

Source CIDR: 0.0.0.0/0
Protocol: ICMP
Type: 8

も追加しておく
うまくいっているかpingが通るか確かめる

参考
Opening up port 80 and 443 for Oracle Cloud servers - DEV Community

ICMPの内容はRFCで定義されていてType 8はEcho Requestである
第12回 TCP/IPプロトコルを支えるICMPメッセージ

Ingressと対になるものはEgressと呼ばれるものでデフォルトで内部から外部へはすべての通信は許可されている

statefulとstatelessというのがあるがこれはTCPコネクションが双方向なので本来Ingress, Egress両方を設定しなければならないがstatefulであればコネクションを検知して自動で処理してくれる
セキュリティ・ルール

iptablesの設定

sudo iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -I INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

以下で確認

sudo iptables -L INPUT

iptables -I INPUTでINPUTというchainの一番最初にルールを挿入する
chainの一番最初から順番に処理されていきACCEPTやREJECTなどでパケットがどのように処理されるか決まる
port forwardingやらネットワークインターフェイスやら意外と奥が深い

他のディストリビューションを使っている人はnftablesやfirewalld, ufwを使っているかもしれない

nginxの設定

インターネット上の外部のクライアントがいきなりstrfryに接続しても良いがwebsocketの実装は簡易的なものなので余裕があるのならリバースプロキシーを噛ました方が良い
今後wss化したくなったときにも役立つ

sudo apt install --no-install-suggests nginx

念のためのセキュリティー設定

/etc/nginx/nginx.conf
        server_tokens off;
        ssl_protocols TLSv1.2 TLSv1.3;
/etc/nginx/sites-enabled/websocket.proxy
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
 
server {
    listen 80;
    server_name 127.0.0.1;
    access_log  /var/log/nginx/websocket.access.log;
 
    location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;

    proxy_pass http://127.0.0.1:7777;
    }
}

邪魔なので消す

sudo rm /etc/nginx/sites-enabled/default

systemdで実行

sudo systemctl enable --now nginx

以下で確認

sudo systemctl status nginx

参考
NginxでWebsocketリバースプロキシ
Nginxのconf.dとsites-availableとsites-enabledの違い #nginx
NginxのリバースプロキシでWebソケットを通す際の設定

websocketはhttpからConnection Upgradeして始まる
そのためポートは80である

本来はsites-availableに元ファイルを置いてsites-enabledにシンボリックリンクを張る
実際defaultはそうなっていて消していい理由である

nmapによる検証 (任意)

ここまでうまく行っているかあなたのPCから通信して確かめる

sudo apt install nmap
nmap -p T:80 ${your-server-ip}

うまくいっていればopenと表示される

参考
[Linux] ポートスキャンを行う - nmap

strfryの実行

ようやく実行に移る
ちゃんとディレクトリにいるか確認する

以下の設定を変更する

strfry.conf
    bind = "0.0.0.0"

    port = 7777

    realIpHeader = "x-real-ip"

    enableTcpKeepalive = true

以下で起動

./strfry relay

実際にリレーにアクセスしてみて確かめる

ws://${your-server-ip}

Nostr playground
httpsからhttpへのアクセスなのでブラウザーによってはCORSで無効化されているので手動で直さなければならないことに注意
(firefoxの場合:安全でない接続+network.websocket.allowInsecureFromHTTPS)

cat /var/log/nginx/websocket.access.log

エンディング

おつかれさまでした
以上でひととおり終わりです
個人向けリレーにする際は攻撃を避けるためにポートを変えるアクセス元を制限する、公開リレーにする際はドメインを買って証明書を発行してwss://xxxx.xxxの形にするなどいろいろな道がありそうです

よきNostrライフを!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0