これは非常に基本的なAmazon EC2の質問ですが、私は困惑しているので、ここに行きます。
Amazon EC2インスタンスを起動し、どこからでもポート80および8888でHTTPへのアクセスを許可したいのですが。これまでのところ、インスタンスが独自のIPアドレスを使用してこれらのポートに接続することはできません(ただし、ローカルホストに接続します)。
管理コンソール(およびSSH)の標準HTTPオプションを使用して、HTTPの「デフォルト」セキュリティグループを設定しました。
インスタンスをデフォルトのセキュリティグループで起動しました。
SSHポート22でインスタンスに2回接続し、1つのウィンドウでポート80でHTTPサーバーを起動します。もう1つのウィンドウで、「localhost」を使用してHTTPに接続できることを確認します。
ただし、パブリックDNSまたはプライベートIPアドレスのいずれかを使用してインスタンス(またはその他の場所)からHTTPにアクセスしようとすると、「接続が拒否されました」と表示されます。
私は何を間違っていますか?
以下は、成功するwgetと失敗する2つがインスタンス自体から実行されることを示すコンソールフラグメントです。
--2012-03-07 15:43:31-- http://localhost/
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: /__whiff_directory_listing__ [following]
--2012-03-07 15:43:31-- http://localhost/__whiff_directory_listing__
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: “__whiff_directory_listing__”
[ <=>
] 7,512 --.-K/s in 0.03s
2012-03-07 15:43:31 (263 KB/s) - “__whiff_directory_listing__” saved [7512]
[ec2-user@ip-10-195-205-30 tmp]$ wget http://ec2-50-17-2-174.compute-1.amazonaws.com/
--2012-03-07 15:44:17-- http://ec2-50-17-2-174.compute-1.amazonaws.com/
Resolving ec2-50-17-2-174.compute-1.amazonaws.com... 10.195.205.30
Connecting to ec2-50-17-2-174.compute-1.amazonaws.com|10.195.205.30|:80... failed:
Connection refused.
[ec2-user@ip-10-195-205-30 tmp]$ wget http://10.195.205.30/
--2012-03-07 15:46:08-- http://10.195.205.30/
Connecting to 10.195.205.30:80... failed: Connection refused.
[ec2-user@ip-10-195-205-30 tmp]$
標準のtcpソケットインターフェイスでは、送信またはリッスンするときに特定のIPアドレスにバインドする必要があります。多少特別なアドレスがいくつかあります:localhost(おそらくご存知でしょう)は127.0.0.1です。特別なアドレス、0.0.0.0またはINADDR_ANY(インターネットプロトコル、ANY ADDRESSの特別な省略形)もあります。これは、ホスト上の任意のアドレスまたはより一般的なすべてのアドレスをリッスンする方法です。これは、特定のIPアドレスに興味がないことをカーネル/スタックに伝える方法です。
したがって、「localhost」をリッスンするサーバーを設定するときは、このホストのユーザーのみが到達できる特別な予約済みアドレスを使用することをサービスに伝え、すべてのホストに存在している間、 localhostへの接続は、リクエスト元のホストにのみ到達します。
すべての場所(ローカルホスト上、すべてのインターフェイス上など)でサービスに到達可能にする場合は、0.0.0.0を指定できます。
(0)ばかげていますが、最初に行う必要があるのは、Webサーバーが実行されていることを確認することです。
(1)着信HTTPパケットがWebサイトにアクセスできるように、セキュリティグループを編集する必要があります。ウェブサイトがポート80でリッスンしている場合は、セキュリティグループを編集して、上記のようにポート80へのアクセスを開く必要があります。ウェブサイトが他のポートでリッスンしている場合は、セキュリティグループを編集して、他のポートにアクセスする必要があります。
(2)Linuxインスタンスを実行している場合、iptablesファイアウォールがデフォルトで実行されている可能性があります。次のコマンドを実行して、このファイアウォールがアクティブであることを確認できます
Sudoサービスiptablesステータス
コマンドラインで。出力が得られれば、iptablesファイアウォールが実行されています。 「Firewall not running」というメッセージが表示された場合、それは一目瞭然です。通常、iptablesファイアウォールはデフォルトで実行されています。
ファイアウォールをノックアウトするか、ファイアウォールの構成を編集してHTTPトラフィックを通過させるかの2つのオプションがあります。私はファイアウォールをより簡単なオプションとしてノックアウトすることを選びました(私にとって)。
sudo service iptables stop
iptablesがアクティブの場合、Amazonのファイアウォールの機能を複製するだけなので、iptablesをシャットダウンしても実際のセキュリティリスクはありません。セキュリティグループを使用して構成ファイルを生成する。ここでは、Amazon AWSがファイアウォールを誤って設定していないことを想定しています。これは非常に安全な想定です。
(3)これで、ブラウザからURLにアクセスできます。
(4)Microsoft Windowsサーバーもデフォルトでパーソナルファイアウォールを実行します。Windowsサーバーのパーソナルファイアウォールも修正する必要があります。
修正:AWSのデフォルトでは、新しいEC2インスタンスの作成を注文するときに、AWSはiptables(Centos)やUAF(Ubuntu)などのサーバーファイアウォールを起動しません-これが、同じVPC内のEC2インスタンスが互いにSSH接続できる理由です。同じVPC内の別のEC2インスタンスから起動したWebサーバーを「確認」できます。
RESTful APIがすべてのインターフェース、つまり0.0.0.0:portIDでリッスンしていることを確認してください
接続が拒否される(パケットが拒否される)ので、それはiptablesが問題を引き起こしているに違いない。実行してみてください
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 8888 -j ACCEPT
接続をテストします。
また、上記の行をieに追加することで、これらのルールを永続的に追加する必要があります。 Red Hatを実行している場合は、/ etc/sysconfig/iptables。
すべての着信TCPインターフェイス(?)に対してポート80に応答するために0.0.0.0にバインドする必要があったのに対し、私は「localhostにバインド」していたようです。これは、TCP/IPの微妙な問題です。まだ完全にはわかりませんが、問題は解決しました。
アマゾンのサポートがそれに答え、それは即座に機能しました:
この問題をテスト用のUbuntuインスタンスで再現し、解決することができました。問題は、Ubuntu/Unixで1024未満のポートでTomcatを実行するために、サービスにルート権限が必要であることです。ルート権限でポート80でプロセスを実行することは不要なセキュリティリスクであるため、一般的には推奨されません。
私たちがお勧めするのは、iptablesを介したポートリダイレクションの使用です。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
上記の情報がお役に立てば幸いです。
以下を実行する必要がありました:
1)インスタンス構成でHTTPアクセスを有効にします。デフォルトではSSHのみではありませんでした。2)nodejsサーバーを実行しようとしたため、ポートが80にバインドされました-> 3000で次のコマンドを実行して修正しました
iptables -F
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
Sudo service iptables-persistent flush