1. ホーム
  2. php

ngrokの構築でよくある間違い

2022-02-11 16:12:49

問題への対処

1. 有効な http リクエストの読み込みに失敗しました: 不正な HTTP リクエスト 

[2019/05/07 17:11:36 CST] [DEBG] (ngrok/log.(*PrefixLogger).Debug:79) [ctl:12defafc] Waiting to read message
[2019/05/07 17:11:46 CST] [DEBG] (ngrok/log.(*PrefixLogger).Debug:79) [ctl:12defafc] Closing
[2019/05/07 17:11:46 CST] [EROR] (ngrok/log.Error:120) control recovering from failure EOF

サーバー側のログ

[09:11:23 UTC 2019/05/07] [WARN] (ngrok/log.(*PrefixLogger).Warn:87) [pub:662c9e97] Failed to read valid https request: malformed HTTP request & quot;\u007f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\"Type\\":\"Auth\",\"Payload\":{\"Version\":\" 2\\quot;,\"MmVersion\quot;:\"1.7\",\"User\quot;:\"\"\",\"Password\quot;:\"\",\" OS\":\"windows\",\"Arch\":\"amd64\",\"ClientId\":\"\"}}"
[09:11:49 UTC 2019/05/07] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting: {"bytesIn.count":0,"bytesOut. count":0,"connMeter.count":0,"connMeter.m1":0,"httpTunnelMeter.count":0,"linux":0," quot;osx":0,"other":0,"tcpTunnelMeter.count":0,"tunnelMeter.count":0,"tunnelMeter.m1" :0,"windows":0}


ngrok.cfg ファイルのポート番号が、Listening for control and proxy connections on [::] と同じであることを確認します。 4443 ポート番号が一致する。

2.[EROR] (ngrok/log.Error:120) control recovering from failure dial tcp: lookup ngrok.xxx.com on 100.8.8.100:100: no such host.

  DNSが解決しないので、IPドメインを/etc/hostsに書き込んでください。

3. 

[EROR] (ngrok/log.Error:120) control recovering from failure dial tcp 52.194.135.42:4433: connectex: 接続先が一定時間経過しても適切に応答しないため、接続に失敗しました。または、接続先ホストが応答しないため、確立した接続に失敗しました。 

対応するポートが開いておらず、セキュリティグループやファイアウォールが解除した

4.

......Failed to read message: remote error: bad certificate......メッセージの読み込みに失敗しました。

   ngrok.cfgファイルのドメイン名が、証明書作成時に使用したドメイン名と一致していることを確認してください。

   クライアントマシンのシステム時刻が現在の月と年であることを確認します。


ビルドチュートリアル

ステップ 1: go コンパイル環境のインストール (ngrok は go 言語で開発されています)

    1. goのダウンロード:http://www.golangtc.com/download サーバーシステムに対応するバージョンをダウンロードすればよい。私のシステムは、CentOSの64ビットで、私はgo1.6rc2.linux-amd64.tar.gzをダウンロードしました。

    2. goを/usr/local/goに解凍する。

    3. リンクを構築する: ln -s /usr/local/go/bin/* /usr/bin/

ステップ2:ngrokのソースコードをダウンロードする

バッシュ

cd /usr/local/src/
git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=/usr/local/src/ngrok/
export NGROK_DOMAIN="ngrok.zpblog.cn"
cd ngrok

ステップ3:自己署名入り証明書を作成する

    ngrok.comの公式サービスを利用する場合、公式のSSL証明書を使用します。独自のngrokdサービスを構築するためには、独自の証明書を生成し、その証明書を搭載したngrokクライアントを提供する必要があります。

バッシュ

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt 
cp device.key assets/server/tls/snakeoil.key

ステップ4:サーバーとクライアントのコンパイル開始

    1. サーバーサイド

    サーバーサイドは簡単で、まず自分の環境変数を指定して、それからmakeします。

バッシュ

GOOS=linux GOARCH=amd64
# If it's a 32-bit system, here GOARCH=386

    次に

バッシュ

make release-server

    定義上は正常にコンパイルできるはずなのですが、コンパイル時に多くの依存関係を自動的にダウンロードする必要があることがわかり、あるパッケージの

    log4goはアクセスできないので、ソースコードを変更してパッケージをgithubのアドレスに変更します。

    usr/local/src/ngrok/src/ngrok/log/logger.go を探し、import の5行目の log パッケージを log "github.com/keepeye/log4go" に変更します。

    そして、release-serverを作り直します。

    コンパイルに成功すると、/usr/local/src/ngrok/bin以下にngrokdの実行ファイルができ、これが現在のサーバーとなります。

バッシュ

bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" -httpsAddr=":4433"

    エラーが報告されない場合、以下のような出力が表示されます。

バッシュ

[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8000
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:4433
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443


    ctrl+cで終了してください。クライアントのコンパイルがまだ必要です。

    2. クライアント

    1.1、Windowsクライアント

GOOS=windows GOARCH=amd64 make release-client  

cd /usr/local/go/src
GOOS=windows GOARCH=amd64 . /make.bash
cd -
GOOS=windows GOARCH=amd64 make release-client
#amd64 here is a 64-bit system, change 32-bit to 386
# This should generate the ngrok client program in bin/windows_amd64 directory

    1.2. Raspberry Piクライアント

cd /usr/local/go/src
GOOS=linux GOARCH=arm . /make.bash
cd -
GOOS=linux GOARCH=arm make release-client
# ngrok client should be generated in the bin/linux_arm directory



1.3 マック

GOOS=darwin GOARCH=amd64 make release-client
binディレクトリを実行して対応するwindows, macディレクトリを生成した後、対応するディレクトリにngrok.exeが格納されます。対応するngrok.exeをローカルにダウンロードします。

先ほどと同じように、以下のプロンプトでサーバーのngrokdを起動します。

. /bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="xxx.xyz" -httpAddr=":80" -httpsAddr=":443"

公開されたhttp接続を[::]:8000でリスンしています。

公開されたhttpsの接続を[::]:4433でリスンしています。

コントロールとプロキシ接続を [::]:4443 でリスンする。

この2つのポート8000と4443を覚えておいてください。

8. ローカルクライアントのセットアップ

(1) 同じ階層のディレクトリに設定ファイル ngrok.cfg を新規に作成します。

server_addr: "xxx.xyz:4443"  
trust_host_root_certs: false  

なお、設定ファイルでは、ポート4443が使用されています。
(2) 同じ階層のディレクトリに起動スクリプト startup.bat を新規に作成します。

@echo on
cd %cd%
#ngrok -proto=tcp 22
#ngrok start web
ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=yjc 8080



ここで、-configは設定ファイルを指し、-logはログファイルの場所を格納し、-subdomainはカスタムドメインの接頭辞です。8080はポート番号です。

(3) 起動は、起動スクリプトstartup.batをクリックして起動を完了するか、cmdで以下のコマンドを実行します。 

. /ngrok -config=. /ngrok.cfg -subdomain=test 80

パラメータを説明するため。

バッシュ

-config is the path to the above configuration file ngrok.cfg
-subdomain is the prefix part of the domain name that needs to be assigned
80 is the port of the local websever, such as the port apache is listening on, and ngrok will map requests to that port later.

次のような出力が表示されます。

バッシュ

Tunnel Status online
Version 1.7/1.7
Forwarding http://test.ngrok.zpblog.cn:8000 -> 127.0.0.1:80
Forwarding https://test.ngrok.zpblog.cn:8000 -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms