Unifi Controller + Nginx。 HTTPおよびHTTPS

画像







要約:



httpまたはhttps経由でNginx経由でUnifiコントローラーをプロキシするための詳細な手順。







構成、明確な例、コメント。







プロローグ



当社はモバイルアプリケーションを開発していますが、ご想像のとおり、オフィスには膨大な数の異なるデバイスがあり、それらはすべてWi-Fiだけでなく、Wi-Fiを愛していますが、Skype通話を中断することなく廊下を自由に歩けるようになっています、継続的なワッフルのすべての成果をお楽しみください。







これらの目的のために、設定に煩わされず、すべてが箱から出して機能するように、いくつかのUnifiプレートを使用することにしました。 ほとんどの場合、すべてがこのチュートリアルを作成する理由となった1つのBUTのみでした。プレートコントローラーはhttpsを介してのみ動作し、 既存の Nginxを介した通常のプロキシ命令にも依存せず、穏やかに言えば、多くのことが望まれますが、また、HTTPを操作するためのスクリプトも提供していません。







必要なトレーニングのレベル:



Nginxの基本は設定を配置する場所がわかっているため、Webサーバー自体もデプロイされていることは明らかです。 さらに、調理器具コントローラーは既に構成されていることがわかります。 これが問題になる場合、UbiquityにはLinuxおよびWindows用の優れた指示があります 。 しかし、将来、私たちはすべてここで焼けたlinuxoidであると仮定します。







設定全体は、Unifi Controller v5.2.9、Nginx v1.10.1、Debian Jessie、Java 8でテストされました







それでは、行きましょう。







HTTP:



すべてが単純で、必要な場所に設定を配置するだけで済みますが、特定の説明と警告が必要になります。







怠け者 考える 読み取りますが、動作するためにすべてが必要な場合、コントローラがローカルホストにない場合、設定をコピーして、その中のserver_nameを適切なもの、およびアップストリームブロックのアドレス/ポートに置き換えることができます:







