Mysql

Unable to connect to RDS instance from outside VPC (ERROR 2003 (HY000) Can’t connect to MySQL Server)

  • January 26, 2018

我創建了一個 VPC,並在其中創建了一個 RDS 實例。RDS 實例可公開訪問,其設置如下:

RDS 設置

附加到 RDS 實例的安全組接受所有流量:

安全組設置

我所有的網路 ACL 都接受所有流量。但是,我無法從我的 VPC 之外的機器訪問我的實例。我收到以下錯誤:

   root@vps151014:~# mysql -h mysql1.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com -P 3306 -u skullberry -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on 'mysql1.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com' (110)

如果我從 VPC 內的 EC2 執行相同的命令,我就可以連接。我試過從幾台機器連接,它們都沒有防火牆(即埠 3306 打開)。

我顯然遺漏了一些東西,但一切似乎都配置正確。可能是什麼問題?

要使 VPC 中的 RDS 實例“公開”(Internet)可訪問,它所連接的所有子網都必須是 VPC 的“公共”子網,而不是“私有”子網。

公共子網本質上定義為以 Internet 網關對象 (igw-xxxxxxxx) 作為其到“Internet”或至少到您需要訪問的任何 Internet 目的地的路由的子網。通常,這是 的目標地址0.0.0.0/0。公共子網必須用於將具有關聯公共 IP 地址的實例(包括 RDS),並且不應用於沒有公共 IP 地址的實例,因為私有地址在沒有轉換的情況下無法在 Internet 上工作。

相比之下,私有子網將其路由表配置為通過另一個 EC2 實例(通常是 NAT 實例)到達 Internet 目的地。這在與該子網關聯的 VPC 路由表中顯示為 i-xxxxxxxx,而不是“igw”。該機器(它本身實際上將位於與其作為路由目的地的子網不同的子網中)充當翻譯器,允許僅私有 IP 實例使用 NAT 機器的公共透明地發出出站 Internet 請求IP 滿足他們的 Internet 需求。如果連接到私有子網,則具有公共 IP 地址的實例無法與 Internet 正確互動。

在此特定情況下,與 RDS 實例關聯的子網並未真正配置為可以簡單地歸類為私有子網或公共子網的東西,因為子網根本沒有預設路由。通過“igw”對象添加預設路由,或者像 OP 所做的那樣,將靜態路由添加到需要連接的 Internet IP 地址到子網的 VPC 路由表中,從而解決了連接問題。

但是…如果您遇到類似的問題,您不能簡單地更改路由表或建構新的路由表並將子網與它們關聯,除非您沒有其他任何東西已經在子網上正常工作,因為更改可能是合理的預計會破壞現有的連接。在這種情況下,正確的做法是為不同子網上的實例提供正確的路由表條目。

在設置 VPC 時,理想的做法是明確定義子網角色並在 VPC 首次調試時充分預置必要的路由。同樣重要的是要記住整個 VPC“LAN”是一個軟體定義的網路。與物理網路不同,在物理網路中,路由器可能成為瓶頸,並且通常明智的做法是將它們之間流量大的機器放在同一子網中……跨子網的流量在 VPC 上沒有性能劣勢。機器應放置在適合機器 IP 定址需求的子網中——公共地址、公共子網;沒有公共地址,私有子網。

更多關於 VPC 中私有/公共子網物流的討論可以在為什麼我們需要 VPC 中的私有子網(在 Stack Overflow)中找到。

引用自:https://serverfault.com/questions/706819