はじめに
先日OCI WAFでwebsocket通信が可能になったみたいなので試してみました。
Clinet -- WAF -- Listener
上記の構成でwebsocket通信を許可するためのセットアップ方法をまとめていこうと思います。
ちなみに、OCI WAFに関しては以下をどうぞ。
Oracle Cloud Infrastructure Web Application Firewallのご紹介
必要ツール
websocket通信を簡単にセットアップできるツール
ws: a Node.js WebSocket library
OCI CLI(出来るだけ最新のものをおすすめします、本稿は2.10.0を利用しています)
oracle/oci-cli
手順
今回行った手順は以下。
- oci cliのセットアップ
- リスナーにWAFを適用
- WAFのポリシーをアップデートする
- リスナーでwsを使ってlistenする
- クライアントからリスナーに対してHandshakeを実行
試してみた
###oci cliのセットアップ
こちらは既に導入しているリーダーの方もいるかと思うので、スキップします。
※2.10.0以降のバージョンで試してください
未導入の方は以下を参照。
Oracle Cloud : コマンド・ライン・インタフェース(CLI) をインストールしてみた
###リスナーにWAFを適用
OCIコンソールからWAFポリシーを作成する。
作成後、DNSの設定をします。
OCI WAFは、AレコードでWAFのIPアドレスをユーザーが管理する必要ないみたいです。
WAFの設定時に生成されるCNAMEターゲット
を利用します。
プライマリドメインに対して設定する際に、CNAME
は利用できないので、ALIAS
で解決する必要があります。
###WAFのポリシーをアップデートする
cliを用いて、WAFのpolicy-configを変更します。
oci waas policy-config update [OPTIONS]
OCI-cli/websocket-path-prefixes
以下で、websocket/
配下のみにwebsocket通信を許可するようにします。
websocket-path-prefixes
にroot
を適用させたい場合は["/"]
と書く必要があります。
また渡す値は配列になっているので、複数のパスに適応する事ができるみたいです。
$ oci waas policy-config update --waas-policy-id ***** --websocket-path-prefixes '["/websocket/"]'
※cliのバージョンは2.10.0以降を使ってください
###リスナーでwsを使ってlistenする
Nodeが入っていれば、npmでinstall可能。
(もちろんリスナー側で用いるポートのfirewallは空けておく。)
$ npm install -g wscat
-l
で通信を受け付ける(Listen)設定をします。
$ wscat -l 80
ws
すごい簡単ですね
###クライアントからリスナーに対してHandshakeを実行
クライアント側も同様にws
をインストールする必要があります。
$npm install -g wscat
あとは、リスナーがlisten出来ている事を確認し、以下を実行。うまくいくはず。
$ wscat -c ws://web.topskills.jp:80
また、curl
を用いてハンドシェイクする事も可能。
レスポンスが HTTP/1.1 101 Switching Protocols
で返ってくる事で成功を確認できます。
$ curl -v -H 'Sec-WebSocket-Version: 13' -H "Sec-WebSocket-Key: $(head -c 16 /dev/urandom | base64)" -H "Connection: Upgrade" -H "Upgrade: websocket" "http://********/websocket/"
以上の通り、本稿では、OCI WAFでwebsocket通信を試してみました。
次回はもう少し掘り下げた内容を書ければ、と思っています。
#参考記事
WebSocket についてまとめてみる
Oracle Cloud Infrastructure Web Application Firewallのご紹介
Oracle Cloud : コマンド・ライン・インタフェース(CLI) をインストールしてみた
WebSocket の検証では wscat が便利だった