ไม่สามารถเชื่อมต่อกับอินสแตนซ์ RDS จากภายนอก VPC (ERROR 2003 (HY000) ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL)


12

ฉันสร้าง 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)

หากฉันเรียกใช้คำสั่งเดียวกันจาก EC2 ภายใน VPC ของฉันฉันสามารถเชื่อมต่อได้ ฉันได้ลองเชื่อมต่อจากหลาย ๆ เครื่องทั้งหมดนั้นไม่มีไฟร์วอลล์ (เช่นพอร์ต 3306 เปิด)

เห็นได้ชัดว่าฉันขาดอะไรบางอย่าง แต่ดูเหมือนว่าทุกอย่างจะถูกกำหนดค่าอย่างถูกต้อง มีปัญหาอะไรบ้าง?


1
(110)ในข้อผิดพลาดหมายถึงข้อความ "การเชื่อมต่อหมดเวลา" ดังนั้นแน่นอนนี่คือปัญหาการเชื่อมต่อ IP อินสแตนซ์ RDS ของคุณแสดงว่าเชื่อมโยงกับเครือข่ายย่อยสองเครือข่าย ในคอนโซล VPC เส้นทางเริ่มต้นของเครือข่ายย่อยทั้งสองนั้นคืออะไร คือ "igw-xxxxxxxx" หรือเป็น "i-xxxxxxxx"
Michael - sqlbot

ซับเน็ตทั้งสองนั้นสัมพันธ์กับตารางเส้นทางหลักของ VPC โดยปริยาย
dazedviper

1
เชื่อมโยงเครือข่ายย่อยทั้งสองเข้ากับตารางเส้นทางที่กำหนดเองอย่างชัดเจนซึ่งกำหนดเส้นทางการรับส่งข้อมูลขาออกทั้งหมดไปยังอินเทอร์เน็ตเกตเวย์ของ VPC ไม่แตกต่างกัน
dazedviper

1
นั่นเป็นคนเกียจคร้าน เส้นทางเริ่มต้นไปที่ "igw" ดูเหมือนจะเป็นชิ้นส่วนที่ขาดหายไปมากที่สุด ... และในกรณีใด ๆ ก็ตามที่จำเป็นสำหรับการทำงาน สมมติว่าคุณให้เวลากับ VPC เพียงพอที่จะกำหนดค่าตัวเองใหม่ในพื้นหลังหลังจากเปลี่ยนการกำหนดค่าเครือข่ายย่อยตามลำดับฉันไม่มีความคิด
Michael - sqlbot

2
อาบล็อกที่คุณต้องการสำหรับที่อยู่ IP 0.0.0.0/0ทั้งหมด ฉันจะโพสต์คำตอบ
Michael - sqlbot

คำตอบ:


21

สำหรับอินสแตนซ์ RDS ใน VPC เป็น "สาธารณะ" (อินเทอร์เน็ต) ที่สามารถเข้าถึงได้เครือข่ายย่อยทั้งหมดที่แนบจะต้องเป็น "สาธารณะ" - ซึ่งต่างจาก "ส่วนตัว" - เครือข่ายย่อยของ VPC

Public subnet นั้นถูกกำหนดให้เป็น Subnet ที่มีวัตถุ Internet Gateway (igw-xxxxxxxx) เป็นเส้นทางไปยัง "อินเทอร์เน็ต" หรืออย่างน้อยที่สุดไปยังปลายทางอินเทอร์เน็ตใด ๆ ที่คุณต้องการเข้าถึง 0.0.0.0/0โดยปกติแล้วจะเป็นที่อยู่ปลายทางของ ต้องใช้ซับเน็ตสาธารณะสำหรับอินสแตนซ์ (รวมถึง RDS) ที่จะมีที่อยู่ IP สาธารณะที่เกี่ยวข้องและไม่ควรใช้สำหรับอินสแตนซ์ที่ไม่มีที่อยู่ IP สาธารณะเนื่องจากที่อยู่ส่วนตัวไม่ทำงานผ่านอินเทอร์เน็ตโดยไม่ต้องแปล

ตรงกันข้าม subnet ส่วนตัวมีตารางการกำหนดเส้นทางเพื่อเข้าถึงปลายทางอินเทอร์เน็ตผ่านอินสแตนซ์ EC2 อื่นโดยทั่วไปเป็นอินสแตนซ์ NAT สิ่งนี้แสดงในตารางเส้นทาง VPC ที่เชื่อมโยงกับซับเน็ตนั้นเป็น i-xxxxxxxx แทนที่จะเป็น "igw" เครื่องนั้น (ซึ่งตัวมันเองจะอยู่บนเครือข่ายย่อยที่แตกต่างจากที่ทำหน้าที่เป็นปลายทางของเส้นทาง) ทำหน้าที่เป็นนักแปลช่วยให้อินสแตนซ์ส่วนตัว - IP เพียงอย่างเดียวทำการร้องขออินเทอร์เน็ตขาออกโดยใช้เครื่อง NAT ของสาธารณะ IP สำหรับอินเทอร์เน็ตที่ต้องการ อินสแตนซ์ที่มีที่อยู่ IP สาธารณะไม่สามารถโต้ตอบกับอินเทอร์เน็ตได้อย่างถูกต้องหากเชื่อมต่อกับซับเน็ตส่วนตัว

