1. Giới thiệu

VPC (Virtual Private Cloud) là dịch vụ giúp chúng ta phân chia các tài nguyên sử dụng trên AWS, tách biệt chúng về dải IP, quản lý truy cập,...

Mỗi VPC sẽ có một hoặc nhiều subnet, là nơi để chia nhỏ dải IP thành nhiều phần và quản lý chúng dễ dàng hơn (giống với kỹ thuật subnetting trong network).

Ví dụ bạn muốn tạo 1 public subnet để đặt web server có thể truy cập trực tiếp từ internet; và 1 private subnet để đặt database phục vụ cho webserver này, không cho internet truy cập tới.

         Tạo VPC và subnet trong AWS

 

Khi bạn đăng ký sử dụng AWS, mặc định sẽ có 1 VPC và 3 subnet thuộc VPC đó, mặc định VPC này có thể truy cập từ internet. Bài này mình sẽ tạo một VPC mới và tạo 2 subnet mới, một private subnet và một public subnet.

VPC có các thành phần quan trọng đi kèm với nó là:

  • Route Table: Là nơi nhận các truy cập tới các tài nguyên và điều hướng chúng trong VPC.
  • Network ACL (Access Control List): Là nơi quản lý việc cho phép hay không các tài nguyên nguồn hay IP truy cập tới các subnet. Đây là nơi bạn có thể chặn một IP hay dải IP nào đó.
  • Security Group: Có cùng mục đích với Network ACL là bảo mật nhưng đây là nơi quản lý các phương thức, cổng giao tiếp và IP đi vào ra các tài nguyên trong subnet chứ không phải quản lý IP vào ra subnet như Network ACL
  • Internet Gateway: Nơi để VPC giao thông với internet, VPC mặc định của aws sẽ có Internet Gateway. VPC bạn tạo mới sẽ không có Internet Gateway.

 

2. Tạo VPC và subnet

2.1. Tạo VPC

Lúc tạo VPC, mình chọn IPv4 CIDR block là 10.0.0.0/16 để có thể lấy được nhiều địa chỉ IP, nếu bạn không cần nhiều địa chỉ IP thì có thể chọn 10.0.0.0/24. Để có thể hiểu được dải IP này là gì và chọn như thế nào cho phù hợp, bạn nên tìm hiểu trước về CIDR và kỹ thuật subnetting.

Nói đơn giản thì 10.0.0.0/16 nghĩa là:

  • 10.0.0.0 : mình sẽ sử dụng mạng lớp B, tính từ địa chỉ 10.0.0.0
  • /16 : tính từ địa chỉ đó, mình muốn lấy 16 bit làm địa chỉ mạng, còn 32 - 16 = 16 bit còn lại làm địa chỉ máy.

 

     Tạo VPC trong aws

 

Sau khi tạo xong, mình sẽ có 1 VPC mới song song với 1 VPC mặc định của aws:

    Tạo VPC trong aws

 

Chú ý một điều là khi tạo một VPC, mặc định các thành phần Route Table, Network ACLSecurity Group sẽ được tạo theo:

Route Table được tạo theo VPC

 Network ACL được tạo theo VPC

Security Group được tạo theo VPC

 

2.2. Tạo subnet trong VPC

Mình muốn có 2 subnet, mỗi subnet lấy 24 bit địa chỉ mạng và 8 bit địa chỉ máy:

  • 1 public subnet có địa chỉ tính từ 00001010.00000000.00000000.00000000 nên CIDR là 10.0.0.0/24
  • 1 private subnet có địa chỉ tính từ 00001010.00000000.00000001.00000000 nên CIDR là 10.0.1.0/24

Bạn phải tìm hiểu về subnetting để biết phải lấy CIDR như thế nào.

Vì mỗi subnet chỉ có thể nằm trên một AZ kéo theo mọi tài nguyên trên subnet đó chỉ nằm trên 1 AZ nên mình sẽ chọn 2 AZ khác nhau:

    Tạo subnet trong aws

   

    tạo subnet trong aws

 

Sau khi tạo xong:

  tạo subnet trong aws

Thông thường với 8 bit đánh địa chỉ máy, ta có 2^8 - 2 = 256 - 2 máy nhưng ngoài 2 IP địa chỉ subnet và địa chỉ broadcast ra, aws còn sử dụng thêm 3 IP nữa nên số IP địa chỉ máy chúng ta có thể có = 256 - 5 = 251 IP như hình trên. Ví dụ với CIDR 10.0.1.0/24 thì 5 địa chỉ IP mà aws sử dụng là:

  • 10.0.1.0: Network address, là địa chỉ subnet.
  • 10.0.1.1: Sử dụng cho VPC router.
  • 10.0.1.2: Sử dụng cho DNS trong VPC.
  • 10.0.1.3: AWS lưu trữ để phòng trường hợp sử dụng trong tương lai.
  • 10.0.1.255: Địa chỉ broadcast.

