はじめに
B.7. Squid プロキシ
Squid プロキシサーバーは webSocket プロトコルをサポートしていません。
[squid-users] Squid Websocket Issue
Both the Upgrade and WebSockets support requirements are not existing in Squid.
Squid Websocket Issue
Squid does not yet support using Upgrade for "websocket" protocol,
Squidでwebsocket通信ができない!?
まじかよ……
チャットとかGoogleスプレッドシートの共同編集とかできないってことか…?
と思ったのでSquidでwebsocket通信をプロキシする方法を調べてみました。
TL;DR
デフォルトのSquidの設定で__443/tcp__に向けた通信はwebsocketでも__プロキシすることができます。__
443/tcp以外のポートでwebsocket通信をプロキシしたい場合は、下記設定を追加すればOKです。
※443/tcp以外のポートもSSL通信とみなすようになるため注意
acl SSL_ports port 【任意のポート番号】
acl Safe_ports port 【任意のポート番号】
ざっくり説明
Squidはwebsocketプロトコル自体はサポートしていないようです。websocket通信時のヘッダーをSquidがサポートしていないことが直接の原因っぽい1。
しかし、SSL/TLS通信をプロキシする場合、Squidはパケットの中身を(基本的には)見ることなく、接続先サーバまでただ転送するようになります。E2Eのセキュア通信なので、Squidは中身を気にしません。
つまり、websocketのパケットだろうと、Squidはクライアントからサーバまで通信を転送するようになり、その結果として対応していないwebsocket通信でもプロキシできるようになります。
SquidがSSL/TLS通信をみなすポートは、squid.confのSSL_ports
で定義されており、デフォルト設定だと443/tcp
になります。
そのため、デフォルト設定であれば443/tcpに向けた通信であればSquidは問答無用でプロキシします。
もちろん設定を変更すれば443/tcp以外のポートでもSSLプロキシできるようになります。(例は上記の通り)
プロトコルではなく、ポート番号で識別しているというところがミソですね。
補足
上記の説明と矛盾しますが、SquidはSSL/TLS通信の中身も確認することができます(ssl-bump)。
Man-in-the-Middleと同じ原理で、クライアントはSquidとHTTPS通信し、SquidがさらにサーバとHTTPS通信します。
この設定を入れている場合に、Squidがwebsocket通信を正しくプロキシできるかは未確認です。
参考にした記事
Websockets not connected behind proxy - stackoverflow