upstream unifi { server 127.0.0.1:8443; } server { listen 80; server_name unifi.domain.com; error_log /var/log/unifi/nginx.log; access_log /var/log/unifi/access.log; proxy_ssl_verify off; proxy_ssl_session_reuse on; proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2; proxy_cache off; proxy_store off; server_tokens off; location / { proxy_set_header Referer ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://unifi; proxy_redirect https:// http://; header_filter_by_lua_block { if ngx.header["Set-Cookie"] then ngx.header["Set-Cookie"] = { string.gsub(ngx.header["Set-Cookie"][1], "(.*)Secure;(.*)", "%1%2"), string.gsub(ngx.header["Set-Cookie"][2], "(.*)Secure(.*)", "%1%2") } end } } }
      
      





Nginxがソースからコンパイルされている場合、 ngx_http_lua_moduleモジュールを個別にインストールする必要があります。







これで、Nginxを再起動できます。







 sudo service nginx reload
      
      





ニュアンス:

コントローラーはデフォルトでHTTPSのみをサポートしているため、HTTPを介したプロキシの場合、セキュアフラグをオフにしてCookieを変更し、原則としてSSLアップストリームサーバー検証を無効にする必要があります。 発信管理者は、コントローラに事前登録することで信頼できる証明書を追加できると言ってスリッパを投げますが、その複雑さを考慮してこのケースは考慮しません。







それでも、インフラストラクチャをHTTP上に保持することはお勧めません 。 証明書がまったくない場合にのみ、コントローラーを美しく突出させたい。







リスニングポートやその他の設定を好みに合わせて変更できます。







デフォルトのコントローラー証明書を使用したHTTPS:



これはHTTPSの遅延バージョンです。 コントローラには独自のssl証明書がすぐに使用できますが、他の証明書に置き換えることができます。 そして、細心の注意を払って設定する代わりに、Nginxにすべてに同意するようにお願いします。







簡単に言えば、すべてのトラフィックは インターネット HTTPSを介したNginx、およびNginxからコントローラーへのネットワークは、すでに安全ではありません。 UnifiコントローラーとNginxがlocalhostまたは信頼できるネットワーク内にある場合、これは私たちの場合です:







 upstream unifi { server 127.0.0.1:8443; } #   HTTPS server { listen 80; server_name unifi.domain.com; server_tokens off; rewrite ^ https://$http_host$request_uri?; } server { listen 443 ssl; server_name unifi.domain.com; error_log /var/log/unifi/nginx.log; access_log /var/log/unifi/access.log; ssl on; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; add_header Strict-Transport-Security "max-age=31536000" always; server_tokens off; proxy_ssl_verify off; proxy_ssl_session_reuse on; proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2; proxy_cache off; proxy_store off; location / { proxy_set_header Referer ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://unifi; } }
      
      





詳細設定

置き換えることで永続的なリダイレクトを行うことができます







 rewrite ^ https://$http_host$request_uri?;
      
      











 rewrite ^ https://$http_host$request_uri? permanent;
      
      





ただし、システム全体が正しく動作していると確信している場合は、これを行うことをお勧めします。







この構成では、次のパラメーターを独自のものに置き換える必要があります。









Nginxをリロードすることを忘れないでください:







 sudo service nginx reload
      
      





あなたは尋ねることができます:「しかし、なぜ、あなたの設定には2つのサーバーがありますか? 私は答えます:セキュリティホールを危険にさらさないために、1つのサーバーがSSLトラフィックを受け入れてコントローラーにプロキシし、もう1つのサーバーがHTTP経由で私たちに連絡した場合、最初のサーバーにリダイレクトします。







そして今、最も甘いものが残っています 本当の妄想 真面目な管理者。







カスタムコントローラ証明書を使用したHTTPS



Nginxとコントローラーが信頼できるネットワークに存在せず、それらの間の接続のセキュリティを100%確信できないと仮定します。 この場合、コントローラーが配置されるドメインに対してsslが発行した証明書を使用するか、独自の証明書を生成する必要があります。







ここでは自己署名証明書を生成する手順については説明しませんが、このチュートリアルを間接的に参照するだけです。 私たちはすべてが準備ができており、私たちはよくやったと信じています。







そのため、 CRTファイルとキーファイルを手元に用意し、証明書をUnifiコントローラーに配置する必要があります。 それらはそれぞれunifi.crtおよびunifi.keyと呼ばれると仮定します。







ここで、コントローラーのキーストアファイルを生成する必要があります 。 次のコマンドは、ルートにunifi.crtおよびunifi.keyがあるフォルダで実行する必要があります。 このフォルダーの場所は関係ありません。最終的に必要なのは最終ファイルのみです。







 openssl pkcs12 -export -in unifi.crt -inkey unifi.key -out unifi.p12 keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore keystore -srckeystore unifi.p12 -srcstoretype PKCS12 -srcstorepass aircontrolenterprise
      
      





ここで、 キーストア取得して、コントローラーのルートにあるデータフォルダーに移動します。 ルートフォルダのデフォルトの場所は/ usr / lib / unifiです。 ファイルは次のパスになります: / usr / lib / unifi / data / keystore







P12のドキュメントは必要ありません。削除するか、フレームに入れることでメモリに残すことができます。







次に、Unifiサービスを再起動します。







 sudo service unifi restart
      
      





コントローラーでこれ以上の操作は必要ありませんが、現在はNginxに任されています。 証明書を盲目的に受け入れないという事実を除いて、この構成は以前のバージョンとほとんど変わりません。 証明書が自己署名されている場合、それを信頼するようにNginxに伝えます。







発行された証明書の場合







Nginxの構成:







 upstream unifi { server 127.0.0.1:8443; } server { listen 80; server_name unifi.domain.com; server_tokens off; rewrite ^ https://$http_host$request_uri?; } server { listen 443 ssl; server_name unifi.domain.com; error_log /var/log/unifi/nginx.log; access_log /var/log/unifi/access.log; ssl on; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; add_header Strict-Transport-Security "max-age=31536000" always; server_tokens off; proxy_ssl_session_reuse on; location / { proxy_set_header Referer ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://unifi; } }
      
      





次の構成パラメーターを置き換える必要があることを繰り返します。









自己署名証明書:







前の手順で既におなじみの2つのファイル、 unifi.crtおよびunifi.keyが必要です。 Nginxは賢く、認証局でそれらを検証する方法を知っているため、発行された証明書にはそれらは必要ありませんでした。 ここでは、それらを明示的に彼に示す必要があります。







Nginxの構成:







 upstream unifi { server 127.0.0.1:8443; } server { listen 80; server_name unifi.domain.com; server_tokens off; rewrite ^ https://$http_host$request_uri?; } server { listen 443 ssl; server_name unifi.domain.com; error_log /var/log/unifi/nginx.log; access_log /var/log/unifi/access.log; ssl on; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; add_header Strict-Transport-Security "max-age=31536000" always; server_tokens off; proxy_ssl_verify on; proxy_ssl_certificate /etc/nginx/ssl/unifi.crt; proxy_ssl_certificate_key /etc/nginx/ssl/unifi.key; proxy_ssl_trusted_certificate /etc/nginx/ssl/unifi.crt; proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2; proxy_ssl_session_reuse on; location / { proxy_set_header Referer ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://unifi; } }
      
      





上記のように、構成パラメーターを自分のものに置き換えることを忘れないでください:









これで、Nginxを再起動できます。







 sudo service nginx reload
      
      








それだけです、私たちは望みを達成しました。 これで、指定したアドレスでコントローラーが利用可能になりました。







結果画像

画像







ご質問にお答えし、フィードバックをお送りします。







PSコメントを読んだ後、すべての回答者に感謝したいと思います。レビューを読むのはいいことです。

最も人気のある質問のミニFAQを作成します。







1.なぜ%software_name%ではなくNginxなのですか?

回答:会社はNginxを使用しました。それを通して問題を解決する必要がありました。







2.記事はUnifiにどのように関連していますか? これは%common_techonology_name%です!

回答:目標は、特にUnifi + Nginx向けの狭いチュートリアルを書くことでした。セットアップが困難な人全員が、必要な技術スタックを明確に表現できるわけではないためです。








All Articles