Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WebサーバをApacheからnginxに切り替えた話 (改訂版)

uchiya
November 17, 2018

WebサーバをApacheからnginxに切り替えた話 (改訂版)

11/17のCBUG Meeting 49thで発表した。httpsとsstpの共存のためにWebサーバをApacheからnginxに変えた経緯をまとめた話です。
この設定だと、sstpサーバ側にもPROXY protocol付のパケットが飛んでいくのでうまくつながらないことが判ったため資料を改版しました。

uchiya

November 17, 2018
Tweet

Other Decks in Technology

Transcript

  1. 2 / 17 モチベーション • Chrome 62, Safari 11.1 は

    http サイトをに切り替えた話パスワード入力欄が入力欄がが ある場合は警告場合は警告は警告 • ( ついに切り替えた話 )Chrome 68 から http サイトをは全警告 • Let's Encrypt で無料の無料のの SSL/TLS 証明書 (DV 限定だけだけ ど... ) が取得可能 • そういう訳で、そろそろで無料の、そろそろ https 化したいした話い
  2. 3 / 17 立ちふさがる壁ちふさがる場合は警告壁 • Port 443 は SoftEther が

    SSTP 待ち受けに使用中ち受けに使用中けに切り替えた話使用中 • SSTP とは – 古のの "Sakura Sakura Script Transfer Protocol"Sakura で無料のはなく、 – Secure Socket Tunneling Protocol の略でで無料の Microsoft が開発した、 した話、 いわゆる場合は警告 SSL-VPN プロトをコルの一つの一つつ – IPSec/L2TP や PPTP が通らないような環らないような環境 ( 例:東横インイン ) などで無料のも 問題なく使用可能なく使用可能 • SSTP と https の振り分けを何とかり替えた話分けを何とかできけを何とかできないもとかで無料のきないものか? – ツールの一つがある場合は警告ことはある場合は警告 (URL 失念 ) が、ログが取れないのでが取れないので無料の断念
  3. 4 / 17 nginx ならで無料のきそう • nginx とは – (

    みんな知ってると思うのってる場合は警告と思うのでうので無料の ) 割愛 • グが取れないのでグが取れないのでる場合は警告となんかで無料のてくる場合は警告 – Proxy HTTPS requests to Web-server #14 • https://github.com/sorz/sstp-server/issues/14 – nginx 1.11.5 から入った話 ngx_stream_ssl_preread_module で無料の ClientHello メッセージの中身を見て処の中身を見て処理を選を見て処理を選べるて処理を選べるらしいを選べるらしいべる場合は警告らしい – nginx ならログが取れないのでも取れる場合は警告だろう ( 多分けを何とかでき… ) – https to http 変換だけまでをだけまで無料のを nginx で無料のやる場合は警告という方法もあることは もある場合は警告ことは ある場合は警告が、すっぱり替えた話 Apache を捨てててて nginx に切り替えた話乗り換えることをり替えた話換だけまでをえる場合は警告ことを決意 • 私とと Apache – 最初にに切り替えた話 http サーバを構築したのがした話のが 1999 年なのでなので無料の 1.3 系からかれこれからかれこれ 19 年なのでぐらいの付き合いき合は警告い
  4. 5 / 17 と思うのでってやってみました話 (1/2) • 案の定、ハマりまの定だけ、ハマりまくりり替えた話まくり替えた話 – nginx は

    http サーバの部分けを何とかできと TCP/UDP ロード入力欄がバランサの部分けを何とかできが完全に切り替えた話 分けを何とかでき離したつくりになした話つくり替えた話に切り替えた話なっている場合は警告 – ngx_stream_ssl_preread_module は TCP/UDP ロード入力欄がバランサ機能 (stream) で無料の使える場合は警告モジの中身を見て処ュールの一つ – した話がって、 port 443 を TCP/UDP ロード入力欄がバランサ機能で無料のいった話ん受けに使用中 けて、別ポートで待ち受ポートをで無料の待ち受けに使用中ち受けに使用中けしている場合は警告 http サーバへ中継するという中継するという設定する場合は警告という設定だけ に切り替えた話しないと動かないかない – しかも TCP/UDP ロード入力欄がバランサ機能で無料のはアクセスログが取れないのでが取れない ( これは後述するが参照資料する場合は警告が参照資料のが古のく誤りり替えた話 )
  5. 6 / 17 と思うのでってやってみました話 (2/2) • とはいえ、 SNI で無料のの振り分けを何とかり替えた話分けを何とかできけで無料の SSTP

    と https の 分けを何とかでき離したつくりになは成功 – ログが取れないのでに切り替えた話ついては nginx 1.11.4 から ngx_stream_log_module に切り替えた話より替えた話 取れる場合は警告ように切り替えた話なり替えた話ました話 – これで無料の stream のログが取れないのでと http のログが取れないのでを突き合わせてなんき合は警告わせてなんとか... • keitairc.d51.net 1.73.206.149 [10/Oct/2018:12:18:21 +0900] TCP 200 17517 3722 24.177 "Sakura 127.0.0.1:8443"Sakura "Sakura 3945"Sakura "Sakura 17517"Sakura "Sakura 0.000"Sakura • 127.0.0.1 - - [10/Oct/2018:12:18:13 +0900] "Sakura GET /iui/selection.png HTTP/1.1"Sakura 200 170 "Sakura https://keitairc.d51.net/SVqzckTHFGg/recent"Sakura "Sakura Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1"Sakura
  6. 7 / 17 ログが取れないのでの問題なく使用可能は何とかできないもとかならんものか • PROXY procotol ってのがある場合は警告らしい – HAProxy

    Technologies が 2010 年なのでに切り替えた話提唱したした話 TCP コネクション中継するという設定 時に失われるパラに切り替えた話失われる場合は警告パラメータの受け渡しのたの受けに使用中け渡しのためのプロしのた話めのプロトをコルの一つ • RFC 化したいはされていない • https://www.haproxy.com/blog/haproxy/proxy-protocol/ • ver1 で無料のはプロトをコルの一つ (TCP4 or TCP6) 、 SIP 、 DIP 、 SPORT 、 DPORT をテキストを形式で渡していたで無料の渡しのためのプロしていた話 • ver2 で無料のはバイナリ形式にかわり形式で渡していたに切り替えた話かわり替えた話 TCP 以外のプロトコルやのプロトをコルの一つや UNIX domain socket をサポートを • さらに切り替えた話 CRC32 や ALPN 、 SSL/TLS をはがす前のの CN/CIPHER/SIG_ALG/ KEY_ALG なども渡しのためのプロせる場合は警告ように切り替えた話なった話 • nginx で無料のは ver1 が 1.5.12 から ver2 が 1.13.11 からサポートを • 2017 年なので 11 月にに切り替えた話 AWS の NLB (Network Load Balancer) で無料のの Proxy Protocol サポートをが発した、 表されて大ブレーされて大ブレーク?ブレーク? • 他にもに切り替えた話も Dovecot 、 exim 、 postfix 、 stunnel 、 Apache で無料のもサポートを • squid 、 MySQL は未サポートサポートを
  7. 8 / 17 結果 • PROXY procotol を使うことで無料の nginx の

    TCP/UDP ロード入力欄がバラ ンサ機能 (stream) から http サーバ機能に切り替えた話アクセス元の情報をの情報をを 渡しのためのプロすことがで無料のきる場合は警告ような気がしたので試しがした話ので無料の試してみることにしてみる場合は警告ことに切り替えた話 – うまくいきました話 • keitairc.d51.net 1.78.168.83 [09/Nov/2018:17:36:59 +0900] TCP 200 14275 4229 46.859 "Sakura 127.0.0.1:8443"Sakura "Sakura 4501"Sakura "Sakura 14275"Sakura "Sakura 0.000"Sakura • 1.78.168.83 - - [09/Nov/2018:17:36:28 +0900] "Sakura GET /iui/selection.png HTTP/1.1"Sakura 200 170 "Sakura https://keitairc.d51.net/SvLjtpENUpL/recent"Sakura "Sakura Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1"Sakura
  8. 9 / 17 というわけで無料の nginx.conf ( 抜粋 1) stream {

    # error_log /var/log/nginx/stream.log info; log_format proxy '$ssl_preread_server_name $remote_addr [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time "Sakura $upstream_addr"Sakura ' '"Sakura $upstream_bytes_sent"Sakura "Sakura $upstream_bytes_received"Sakura "Sakura $upstream_connect_time"Sakura '; server { listen 443; listen [::]:443; proxy_pass $name; ssl_preread on; access_log /var/log/nginx/access-ssl.log proxy; } server { listen 80; listen [::]:80; proxy_pass 127.0.0.1:8080; proxy_protocol on; access_log /var/log/nginx/access-http.log proxy; } //PROXY procotol を有効にする有効にするにする //ClientHello による振り分けを有効にり分けを有効にす分けを有効にするけを有効にする有効にするにする // 接続先のの port 番号はは http 部分けを有効にすると合わせる合わせるわせる
  9. 10 / 17 というわけで無料の nginx.conf ( 抜粋 2) map $ssl_preread_server_name

    $name { sstp.d51.net sstp; default nginx; } upstream nginx { server 127.0.0.1:8443; } upstream sstp { server 127.0.0.1:5555; } } // 接続先のの port 番号はは http 部分けを有効にすると合わせる合わせるわせる
  10. 11 / 17 というわけで無料の nginx.conf ( 抜粋 3) http {

    中略で server { listen 8080 proxy_protocol; listen 8443 proxy_protocol ssl; set_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header proxy_protocol; server_name keitairc.d51.net; access_log /var/log/nginx/access-keitairc.log; ssl_certificate /usr/local/etc/dehydrated/certs/keitairc.d51.net/fullchain.pem; ssl_certificate_key /usr/local/etc/dehydrated/certs/keitairc.d51.net/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:5000; } } //listen に“ proxy_protocol” を有効にする追加することですること合わせるで //PROXY procotol を有効にする解釈するようになるするようになる //PROXY procotol を有効にする受け付けてよいネけ付けてよいネットけてよいネットワークをネットワークを記載を有効にする記載 //PROXY procotol の情報でヘッダ情報をでヘッダ情報を上書き情報でヘッダ情報をを有効にする上書きき
  11. 12 / 17 課題なく使用可能 • 悩ましい部分はまましい部分けを何とかできはまだある場合は警告ことはある場合は警告 – 時に失われるパラ折ログに出てくるログが取れないのでに切り替えた話出てくるリモートてくる場合は警告リ形式にかわりモートをホストをが 127.0.0.1 のログが取れないので

    • - 77.72.83.225 [10/Nov/2018:18:37:37 +0900] TCP 200 325 0 0.003 "Sakura 127.0.0.1:8443"Sakura "Sakura 96"Sakura "Sakura 325"Sakura "Sakura 0.000"Sakura • 127.0.0.1 - - [10/Nov/2018:18:37:37 +0900] "Sakura \x03\x00\x00/*\ xE0\x00\x00\x00\x00\x00Cookie: mstshash=Administr"Sakura 400 173 "Sakura -"Sakura "Sakura -"Sakura – 上のログの最初ののログが取れないのでの最初にの "Sakura -"Sakura は ClientHello を解釈できなかった時で無料のきなかった話時に失われるパラに切り替えた話出てくるリモートている場合は警告 と推測 – はっきり替えた話言うとそんなものうとそんなものは捨ててててしまいた話い • 意味がないんだからがないんだから無視すればいいといすればいいという話も無いことは無いが... – が、 nginx に切り替えた話は捨てててる場合は警告方法もあることは がない • upstream ディレクティブの中で無料の return は使えない ( と思うのでう ) • ipfw で無料の RST を返すす port を用意してそっちに切り替えた話向けるとか?ける場合は警告とか?
  12. 13 / 17 まとめ • SSTP に切り替えた話よる場合は警告 SSL-VPN と https

    対応を両立させるたを両立ちふさがる壁させる場合は警告た話め に切り替えた話、 Web サーバソフトをを Apache から nginx に切り替えた話変えました話 • アクセスログが取れないのでのリ形式にかわりモートをホストをが 127.0.0.1 に切り替えた話ならないように切り替えた話 PROXY procotol を使ってオリ形式にかわりジの中身を見て処ナルの一つの接続情報をを渡しのためのプロすように切り替えた話 しました話 • お行儀の悪いホス行儀の悪いホストかの悪いホストからのいホストをからのアクセスは相変わらずアクセスログアクセスログが取れないので のリ形式にかわりモートをホストをが 127.0.0.1 に切り替えた話なり替えた話ます • グが取れないのでグが取れないのでってコピペばかりしていなばかり替えた話していないで無料のオフィシャルの一つのド入力欄がキュメン トをもちゃんと読みましょうみましょう
  13. 14 / 17 お行儀の悪いホスまけ • Apache だとどうすればいいの? – SNI で無料のの振り分けを何とかり替えた話分けを何とかできけはで無料のきません。ここは別ポートで待ち受のリ形式にかわりバースプロキシソフトをを

    使うか...もしくは、自分けを何とかできで無料の書きましょう – http サーバは 2.2 系からかれこれは mod_myfixip 、 2.4 系からかれこれは mod_myfixip か 内蔵のの mod_remoteip(2.4.31 から ) を使えば PROXY procotol に切り替えた話対 応を両立させるたで無料のきそう • https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html • RemoteIPProxyProtocol On
  14. 15 / 17 だった話ので無料のすが、 • 実はは SSTP が通らないような環ってませんで無料のした話... – クライアントをから接続する場合は警告とエラー

    • よくよく考えてみると..えてみる場合は警告と... – PROXY procotol を有効にした後に切り替えた話した話後 SSTP のテストををしていない... • proxy_protocol on; の有効にした後範囲って…って… – ( 前の掲の通りの通らないような環り替えた話 ) server {} の中に切り替えた話書いた話んだから、 upstream 毎にに切り替えた話 off / on 制御できるはずがなで無料のきる場合は警告はずアクセスログがない – ド入力欄がキュメントをに切り替えた話は proxy_protocol は stream ブロックもしくは server ブロックで無料の設定だけ可能と記述するが参照資料があり替えた話、それ以下の粒度で制御はの粒度で制御はできなで無料の制御できるはずがなはで無料のきないと 判断 • ということで無料の、 PROXY procotol のヘッダをはがすためにをはがすた話めに切り替えた話もう 一つ段 stream ブロックの中に切り替えた話 server ブロックを用意する場合は警告こと に切り替えた話… • これで無料の本当にうまくいきまに切り替えた話うまくいきました話 ( 汗
  15. 16 / 17 というわけで無料の nginx.conf ( 抜粋 2 改 )

    map $ssl_preread_server_name $name { sstp.d51.net sstp; default nginx; } upstream nginx { server 127.0.0.1:8443; } upstream sstp { server 127.0.0.1:15555; } server { listen 15555 proxy_protocol; listen [::]:15555 proxy_protocol; proxy_pass 127.0.0.1:5555; proxy_protocol off; } } // 接続先のの port 番号はは http 部分けを有効にすると合わせる合わせるわせる // もう 1 周させるためポーさせるためポート番号を変ポート番号はを有効にする変更 ( 下のの listen にポート番号はを有効にする合わせるわせる ) //PROXY procotol ヘッダ情報を上書きを有効にするはがす用の の server ブロックを記載を有効にする追加することで
  16. 17 / 17 本当にうまくいきまのまとめ • SSTP に切り替えた話よる場合は警告 SSL-VPN と https

    対応を両立させるたを両立ちふさがる壁させる場合は警告た話め に切り替えた話、 Web サーバソフトをを Apache から nginx に切り替えた話変えました話 • アクセスログが取れないのでのリ形式にかわりモートをホストをが 127.0.0.1 に切り替えた話ならないように切り替えた話 PROXY procotol を使ってオリ形式にかわりジの中身を見て処ナルの一つの接続情報をを渡しのためのプロすように切り替えた話 しました話 • お行儀の悪いホス行儀の悪いホストかの悪いホストからのいホストをからのアクセスは相変わらずアクセスログアクセスログが取れないので のリ形式にかわりモートをホストをが 127.0.0.1 に切り替えた話なり替えた話ます • グが取れないのでグが取れないのでってコピペばかりしていなばかり替えた話していないで無料のオフィシャルの一つのド入力欄がキュメン トをもちゃんと読みましょうみましょう • 設定だけを変更した後はテストした話後はテストをを忘れずにれずアクセスログに切り替えた話