Connectを使用して小さなnode.jsアプリを作成しました。このアプリはWebページを提供し、定期的に更新を送信します。また、ユーザーの観察結果を受け入れてディスクファイルに記録します。
Localhostにいる限り問題なく動作しますが、同じイントラネット上で他のコンピューターにアクセスさせることはできません。ポート3000を使用していますが、ポート8080または80に変更しても解決しませんでした。
接続のセットアップに使用しているコードは次のとおりです。
var io = require('socket.io'),
connect = require('connect');
var app = connect().use(connect.static('public')).listen(3000);
var chat_room = io.listen(app);
上記のように、ポート番号を8080または80に変更しようとしましたが、違いは見られなかったため、ファイアウォールの問題だとは思いません(間違っている可能性があります)。 HTTPを扱った同様の質問を読んだ後、listen()に0.0.0.0を追加することも考えましたが、listen()がIPマスクパラメータを取るとは思われません。
ほとんどの場合、サーバーソケットは、「すべてのIPアドレス」のシンボリックIP 127.0.0.1
ではなく、ループバックIPアドレス0.0.0.0
にバインドされています(これはネットマスクではないことに注意してください)。これを確認するには、Sudo netstat -ntlp
(Linuxの場合)またはnetstat -an -f inet -p tcp | grep LISTEN
(OSX)を実行し、プロセスがバインドされているIPを確認します( ":3000"の行を探します)。 「127.0.0.1」が表示される場合、それが問題です。 listen
呼び出しに「0.0.0.0」を渡すことで修正します。
var app = connect().use(connect.static('public')).listen(3000, "0.0.0.0");
他のユーザーがローカルマシンにアクセスするには、通常 ngrok を使用します。 Ngrokは、localhostをWebに公開し、インストールと起動が簡単なNPMラッパーを備えています。
$ npm install ngrok -g
$ ngrok http 3000
この使用例を参照してください。
上記の例では、ローカルで実行されている帆のインスタンス:localhost:3000は、次の場所にあるインターネットで利用可能です:http://69f8f0ee.ngrok.ioまたはhttps://69f8f0ee.ngrok.io
0.0.0.0へのバインドは、戦闘の半分です。 TCPポートをブロックするIPファイアウォール(システム環境設定のファイアウォールとは異なります。したがって、ポートをブロック解除する必要があります。
Sudo ipfw add <PORT NUMBER> allow tcp from any to any
アプリで、ネットワーク内の任意のデバイスから到達可能にします
app.listen(3000, "0.0.0.0");
Azure、GCP、AWSのNodeJSの場合
リソースマネージャーにデプロイされたAzure vmの場合、仮想ネットワークセキュリティグループをチェックし、ポートまたはポート範囲を開いて到達可能にします。
GCPとAWSで同等のものを探す
この問題の非常に簡単な解決策があります:process.argv
は、ノードアプリに渡される引数のリストを提供します。だからあなたが実行した場合:
node server.js 0.0.0.0
あなたが取得します:
process.argv[0] //=> "node"
process.argv[1] //=> "server.js"
process.argv[2] //=> "0.0.0.0"
したがって、process.argv[2]
は、リッスンするIPアドレスとして指定します。
http.listen(3000, process.argv[2]);
これで、アプリは「すべて」のIPアドレスをリッスンしています。たとえば、 http://192.168.1.4:3000/your_app です。
これが誰かを助けることを願っています!
FedoraまたはCentos distroでselinuxとfirewalldを確認してください。私の場合、firewalldが接続を妨げました。
Selinux:$ sestatus SELinuxステータス:有効 SELinuxfsマウント:/sys/fs/selinux SELinuxルートディレクトリ:/etc/selinux ロードされたポリシー名:ターゲット 現在のモード:{{checkmode}} 設定ファイルからのモード:{{checkconfig}} ポリシーMLSステータス:有効 ポリシーdeny_unknownステータス:許可 最大カーネルポリシーバージョン:30 Firewalldステータス:$ systemctl status firewalld
この行で私のために働いています(単に実行時に-listenを追加してください):
node server.js -p 3000 -a : --listen 192.168.1.100
それが役に立てば幸い...
この問題にかなりの時間苦労した後、ポート8080での着信接続を許可することで問題を解決できました。
.listen(8080, "0.0.0.0")
ソリューションがうまくいかないと書いたので、ポート8080での接続がファイアウォールを通過できることを確認してください。
この投稿 Windowsファイアウォールの設定で新しい受信ルールを作成するのに役立ちました。