LoginSignup
6
6

More than 3 years have passed since last update.

Squidでwebsocket通信をプロキシする

Posted at

はじめに

⁠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通信とみなすようになるため注意

/etc/squid/squid.conf
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

6
6
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
6
6