web-dev-qa-db-ja.com

ngrokはファイアウォールの背後でどのように機能しますか?

Ngrok( https://ngrok.com/ )を使用すると、ローカルポートとサービスを転送を通じてWorld Wide Webに公開できます。しかし、次のようにローカルマシンのポート80を開くと、

ngrok 80

そして私は戻ってきます:

Tunnel Status                 online
Version                       1.3/1.3
Forwarding                    http://3a4bfceb.ngrok.com -> 127.0.0.1:80
Forwarding                    https://3a4bfceb.ngrok.com -> 127.0.0.1:80
Web Interface                 http://127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

http://3a4bfceb.ngrok.com へのリクエストはすべてローカルマシンのポート80に送信されることを理解していますが、NAT /ファイアウォールの後ろに座って、着信トラフィックをブロックしている場合(非常に一般的)シナリオ)。 ngrokはポーリング要求を開始して、データがいつ受信されたかを判断しますか?

37
asolberg

Ngrokトンネルは常にクライアント側で最初に開始されるため、これはサーバーと安全なチャネルをネゴシエートできる方法です。これは、従来のファイアウォール構成を回避するための非常に洗練されたソリューションです。

これは、1つの物理ソケット接続内に多数の論理ソケットが作成される単一の長期TCP接続をクライアントが開くことにより、内部的に実現されます。この手法は ストリーム多重化 と呼ばれます。この設定が適切に行われていれば、クライアントとサーバーは完全に双方向の通信を維持しているため、いかなる種類のポーリングも必要ありません。

その後、クライアントとサーバーは、接続が開いていて適切に機能していることを確認するハートビートメカニズムで生き続け、エラーが発生したり、接続が失われたり閉じたりした場合でも再接続します。

詳細はこちらをご覧ください: github.comの開発者ガイド

105
Ralph Caraveo

Authtokenなしで基本的なhttp-https-tcpトンネルを作成できます。カスタムサブドメインなどについては、ngrok.comにサインアップしてauthtokenを取得する必要があります。設定すると、ngrok configに保存され、すべてのトンネルで使用されます。いくつかの方法:

ngrok.authtoken(トークン)を待つ; ngrok.connect({authtoken:token、...});を待ちます。

0
Rosa Mel cacho