ในกรณีเฉพาะที่นี่ซับเน็ตที่เชื่อมโยงกับอินสแตนซ์ RDS ไม่ได้ถูกกำหนดค่าให้เป็นสิ่งที่สามารถจำแนกได้ว่าเป็นซับเน็ตส่วนตัวหรือสาธารณะเนื่องจากซับเน็ตไม่มีเส้นทางเริ่มต้นเลย การเพิ่มเส้นทางเริ่มต้นผ่านวัตถุ "igw" หรือตามที่ OP ทำเพิ่มเส้นทางแบบคงที่ไปยังที่อยู่ IP ของอินเทอร์เน็ตที่จำเป็นต้องมีการเชื่อมต่อลงในตารางเส้นทาง VPC สำหรับเครือข่ายย่อยเพื่อแก้ไขปัญหาการเชื่อมต่อ

อย่างไรก็ตาม ... หากคุณพบปัญหาที่คล้ายกันคุณไม่สามารถเปลี่ยนตารางเส้นทางหรือสร้างตารางเส้นทางใหม่และเชื่อมโยงเครือข่ายย่อยกับพวกเขาเว้นแต่คุณจะไม่มีอะไรทำงานได้อย่างถูกต้องบนเครือข่ายย่อยเนื่องจากการเปลี่ยนแปลงอาจจะสมเหตุสมผล คาดว่าจะทำลายการเชื่อมต่อที่มีอยู่ หลักสูตรที่ถูกต้องในกรณีนั้นคือการจัดเตรียมอินสแตนซ์บนเครือข่ายย่อยต่าง ๆ พร้อมรายการตารางเส้นทางที่ถูกต้อง

เมื่อทำการตั้งค่า VPC มันเหมาะอย่างยิ่งที่จะกำหนดบทบาทซับเน็ตและจัดเตรียมอย่างสมบูรณ์พร้อมกับเส้นทางที่จำเป็นเมื่อ VPC ถูกมอบหมายครั้งแรก สิ่งสำคัญคือต้องจำไว้ว่า "LAN" VPC ทั้งหมดเป็นเครือข่ายที่กำหนดโดยซอฟต์แวร์ แตกต่างจากในเครือข่ายจริงที่เราเตอร์สามารถกลายเป็นคอขวดและมักจะเหมาะสมที่จะวางเครื่องที่มีปริมาณการใช้งานหนาแน่นในเครือข่ายเดียวกัน ควรวางเครื่องไว้บนซับเน็ตที่เหมาะสมกับความต้องการในการระบุที่อยู่ IP ของเครื่อง - ที่อยู่สาธารณะ, ซับเน็ตสาธารณะ ไม่มีที่อยู่สาธารณะ subnet ส่วนตัว

การอภิปรายเพิ่มเติมเกี่ยวกับโลจิสติกส์ของเครือข่ายส่วนตัว / สาธารณะใน VPC สามารถพบได้ในเหตุผลที่เราต้องการ Private Subnet ใน VPC (ที่ Stack Overflow)


2

นี่เป็นคำตอบที่ยอดเยี่ยม แต่ AWS สร้างซับเน็ตสาธารณะให้คุณเมื่อคุณเลือกตัวเลือก ค่อนข้างสำหรับฉันปัญหาคือกลุ่มความปลอดภัย VPC เริ่มต้น ผมกำลังมองไปที่เครือข่าย ACLกฎ - ไม่รักษาความปลอดภัยกลุ่ม (การเลือกตัวเลือก "สาธารณะที่เข้าถึงได้" ใน RDS จะเพิ่มกลุ่มความปลอดภัย แต่ไม่เพิ่มกฎขาเข้าโดยอัตโนมัติ)

คลิก RDS และระบุและคลิกที่กลุ่มความปลอดภัย ภายใต้ "กฎขาเข้า" ให้เพิ่มพอร์ต 3306 และเพิ่มที่อยู่ IPV4 ที่เชื่อมต่อของคุณ, xxxx / 32 (หรือ 0.0.0.0/32 - หากคุณต้องการให้อินเทอร์เน็ตทั้งหมดเชื่อมต่อ - แต่ต้องระวังด้วย)


0

ตรวจสอบเพื่อให้แน่ใจว่าเครือข่ายที่คุณเชื่อมต่อไม่ได้บล็อกการเชื่อมต่อกับเซิร์ฟเวอร์อื่นที่พอร์ต 3306 นี่เป็นกรณีของฉันเมื่อเชื่อมต่อกับเครือข่ายองค์กรของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.