Bạn cần lưu ý là khi tạo subnet, nó mặc định sẽ được gắn thêm với Route Table mặc định Network ACL mặc định; ngoài ra, cái tài nguyên trong subnet đó vẫn chưa được tự động đánh IP để internet có thể truy cập (bằng flag Auto-assign public IPv4 address như hình dưới):

   Route Table và Network ACl mặc định

Mình sẽ để subnet 10.0.0.0/24 làm public subnet nên bật flag đó thành Yes:

   Bật Auto-assing public IPv4 address cho public subnet  

 

Flag đó nhằm đánh địa chỉ IP cho các tài nguyên trong public subnet để internet có thể biết mà đi tới, nhưng để public subnet này có thể giao thông với internet bạn phải gắn Internet gateway vào VPC:

 

2.3. Tạo internet gateway cho VPC

Khi tạo Internet Gateway (ký hiệu IGW), IGW này sẽ có trạng thái là Detached tức là chưa gắn vào VPC nào: 

   Tạo internet gateway trong aws

 

Ta sẽ gắn MyIGW mới tạo vào MyVPC:

   attach Internet Gateway vào VPC

Chú ý là một VPC chỉ có thể gắn một Internet Gateway.

Ta cũng nên tạo một Route Table riêng dành cho public subnet:

 

2.4. Tạo Route Table cho public subnet

Khi tạo VPC, default Route Table sẽ được tạo theo, ta muốn default Route Table này sẽ là private để mỗi khi tạo resource trên aws sẽ luôn chọn mặc định là private subnet.

Ta cần tạo một public Route Table không phải mặc định để có thể tuỳ chọn lúc cần public các tài nguyên ra internet.

  Tạo route table cho puclic subnet aws

Bạn để ý Main Route Table của chúng ta đang là private, điều này tránh cho những vấn đề bảo mật khi ai đó tạo resource trên aws và để subnet mặc định.

Chú ý là 2 subnet của ta vẫn đang nằm trong default Root Table (dành cho private subnet):

  main root table trong aws

Ta cần chuyển public subnet sử dụng MyPublicRT:

    Liên kết subnet với route table trong aws

 

Ở tab Routes, Route Table này đang chỉ điều hướng traffic giữa các tài nguyên trong VPC chứ không điều hướng traffic từ internet đi vào VPC:

     Route Table không kết nối internet

Cấu trúc bảng Route Table:

  • Destination: Là đích đến của các traffic, ở bảng trên thì đích đến là các IP nằm trong dải IPv4 10.0.0.0/16 và dải IPv6 2406:da14:b5c:1300::/56.
  • Target: Là nơi để Route Table này điều hướng traffic tới đó.
  • Status: Là trạng thái hoạt động.

Hay nói cách khác, Destination là đích đến của nơi gửi request, Target là đích đến mà Route Table đưa các request tới đó.

 

Bạn cần thêm route record như sau để Route Table có thể điều hướng traffic từ mọi IP trên internet có thể đi tới Internet Gateway VPC của bạn:

     Route Table kết nối Internet gateway

 

2.5. Tạo Network Access Control List (Network ACL) cho subnet

Bạn có thể sử dụng ACL mặc định là Allow all cũng không sao vì tầng Route Table đã chặn traffic từ Internet cho private subnet rồi.

Nhưng để cho an toàn, bạn vẫn nên tạo ACL cho private subnet và ACL cho public subnet riêng.

ACL Inbound cho public subnet:

ACL Inbound cho public subnet

ACL Outbound cho public subnet:

ACL Outbound for public subnet

 

ACL Inbound cho private subnet:

ACL Inbound for private subnet

ACL Outbound cho private subnet:

ACL Outbound for private subnet

Chú ý:

  • 10.0.0.0/24 hay 10.0.10.0/24 ở ví dụ trên là ví dụ về dải IP của VPC, bạn thay thế bằng dải IP của VPC của bạn.
  • ACL outbound cho Public subnet ở ví dụ trên chỉ cho phép kết nối SSH cổng 22 tới các tài nguyên trong cùng VPC, nên bạn không thể SSH từ 1 EC2 instance tới các server ngoài internet hay các EC2 instance trong cùng VPC sử dụng public IP được. Bạn chỉ có thể kết nối SSH từ 1 EC2 instance tới các EC2 instance khác trong cùng VPC sử dụng private IP.

Giải thích cho những thông số trên thì bạn tham khảo ở https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html#nacl-rules-scenario-2

Cũng đừng quên sửa subnet liên kết với ACL nhé:

liên kết Subnet với Network ACL

 

Thế là xong.

Bạn có thể kiểm tra bằng cách tạo một EC2 instance cho webserver trong public subnet, một EC2 instance cho DB trong private subnet và connect thử vào webserver và DB đó. Webserver sẽ connect được, có thể run yum update trong đó; còn DB server không thể connect được vì nó nằm trong private subnet. Bạn chỉ có thể connect vào DB server từ web server bằng cách sử dụng private IP của DB server.

Có một vấn đề đặt ra là vì DB server không kết nối với internet nên không thể download và update software (VD yum update), ta có thể khắc phục điều này bằng việc sử dụng kỹ thuật NAT (Network Address Translation).

 

Link tham khảo:

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

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