สร้าง NAT Gateway เพื่อให้ EC2 ใน Private Subnet ต่อเน็ตได้

  • gallery
  • gallery

ในบางกรณีเราต้องการสร้าง EC2 ให้อยู่ใน Private Subnet ซึ่ง EC2 นี้จะได้ IP Address ที่เป็น Private IP ที่เรากำหนดไว้ที่ Subnet เเละไม่มีการ assign public ip เพื่อ map กับ private ip นี้ สิ่งที่ได้ก็คือ EC2 เครื่องนี้ จะออกเน็ตไม่ได้ จะ Remote เข้ามาก็ไม่ได้ ข้อดีก็คือเรื่องของความปลอดภัยนั่นเอง ซึ่งต่อให้ Allow ไว้ที่ Security Group มันก็ Remote เข้ามาจากข้างนอกไม่ได้อยู่ดี

ตัวอย่างการนำเทคนิคนี้ไปใช้ ก็อย่างเช่น การสร้าง EC2 เพื่อเป็น Database Server จะลง MySQL , MongoDB หรืออะไรอย่างอื่นก็เเล้วเเต่ และอนุญาตให้เชื่อมต่อกันได้จาก EC2 ที่อยู่ใน Subnet เดียวกัน หรือ VPC เดียวกันเท่านั้น

แต่การออกเน็ตไม่ได้ มันก็สร้างปัญหาเหมือนกัน อย่างเช่นเราต้องการ Update Kernal Linux ที่ใช้อยู่ , Update Package อื่นๆต่างๆนาๆ หรือต้องการ Transfer file เข้า-ออก , sync เวลากับ NTP Server เป็นต้น การไม่มีเน็ตก็อาจต้องออกเเรงเยอะนิดหน่อย จึงจะทำอะไรพวกนี้ได้ แต่ในบทความนี้ เราจะมานำเสนอวิธีการที่ดีงาม เเละง่ายกว่านั้น นั่นก็คือ

การสร้าง NAT Gateway ครับ

ก่อนอื่นมารู้จัก Internet Gateway 3 รูปแบบบน AWS Cloud กันก่อน

  1. Internet Gateway เป็น Gateway พื้นฐานสุดที่สร้างขึ้นมาเพื่อให้ EC2 และทรัพยากรอื่นๆที่ต้องการ Network Interface สามารถติดต่อไปยังโลกภายนอก (Internet) ได้ เเละในทางกลับกัน โลกภายนอกก็ติดต่อมาหา EC2 ของเราได้(ถ้า Allow ที่ Security Group เอาไว้)
  2. Engress Only Internet Gateway อันนี้ก็เเปลความหมายตรงตัวตามชื่อเลยครับ ก็คือ เป็น Internet Gateway ที่อนุญาตให้สร้างการเชื่อมต่อออกจาก EC2 ได้ ตัวอย่างก็เช่น EC2 จะ ping ไปหา Google ได้ , ping มาหา Router ที่บ้านเราได้ แต่โลกภายนอกจะ Ping เข้ามาหา EC2 ไม่ได้ !!! ก็เพราะตามชื่อของมัน Engress Only !!!!! และ Engress Only Internet Gateway นี้ใช้ได้เฉพาะ IPv6 นะครับ
  3. NAT Gateway เป็น Engress Only เเละความหมายก็เหมือน Engress Only Internet Gateway เลยครับ เพียงเเค่เจ้านี่ใช้กับ IPv4 เเละมีการทำ NAT กับ Elastic IP ที่เรากดปุ่มขอมา

ส่วนเหตุผลที่ทำไมต้องมี Engress Only Internet Gateway เเละต้องมี NAT Gateway ด้วยนั้น ก็เพราะว่า Private IP ที่เราไปกำหนดให้ EC2 หรือระบบมันกำหนดมาให้เอง มันเป็น Private IP ที่ออกเน็ตไม่ได้ อยากจะออกเน็ตได้ก็ต้องทำ NAT เพื่อแปลงเป็น Public IP ยังไงล้ะครับ ส่วน IPv6 นั้น ทาง AWS ได้ Assign IPv6 /56 ที่เป็น Global Address มาให้เเล้ว ออกเน็ตได้เลย ไม่ต้องมาทำ NAT นั่นเอง

อืมมม ทฤษฎีเยอะเเล้ว มาเริ่มลุยกันเลยดีกว่า ใครที่ยังงงๆกับ VPC ตามไปอ่าน blog ก่อนหน้าของผมได้เลย ที่นี่

 

มาเริ่มกันเลย

ขั้นเเรกก็ล็อกอินเข้าหน้า AWS Management Console ก่อนเลย เเล้วไปที่ VPC เเละไปที่ Subnet

จากนั้นก็กดปุ่มสร้าง Subnet เลยครับ

เราก็จะเห็นหน้าตาประมาณนี้ ก็ตั้งค่าต่างๆตามที่ระบบมันถามได้เลยครับ แต่ตัวอย่างนี้ใน VPC ของผม ผมสร้าง Subnet เต็มเเล้ว เลยสร้างใหม่ไม่ได้ล้ะ555

