Socket.IO and firewall software

Jxck edited this page Dec 24, 2012 · 18 revisions

調査の結果 100k リクエストのうちの 3% ちかくが、ファイアウォールの内側からのもので、そのため 4000 番ポートで起動しているインスタンスに接続できていないことがわかりました。別のポートにフォールバックも考えましたが、パーソナルファイアウォールがあり、いくつかのものは対応が WebSocket を通さないことがわかっています。

幾つかのネットワークは、 port 80 上の WebSocket のトラフィックを遮断します -- 私たちは、いくつかの学校が(Fcebook すらフィルターしていないのに) WebSocket に関するトラブルがあることを見つけました。 WebSocket のトラフィックを、 port 443 (SSL 有効/無効 ともに) に移動することで、この問題を解決しました。

WebSocket のネットワーク互換性に関する素晴らしい テスト/検証 のページが以下にあります。 http://websocketstest.com/

他にも多くのファイアウォールをテストしました。

テスト環境

全てのテストは仮想マシン(parallels 6)上の Windows XP で行いました。各テストごとに一つのソフトウエアパッケージのみをインストールし、テスト終了後はクリーンな状態のスナップショットにロールバックしています。ソフトウエアはデフォルトの設定で、"zomg paranoid panix button" を設定しています。

実行したテストは二つです。

  • ホストマシン上の firewall に特別なルールは設定しない。
  • ホストマシン上の 4000 番ポートをブロックし、 VM が企業などの firewall の後ろにある環境を再現する。

クライアントの js は、最初に 4000 番に接続を試し、ダメだったら 80 か 843 にフォールバックします。 80 と 843 の順番についても、両方が上手く行くかどうか確認するためにテストしました。

これらのテストは https のコネクションを使用しない場合に効果を発揮するでしょう。ブラウザのキャッシュは無効にし、cookie はテストごとにクリアしています。ブラウザは Chrome と Firefox (3.6) を使用し、可能であれば IE でも確認しました。しかし IE は cookie の削除を実行しても消してくれない場合があり、これは非常に大変でした。。

TL;DR

  • WebSockets でないコネクションは問題ない。
  • WebSockets はほとんどの firewall でブロックされない。 (Avast, AVG, BitDefender を除いて)
  • ブロックする firewall のほとんどは、843 番ポートの WebSocket は 許可する

テスト結果

アルファベット順


Windows Defender

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

Microsoft Security Essentials

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

Avast Internet Security

唯一した変更は、フレンドリストからローカルネットワークを外したこと。 プロダクションサイトではその領域を外に出してしまいがち。

  • firewall が無効なら、全てのブラウザが 4000 番ポートに接続可能。
  • firewall が有効なら、 FF / IE の 4000 はブロックされる。しかし 80 も 843 も接続可能。
  • Chrome の場合、なんてことだ 80 番の WebSocket がブロックされた。しかたなく 843 ポートをオプションのリストの先頭に追加した。(本当は @3rd-Eden が教えてくれた。). そしたら 843 で 動いた.

Note, この調査は avast 6.0.1289 以上のバージョンで行われました。 バージョン 6.0.1367 ではいくつかの問題は修正されているようです。

McAfee Total Protection 2011

面白いことに、 McAfee は VM 上にトロイを検出してくれた。 Windows Defender でも Avast でもそんなこと無かったのに。興味深い。

  • firewall が無効なら、全てのブラウザが 4000 番ポートに接続可能。
  • firewall が有効でも、全てのブラウザが 80 と 843 番ポートに接続可能。

Norton Internet Security 2011

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

ESET Smart Security 5

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できる。
  • しかし、 localhost からの接続はブロックされる。

ZoneAlarm Extreme Security

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

Panda Internet Security

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

Comodo Internet Security Pro 2011

これまた不思議なことに、 Comodo は Parallels が追加した hosts ファイルの設定を見つけて、それをトロイだと騒ぎだした。さらには Silverlight にワームが入ってると騒ぎだす始末。他のではそんなことなかった。

Comodo のフリーの firewall は一つのパッケージに一緒に入っていたので、それらを分けずにテストした。

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

Kaspersky Internet Security 2011

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

AVG Internet Security 2012

最初にブラウザが Node の 4000 番ポートに接続しようとすることに対して質問されるが、それ以降はスムーズに進む。

  • firefox の場合 80 と 843 については何も質問されない。
  • WebSockets は 全て のポートでブロックされる。そのくせに AVG のログには接続が許可されたというログが残る。
  • Websocket じゃない通信はうまくいく。インターネットにつなぐ時、最初にの質問されることを除いて。

Avira Antivirus Premium

トライアル版だと firewall は有効にできなかった。。。Web プロテクションの機能がいくつかあるが、どの接続もブロックされなかった。

Bitdefender Total Security 2012

Bitdefender は firewall をめちゃくちゃなパラノイド(make the firewall super paranoid)にするいくつかのオプションをもっている。 すばらしい、じゃあ全部 on にしてみよう =]

  • Firefox は全てのポートで接続可能
  • WebSockets はブロックされる。しかし Chrome は XHR-polling にフォールバックする。(おもしろいことに、これは他のウイルス対策ソフトではおこらなかった。もしかしたらテストコードが間違ってて接続に失敗したのかもしれない。) ログには stealth traffic と記録される。

Trend Micro Titanium Maximum Security 2012

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

Online Armor++

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。

Privoxy

プライバシーデフォルトのセッティングで使った。ユーザが色々設定をいじってからだと、 恐らく ハンドシェイクはブロックされるだろう。でもそのことは余り考えなかった。

  • Chrome は WebSocket マジックを用いて、空いているどのポートでも WebSocket 接続できる。
  • 他のブラウザだと、空いているどのポートでも接続できない。