BLOGTIMES
2021/05/24

nginx の Port 443 で SSL と SSH を共存させる

  nginx  ssh 
このエントリーをはてなブックマークに追加

Run Non-SSL Protocols on the Same Port as SSL in NGINX 1.15.2」という記事を読んで、$ssl_preread_protocol を使うと 1 つのポート ( 443 ) で複数のプロトコルを扱う Proxy を nginx で実現できることが分かったので試してみようとしたら、そんなに単純にいかなかったので顛末をメモ。

結局のところ、設定ファイルは以下のような形になりました。

http { server { listen 127.0.0.1:8443 ssl http2 proxy_protocol; real_ip_header proxy_protocol; set_real_ip_from 127.0.0.1; ・・・・・・・・・ } } stream { upstream ssh { server 127.0.0.1:8022; } upstream web { server 127.0.0.1:8443; } map $ssl_preread_protocol $upstream { default ssh; "TLSv1.3" web; "TLSv1.2" web; } server { listen 443; proxy_pass $upstream; ssl_preread on; proxy_protocol on; } server { listen 127.0.0.1:8022 proxy_protocol; proxy_pass 127.0.0.1:22; } }

鬼門だったのは PROXY Protocol*1 の設定の部分。この設定は proxy_pass された先のサーバがクライアントの IP を知るために必須の設定ですが、SSH のように PROXY Protocol に対応していないサービスの場合には、そのままローカルの 22 に proxy_pass してしまうとプロトコルエラーになってしまいます。

分かってしまえば単純な話なのですが、nginx では proxy_protocol on;で proxy_pass した場合、飛ばし先の listen に proxy_protocol をつければよいので、ssh の場合には stream の定義のところに proxy_protocol がついた server をもうひとつ定義してあげる必要がありました。


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/12493
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン