NginxでWebsocketリバースプロキシ

グローバルIPの「www.xxx.yyy.zzz」に不特定多数のユーザにアクセスさせて、
内部のWEBサーバにアクセスさせたいという要望があったので備忘録。

「www.xxx.yyy.zzz」のルータに穴あけというなのDST NATをかけるだけの簡単なお仕事。ではなくいろいろと考えなきゃいけないことが。。。

問題なのは、3点
「アクセス元は不特定多数」「内部のWEBサーバには認証がない」「Websocketを使っている」

仕様として、
リバースプロキシによって認証したものだけを通す、
ようは「aaa.bbb.ccc.ddd:8080」にアクセスしたら、
Basic認証して「www.xxx.yyy.zzz:80」へ接続する形にします。

加えて「www.xxx.yyy.zzz:80」に
アクセスできるグローバルIPアドレスを「aaa.bbb.ccc.ddd」だけに限定しておけば、
「www.xxx.yyy.zzz」のセキュリティはある程度保てるかなと。
SSLじゃないのは勘弁してください・・・

リバースプロキシを使うため、最初はSquidでやろうとしていたのですが、どうやらWebsocketには対応してないらしく
(443だと大丈夫らしいけど)これに気が付くまで数時間を無駄にしました・・・
http://squid-web-proxy-cache.1019090.n4.nabble.com/Squid-Websocket-Issue-td4680870.html
ということで、おなじみ「nginx」を使います。

$ vi sudo /etc/nginx/sites-enabled/websocket.proxy

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 8080;
    server_name aaa.bbb.ccc.ddd;
    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";
    auth_basic "auth";
    auth_basic_user_file /etc/nginx/passwd;
    proxy_pass http://www.xxx.yyy.zzz:80;
    }
}
$
$ sudo htpasswd -c /etc/nginx/passwd username
$
$ sudo ufw allow 8080/tcp

なかなか大変でした。。。

ほかになんかいい手があればおしえてください。。。

コメントを残す

メールアドレスが公開されることはありません。

Enter code * Time limit is exhausted. Please reload CAPTCHA.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください