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