グローバル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
なかなか大変でした。。。
ほかになんかいい手があればおしえてください。。。