Wie kann ich Port-Tunneling verwenden, um über eine Netzwerkbastion eine Verbindung zu einer privaten Datenbankinstanz herzustellen?

12

Ich habe eine Netzwerkbastion, die unter öffentlich zugänglich ist, example.compute-1.amazonaws.comund eine private Postgres-Datenbankinstanz unterpostgres.example.us-east-1.rds.amazonaws.com:5432

Ich kann mit in die Bastion ssh

$ ssh -i key.pem [email protected]

Sobald ich in der Bastion bin, erstelle ich einen SSH-Tunnel mit:

$ ssh -i key.pem -L 5432:postgres.example.us-east-1.rds.amazonaws.com:5432 [email protected]

Ich kann dann überprüfen, ob der Tunnel funktioniert, indem ich mit localhost von der Bastion aus eine Verbindung zur Datenbank herstelle:

$ psql -p 5432 -h localhost -U postgres

Ich kann jedoch keine Remoteverbindung mit der Datenbank herstellen (ohne in der Bastion zu sein).

$ psql -p 5432 -h example.compute-1.amazonaws.com -U postgres
psql: could not connect to server: Connection refused
Is the server running on host "example.compute-1.amazonaws.com" () and accepting
TCP/IP connections on port 5432?

Ich habe die Sicherheitsgruppe der Bastion so konfiguriert, dass eingehender Datenverkehr auf Port 5432 akzeptiert wird.

Benutze ich ssh -Lrichtig? Soll ich es außerhalb der Bastion benutzen? Jeder Rat wäre sehr dankbar.

Dämpfer
quelle

Antworten:

20

Wenn Sie einen SSH-Tunnel erstellen, wird der geöffnete Port nicht der Außenwelt ausgesetzt. Der geöffnete Port ist nur als verfügbar localhost. Sie haben also effektiv einen Tunnel von Ihrer Bastion zu Ihrer Bastion erstellt.

Stattdessen möchten Sie einen Tunnel von Ihrem lokalen Computer durch Ihre Bastion erstellen.

Sie erstellen also Ihren Tunnel als Teil Ihrer Verbindung von Ihrem lokalen Computer zu Ihrer Bastion . Sie müssen keine weitere SSH-Verbindung erstellen.

Lokal würden Sie also Folgendes ausführen:

$ ssh -i key.pem -L 5432:postgres.example.us-east-1.rds.amazonaws.com:5432 [email protected]

Angenommen, postgres.example.us-east-1.rds.amazonaws.com wird in die private IP-Adresse aufgelöst.

Um dann noch lokal eine Verbindung zu Ihrem Server herzustellen, stellen Sie eine Verbindung her, als ob der Server lokal wäre:

$ psql -p 5432 -h localhost -U postgres

Auf diese Weise müssen Sie keine Eingabeaufforderung für Ihre Bastion verwenden.

Matt Houser
quelle
Das hat bei mir funktioniert, danke! Das einzige, was ich für jeden vergessen habe, dessen psql-Befehl nur dort hängt: Stellen Sie sicher, dass Ihre Datenbank-Sicherheitsgruppe den Zugriff von der Bastion aus zulässt.
Goran
-1

Das hat bei mir funktioniert. Stellen Sie sicher, dass Sie den psql-Client lokal installiert haben.

psql --host=myAwsDbEndpointUrl.ciqykqusf0nv.us-west-1.rds.amazonaws.com --port=5432 --username=myUserName --password --dbname=myDbName

Stellen Sie beim Erstellen Ihrer Datenbankinstanz auf aws Folgendes fest:

  1. Nutzername
  2. Passwort
  3. Name der Datenbank
  4. Port-Nummer

Ich musste auch eine Sicherheitsgruppe für die VPC erstellen, in der sich die Datenbank befand. Stellen Sie nach dem Erstellen sicher, dass Ihre Datenbankinstanz diese für ihre Sicherheitsgruppe verwendet. Die Sicherheitsgruppe hat die folgenden Regeln:

inbound--> type:PostgreSQL, protocol:TCP port range:5432, source:0.0.0.0/0

outbound--> type:All Traffic, protocol:All, port range:all, destination:0.0.0.0/0
timxor
quelle
Das geht aber nicht über eine Bastion, oder? Sie verbinden sich gerade direkt mit RDS
RhysC
Es geht durch einen vpc, durch den die rds-Instanz verfügbar gemacht wird. Sie hängen den vpc bei der Erstellung an die rds-Instanz an.
Timxor
Ja, ich denke, die ursprüngliche Frage betraf die Verwendung eines Bastion-Servers in der VPC, sodass die RDS-Instanz nicht öffentlich zugänglich gemacht wird (so habe ich es gelesen)
RhysC
Das war nicht die Frage und Ihre Antwort hilft überhaupt nicht, das Problem zu lösen.
Radko Dinev