ส่วนใครที่มี Private Subnet อยู่เเล้ว ก็ไม่ต้องสร้างเพิ่มนะครับ แก้ Config ของเดิมได้เลย

จากนั้น ก็มากดขอ Elastic IP มา 1 เลข ครับ การที่เราจะทำ NAT ได้ เราต้องมี Public IP กันก่อน ก็กดที่ Elastic IPs ทางด้านซ้ายมือของ VPC Console เลย

เมื่อเข้ามาเเล้วก็กดปุ่ม Allocate new address เเละ allowcate เลยครับ เราก็จะได้ Elastic IP ที่เป็น Public IP มา 1 เลข ส่วนใครที่ขอจนเต็ม Limit ให้ไปติดต่อ Support เพื่อขยาย Limit ออกไปครับ

และถ้าเจอหน้าเขียวๆแบบนี้ เราก็ขอ Elastic IP เสร็จเรียบร้อย อันนี้ผมไม่ได้ Sensor อะไรเพราะเดี๋ยวเขียน Blog เสร็จ ผมก็คืนเลขนี้กลับไปยัง AWS ครับ 55555

จากนั้นก็ไปกดสร้าง NAT Gateway โดยไปที่ NAT Gateways เเละกดปุ่ม Create NAT Gateway ได้เลย

มาถึงขั้นตอนสำคัญเเล้วนะครับ ห้ามขยับตัว ห้ามกระพริบตา (ฮาา) ก็คือการเลือก Subnet ครับ ให้เราเลือก Subnet ที่เป็น “Public Subnet”

ให้เลือก Public Subnet อื่นๆที่อยู่บน VPC ของเรานะครับ จะอยู่บน AZ ไหนก็เเล้วเเต่ความศรัทธา 555 ไม่ใช่ Private Subnet ที่เราเพิ่งสร้างไปเมื่อกี๊ หรือ Private Subnet ที่เราเคยสร้างไว้เเล้ว ตรงนี้ถ้าเลือกผิด ออกเน็ตไม่ได้นะครับ เวลา Traceroute ออกไปมันก็จะติดอยู่ที่ NAT Gateway นั่นเเหละ ไม่ยอม Forward Packet ไปต่อ ย้ำอีกครั้งนะครับ ห้ามเลือกผิด แต่ถ้าเลือกผิดไปเเล้ว เเค่กดลบ NAT Gateway เเละสร้างใหม่นะครับ จะไปกดเเก้ไขไม่ได้ (เสียเวลาชะมัด55)

 

กดสร้างเเล้วก็ รอครับ รอมันพักนึง จนกว่าสถานะจะขึ้นเป็น Active สีเขียวๆ กดปุ่ม Refresh ได้นะครับ ถ้าสถานะมันยังไม่อัพเดท

หลังจากนั้น เมื่อเราได้ NAT Gateway ในสถานะที่พร้อมใช้งาน Active สีเขียวเเล้ว เราก็ต้องมาสร้าง Routing Table โดยไปที่ Route Tables เเล้วกดปุ่ม Create route table จากนั้นก็ตั้งชื่อให้กับ Routing Table เเละเลือกชื่อ VPC ของเราให้เรียบร้อย จากนั้นก็กดปุ่มสร้างกันเลย

และเราก็ต้องเเก้ไขข้อมูลใน Routing Table กันหน่อย โดยการคลิกเลือก Routing Table เเบบนี้

และเลือก Routes ด้านล่าง ระบบจะเเสดงข้อมูล ประมาณนี้ครับ

ข้อมูลในระบบก็จะบ่งบอกว่า ถ้าต้องการติดต่อไปที่ไหน ให้ไปทางไหน (Target) อย่างเช่นของผม 192.168.0.0/23 เป็น Public Subnet ของผมเอง โดยอยู่บน Local ก็คืออยู่บนตัวเอง ไม่ต้องวิ่งไปหาที่ไหน (ฮาา)

เราต้องการให้ออกไปยัง Internet เราก็ต้องเพิ่มเส้นทาง โดยกำหนดค่า Destination เป็น 0.0.0.0/0 เเละเลือก Target เป็น NAT Gateway ที่เราสร้างเอาไว้เมื่อซักครู่ ตามภาพด้านล่างนี้ (กดที่ปุ่ม Edit routes เพื่อเพิ่ม / เเก้ไข / ลบ route)

จากนั้นก็กดปุ่ม Save Route ครับ เพื่อบันทึกค่า

หลังจากนั้น เราก็จะเห็นว่า Route ที่เราเพิ่มลงไปนั้น มันมีสถานะเป็น Active เเล้ว อ๋ออ ขอเสริมให้ซักนิด ถ้าสถานะเป็น blackhold ก็คือ ระบบไม่สามารถระบุได้ว่า Target นั้นๆคืออะไร อยู่ที่ไหน อย่างเช่นวันนึง เราไปลบ NAT Gateway เเล้ว ระบบมันก็จะหา NAT Gateway นั้นๆไม่เจอ มันก็จะเเสดงสถานะว่า Blackhold ซึ่งในทางทฤษฎีของ Computer Network นั้น หาก Destination เป็น Blackhold มันจะจัดการ Discard Packet นั้นๆทิ้งไปซะ ไม่ forward ไปที่ไหนเเล้ว

