Wie kann ich über einen Bastion-Host von meinem Linux/macOS-Computer aus eine Verbindung zu meiner Amazon RDS-DB-Instance herstellen?

Lesedauer: 4 Minute
0

Ich habe eine Amazon Relational Database Service (Amazon RDS)-DB-Instance, die nicht öffentlich zugänglich ist. Ich möchte von meinem Linux-/macOS-Rechner aus eine Verbindung dazu herstellen. Wie kann ich über einen Bastion-Host eine Verbindung zu meiner RDS-DB-Instance herstellen?

Kurze Beschreibung

Um eine Verbindung zu einer privaten Amazon RDS- oder Amazon Aurora-DB-Instance herzustellen, empfiehlt es sich, ein VPN oder AWS Direct Connect zu verwenden. Wenn Sie weder ein VPN noch AWS Direct Connect verwenden können, ist die Verwendung eines Bastion-Hosts die bevorzugte Option. Sie können diese Methode auch verwenden, um von außerhalb der VPC eine Verbindung zu Aurora Serverless und RDS Proxy herzustellen. Dieses Beispiel zeigt Ihnen, wie Sie einen Bastion-Host einrichten, um von einem Linux-/macOS-Computer aus eine Verbindung zu Ihrer RDS-DB-Instance herzustellen, auch wenn die RDS-DB-Instance privat ist.

Behebung

1.    Setzen Sie Ihre Amazon RDS DB-Instance auf Privat, indem Sie die DB-Instance ändern. Setzen Sie den öffentlich zugänglichen Parameter bei privaten Subnetzen auf nein (d. h. kein Internet-Gateway — igw in Routing-Tabellen). Stellen Sie die Sicherheitsgruppe so ein, dass die DB den Port (5432, 3306) von allen IPs aus verwenden kann.

2.    Starten Sie die kleinste verfügbare EC2-Instance in derselben VPC wie Ihre DB-Instance. Stellen Sie Ihre Amazon Elastic Compute Cloud (Amazon EC2) -Instance so ein, dass sie über das Internet mit öffentlichen Subnetzen zugänglich ist (d. h. sie hat ein Internet-Gateway — igw in Routing-Tabellen). Legen Sie die Sicherheitsgruppe so fest, dass die IP des Linux-/macOS-Computers zugelassen wird, von dem aus Sie eine Verbindung herstellen möchten.

3.    Führen Sie den folgenden Befehl auf Ihrem Linux-/macOS-Computer aus, um einen Tunnel für die Konnektivität von Ihrem Computer zu erstellen:

Syntax 1:
ssh -i <identity_file> -f -l <bastion-host-username> -L
<local-port-you-connect-to>:<rds-endpoint>:<rds:listening-port>
<bastion-host-public-ip> -v

Example Command:
ssh -i "private_key.pem" -f -l ec2-user -L 5432:172.31.39.62:5432  3.133.141.189 -v

Wenn Sie den obigen Befehl ausführen (SSH-Tunneling), konfigurieren Sie die folgenden Einstellungen:

  • debuggen1: Lokale Verbindungen zu LOCALHOST: 5432 an die Remote-Adresse weitergeleitet 172.31.39.62:5432
  • debuggen1: Lokale Weiterleitung, die auf 127.0.0.1 Port 5432 lauscht.
  • debuggen1: Kanal 0: neuer\ [Port-Listener]
  • debuggen1: Lokale Weiterleitung, die auf**::1** Port 5432 abhört.
Syntax 2:
ssh -i "Private_key.pem" -f -N -L 5433:RDS_Instance_Endpoint:5432 ec2-user@EC2-Instance_Endpoint -v

Example Command:
ssh -i "private.pem" -f -N -L
5433:pg115.xxxx.us-east-2.rds.amazonaws.com:5432
ec2-user@ec2-xxxx-xxx9.us-east-2.compute.amazonaws.com -v

4.    Nachdem das SSH-Tunneling nun eingerichtet ist, können Sie von Ihrem lokalen Linux-/macOS-Computer aus eine Verbindung zu Ihrer DB-Instance herstellen. Das folgende Beispiel stellt eine Verbindung zu PostgreSQL her, Sie können diese Methode jedoch auch verwenden, um eine Verbindung zu MySQL oder einer anderen Engine herzustellen, zu der Sie eine Verbindung herstellen möchten.

Syntax -

psql -hlocalhost -Upostgres -p<local-port-you-connect-to> -d postgres


-h = localhost

-U = the username present in the DB for connectivity

-p = 'local-port-you-connect-to' from the SSH Tunneling command

-d = Any DB, user wish to connect.

Example command -
a483e73d651f:.ssh rahul_saha$ psql -hlocalhost -Upostgres -p5432 -d postgres
Password for user postgres:
psql (12.1, server 11.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin          +
           |          |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

$ psql -hlocalhost -Upostgres -p -d postgres
$ mysql -h127.0.0.1 -uroot -p

**Hinweis:**MySQL versucht, eine Verbindung über den Socket herzustellen, wenn Sie das Schlüsselwort localhost verwenden, wenn Sie eine Verbindung zur DB-Instance herstellen. Stellen Sie sicher, dass Sie beim Zugriff auf eine MySQL-DB-Instance den Hostnamen 127.0.0.1 verwenden. Weitere Informationen finden Sie in der MySQL-Dokumentation zu [Es kann keine Verbindung zum\ lokalen] MySQL-Server hergestellt werden.


Verwandte Informationen

Linux-Bastion-Hosts auf AWS

Wie kann ich von einem lokalen Computer aus eine Verbindung zu einer privaten Amazon RDS-DB-Instance herstellen, indem ich eine Amazon EC2-Instance als Bastion-Host verwende?