私のクライアントには、同じリージョン/データセンターに複数のAWSインスタンスがインストールされています。
私の仕事は、マシンの1つにRedisインスタンスとPostgresqlインスタンスをインストールし、別のマシンからデータストア/データベースにアクセスできるようにすることです。データベースサーバーのLAN IPは172.26.14.232で、データベースクライアントを実行しているサーバーのIPは172.26.0.215です。
Postgresがデータベースサーバーで実行されています。 netstatを使用してこれを確認してください。
[ubuntu@ip-172-26-14-232 DATABA ~]$ sudo netstat -tulpn | grep postgre
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 4539/postgres
クライアントボックスに接続しようとすると、ファイアウォールがアクセスをブロックしているかのように、「接続が拒否されました」というメッセージが表示されます。 netcatは次のことを確認します。
[ubuntu@ip-172-26-0-215 GATE01 ~]$ sudo psql "sslmode=require" --host 172.26.14.232 --user=postgres --password
Password for user postgres:
psql: could not connect to server: Connection refused
Is the server running on host "172.26.14.232" and accepting
TCP/IP connections on port 5432?
[ubuntu@ip-172-26-0-215 GATE01 ~]$ nc -vz 172.26.14.232 5432
nc: connect to 172.26.14.232 port 5432 (tcp) failed: Connection refused
私が知っている限り、ncを使用すると、1つのポートにのみ接続できます。
[ubuntu@ip-172-26-0-215 GATE01 ~]$ nc -vz 172.26.14.232 22
Connection to 172.26.14.232 22 port [tcp/ssh] succeeded!
私の顧客はすべてのファイアウォールルールを削除したと言いましたが、上記の結果を理解できませんでした。
AWSがそのようなネットワークからのアウトバウンドトラフィックをブロックしていることをどこかで読んだが、管理コンソールにアクセスできないため、直接確認することはできません。
ボーナス質問;-)
次を発見しましたこれ場所:
netcat -vzw 15ドメイン名.com 21
成功すると、以下が表示されます。
domain.comポート21 [tcp/ftp]に正常に接続されました!
ポート接続がブロックまたは拒否されると、次のようになります。
nc:ドメインポート21(tcp)への接続に失敗しました:接続が拒否されました。
著者はおそらく「ブロック」と「拒否」を区別したでしょう。後者の場合、ファームウェアルール「DENY」がこのポートにインストールされたことを意味すると仮定しますが、「ブロック」が何を意味するのかわかりません。 。第二の技術的可能性はありますか?それとも単に「遮断」と「拒否」を同義語で使用しているのでしょうか?
編集する:
驚くべきことに、ncを使用してクライアント - サーバー接続を確立することができます(データベースを閉じた後)。
[ubuntu@ip-172-26-14-232 DATABA ~]$ nc -l 5432
[ubuntu@ip-172-26-0-215 GATE01 ~]$ nc 172.26.14.232 5432
hello
172.26.14.232で次のようになります。
hello
答え1
出力によると、netstat
postgresサーバーは127.0.0.1(ループバックインターフェース)の接続のみを受信しています。
アドレスが172.26.14.232のインターフェイスを含む他のインターフェイスは接続を許可しません。
3つの主なオプションがあります。
172.26.14.232 アドレスからの接続を許可するように postgres を再設定します。
セキュリティのために、特定のホスト(172.26.0.215など)のみがpostgresに接続できるようにファイアウォールルールを追加する必要があります。
172.16/12 RFC-1918 プライベートアドレスを使用していることがわかりますが、お客様のサブネットが他の AWS お客様と完全に隔離されているかどうかは不明です。サブネットが完全に隔離されている場合は、ファイアウォールルールなしで実行するのは安全です(ファイアウォールルールを設定することをお勧めしますが、必要に応じていつでもアクセスできますが、ハッカー攻撃をキャンセルすることはできません)。
2 つのサーバー間に一種の VPN を設定します。 VPN インターフェイスで接続を許可するように postgres を設定します。
ssh
ポート転送を使用してください。たとえば、172.26.0.215 で次のコマンドを実行する場合:ssh -N -L 5432:127.0.0.1:5432 [email protected]
&
SSHキーで認証する場合は、このコマンドをバックグラウンドで実行できます(またはパスワードを押して認証し、実行してバックグラウンドで送信CtrlしZますbg
)。または別のSSHセッション(psqlなどを実行したいセッション)でまたはtmux
またはセッションでscreen
。これにより、ローカルコンピュータの127.0.0.1:5432からリモートコンピュータの127.0.0.1:5432に接続が転送されます。 psql(またはperlスクリプトの使用を含む他のpostgresクライアント)を使用して接続できます。データベースインタフェースそしてDBD::PgまたはPythonで心理PG3)。
はい(172.26.0.215):
psql "sslmode=require" --host localhost --user=postgres --password
psql
ローカルシステムのlocalhost:5432に接続しますが、sshはそれをリモートシステムのlocalhost:5432に渡します。必要になります。
- リモートシステムからpostgresqlに接続する必要があるたびにこのコマンドを実行するか、
- 接続を開始し、切断された場合に再起動するようにsystemdユニットファイル(またはsystemdを使用しない場合は別のファイル)を設定します。これを自動化するには、パスワードの代わりにSSHキーを使用して認証する必要があります。とにかくこれを行う必要があります。
必要に応じて、redis(通常はlocalhost:6379でリッスン)を使用して同じことを実行できます。
ところで、をsudo
実行する必要はありませんpsql
。