ขั้นตอนต่อไป ให้เราไปแก้ไข Private Subnet ของเราให้เลือกใช้ Routing Table ที่เราสร้างขึ้นครับ โดยเข้าไปที่ Subnet เเล้วเลือกชื่อ Private Subnet ที่สร้างเอาไว้ จากนั้นก็กด Tab ชื่อ Route Table ด้านล่าง เเละกดปุ่ม Edit route table association เพื่อเลือก Routing table ที่เราสร้างเอาไว้ครับ

หลังจากนั้นก็กดปุ่ม Save เลยครับ

เนื่องจากผมไม่มี EC2 ที่จะใช้บน Private subnet นะครับ ขอไปกดสร้าง EC2 มา 1 ตัว แบบไม่เอา Public IP เเละสร้างภายใต้ Private Subnet เพื่อทดสอบนะครับ

สร้างเสร็จก็จะได้รายละเอียดตามนี้ แต่ของผมเนื่องจากส่วนตัวใช้ IPv6 ด้วย ก็เลือก Enable ให้มันกำหนด IPv6 มาให้

แล้วผมจะ SSH เข้าไปยังไงงล้ะเนี่ยย ???

คำตอบก็คือ SSH ไปยัง EC2 ที่อยู่ใน Public Subnet ก่อน เเล้วใช้เครื่องนั้น SSH ไปหาเครื่องที่ผมกำลังสร้างครับ ใครทำไม่ได้ก็ไปกำหนดค่า Security Group ให้ Allow เอาไว้

ผม SSH เข้าไปได้เรียบร้อยเเล้ว ก็ลองทดสอบการออกเน็ตดูว่าได้มั๊ย โดยการ ping ไปยัง 1.1.1.1 ที่เป็น Public DNS Resolver ของ Cloudflare ครับ ถ้า Ping ได้ ก็เเสดงว่าออกเน็ตได้เเล้วครับ

และผมจะทดสอบดูว่า Public IP ที่ใช้ออกเน็ตเป็น IP เลขอะไร ซึ่งเลขที่ได้ก็ควรจะเป็น Elastic IP ที่เราไปขอเอาไว้ตั้งเเต่ต้นครับ

มาลอง Traceroute ดูบ้าง

ถ้าสังเกตุดีๆ จะเห็นว่า IP ของ Hop เเรกจะเป็น Private IP ของ NAT Gateway ครับ

และถ้าเราทดสอบการ SSH จากข้างนอกเข้ามาทาง Public IP เลขนี้ เราก็ไม่สามารที่จะเข้าถึงได้นะครับ เพราะ Subnet นี้นั้น เราใช้ NAT Gateway ไม่ใช่ Internet Gateway

แถมให้อีกนิดสำหรับใครที่ใช้ IPv6 ด้วย ให้ไปกดสร้าง Engress Only Internet Gateway เเละไปแก้ไข Routing Table ในขั้นตอนก่อนหน้า โดยการเพิ่ม Destination เป็น ::/0 และเลือก Target เป็น Engress Only Internet Gateway ที่สร้างเอาไว้ เเละก็ Save ให้เรียบร้อย เพียงเท่านี้ เราก็ออกเน็ตกับ IPv6 ได้เเล้ว

Routing Table ก็จะมีหน้าตาประมาณนี้ครับ

ส่วนเรื่องของราคา ก็ไปดูกันได้ในหน้าเว็บของ AWS เลยครับ มีบอกทุก Region ส่วนที่สิงคโปร์ก็ตามนี้

ราคาอยู่ที่ 0.059 USD ต่อชั่วโมง เเละยังไม่รวมราคาของข้อมูลเข้าออก

ขอจบบทความไว้เพียงเท่านี้นะครับ ไว้จะมาเขียนต่ออีกในเรื่องอื่นๆ ใครสนใจก็ฝากกดติดตาม หรือมีข้อสงสัยอะไรก็สอบถามเข้ามาได้เลยครับ

ใครจะจ้างงานก็ได้นะครับ (ขออนุญาตโฆษณาแป๊บบ) รับ Deploy สาระพัดอย่างบน AWS Cloud จะเป็น EC2 , Cloudfront , Route 53 , EKS , บลาๆๆ ก็ได้หมดครับ มาคุยรายละเอียดกันได้ ราคาไม่แรงครับ

สำหรับวันนี้ก็ลาก่อนนะครับ ขอให้มีความสุขกับ AWS Cloud

Ref:

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat.html

Network / Cloud Engineer , Instructor / Blogger
รักเเละหลงไหลไปกับเทคโนโลยีต่างๆมากมาย

Leave A Reply