前編までで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
念のためのセキュリティー設定
server_tokens off;
ssl_protocols TLSv1.2 TLSv1.3;
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と表示される
strfryの実行
ようやく実行に移る
ちゃんとディレクトリにいるか確認する
以下の設定を変更する
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ライフを!