[Basic AWS] Hướng dẫn tạo VPC – Các thành phần trong 1 VPC
Kiến thức cơ bản mà bạn cần review trước khi bắt đầu:
1. VPC là gì & cách VPC hoạt động
Có thể tạm hình dung VPC như là một miếng đất bạn quy hoạch để xây nhà cho bạn! Đừng nhầm với subnet nhé, subnet là khi bạn đã có miếng đất rồi, bạn chia ra xem chỗ nào để làm nhà, chỗ nào làm bếp, chỗ nào làm sân, vườn. Subnet cũng là 1 dải các IP nhưng mà subnet thì nằm bên trong VPC!
Hãy nhớ điều này: Networking trong VPC, nếu không có các thành phần cho phép kết nối internet ra bên ngoài VPC như internet gateway, NAT gateway,… thì sẽ tương tự như intranet (mạng nội bộ) vậy: VD như tại MBF, thì trong MBF có thể kết nối với nhau, còn một anh bên ngoài, giả sử là ở CMC chẳng hạn, sẽ không thể kết nối với resources trong MBF được, trừ khi ông MBF thiết định cho phép ông CMC access vào resource của mình. Điều này cũng thể hiện 1 đặc tính quan trọng của VPC: giữa 2 VPC không thể access vào được resource của nhau (trừ khi bạn cho phép! Cho phép bằng cách nào, thì hãy xem tiếp các bài viết sau nhé)
2. CIDR block:
VD: 10.0.0.0/16 thì 10.0.0.0 được gọi là base IP, /16 được gọi là subnet mask.
Nhớ: Có 5 IP là AWS sử dụng, thế nên nếu CIDR block mà bạn chia có 30 IPs, thì tức là chỉ khả dụng 25 IPs thôi nhé!
3. Subnet:
https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html
Nhớ:
Có 2 loại subnet:
Public subnets: các subnet được attach với internet gateway
Private subnets: các subnet không được attach với internet gateway. Các resources bên trong subnet private sẽ không tạo các request ra bên ngoài internet được, các traffic bên ngoài cũng không đi vào trong này được (VD: giả sử bạn deploy 1 webser trong private subnet, thì bạn không thể đứng bên ngoài internet để SSH vào được, cũng không thể chạy các câu lệnh tạo request đi ra bên ngoài, vd: sudo yum update được)
4. Availability zones:
AZs có thể tạm hình dung là các data center được đặt ở các nơi tách biệt trong cùng 1 region. VD: ở region HN thì tôi đặt 1 cái ở MBF, 1 cái ở Viettel.
Tại sao các thiết kế thông thường hay để mutil-AZ chứ không để chỉ 1 AZ thôi? -> Hiểu đơn giản thì giả sử khi ở Viettel chết thì vẫn có MBF để dịch vụ không bị gián đoạn
Định nghĩa về AZ xem thêm ở đây:
5. Internet gateway:
Mặc định thì subnet tạo ra, sẽ là private subnet, để có thể trở thành public subnet thì cần attach 1 internet gateway, và thiết lập routing cho subnet đến 0.0.0.0/0 thông qua internet gateway.
https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html
6. NAT gateway:
Chú ý nhé: NAT gateway thường dùng cho mục đích để các server trong private subnet có thể access ra internet. VD: Khi cập nhật phần mềm, update package,…
NAT gateway là do AWS manage.
Có thể sử dụng NAT instance, nhưng đã bị depreciated rồi! NAT instance có đặc điểm là giá thành rẻ hơn, nhưng lại có nhược điểm là phụ thuộc băng thông của instance sử dụng làm NAT.
https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html
Trong trường hợp nếu chỉ access dịch vụ của AWS thôi, không cần đi ra internet bên ngoài, thì hãy sử dụng VPC endpoint!
7. VPC endpoint:
Xem thêm VPC endpoint tại đây:
https://wa.aws.amazon.com/wellarchitected/2020-07-02T19-33-23/wat.concept.vpc-endpoint.en.html
Hiện tại trong bài này, vẫn chưa hướng dẫn cho bạn cách tạo và sử dụng VPC endpoint, hãy theo dõi tiếp các bài viết tiếp theo nhé!
8. Route table:
Sử dụng để thiết lập các routing bên trong VPC.
1 VPC thông thường thì bao gồm những gì?
Memo: Thông thường thì trong các kiến trúc, sẽ không sử dụng VPC default, mà sẽ tạo ra 1 custom VPC. (Trừ 1 số use case đặc biệt, VD: thiết định VPC Peering cho AWS Lightsail và default VPC).
Ở 1 VPC cho production, thông thường, theo như mình từng gặp, bạn sẽ tạo ra những thứ sau:
2 public subnet
2 private subnet
2 db subnet (cũng là private subnet thôi, nhưng cho mục đích đặt db instance vào đây)
1 nat gateway
2 route table: route table cho private subnet và route table cho public subnet
1 – 2 EC2 instance ở public subnet để làm bastion server
Note:
- Hiện tại với màn hình tạo VPC của AWS Console rất tiện, nhưng bạn hãy nên chỉ tạo bằng VPC Only nếu như đang học tạo VPC, để có thể hiểu từng component, và debug khi gặp lỗi nhé!
Các bước thực hiện:
Sẽ bao gồm các bước sau:
Tạo VPC và enable DNS hostname và DNS resolution cho VPC
Tạo 6 subnets
Tạo internet gateway và attach internet gateway vào VPC
Tạo NAT Gateway
Tạo 2 route table
Tạo route cho các route table
Associate subnet vào các route table.
Tạo bastion server.
1. Tạo VPC
Click vào url bên trên, để tạo VPC
Thực hiện enable VPC DNS hostname và DNS resolution cho VPC tại mục Actions. Nên bật cả 2, ở các bài viết sau mình sẽ viết về DHCP options set ở VPC, mà khi configure DHCP Options set thì enable 2 thuộc tính này là cần thiết
2. Tạo subnet
Bạn có thể sử dụng công cụ sau để chia CIDR blocks:
https://www.davidc.net/sites/default/subnets/subnets.html
Truy cập:
https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#subnets:
Nhấn create subnet. Hãy tạo ra 6 subnets. (2 public, 4 private: 2 cho các webserver, 2 cho database server: có thể đặt 3 subnet ở AZ zone c, 3 ở AZ zone a)
3. Tạo internet gateway
Nhớ: Sau khi tạo các subnet, mặc định vẫn chưa thể access được internet.
Truy cập:
https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#CreateInternetGateway:
Và tạo ra 1 internet gateway rồi attach vào VPC vừa tạo ở bước 1 theo hình dưới đây:
4. Tạo NAT gateway
https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#CreateNatGateway:
Trong lúc tạo NAT Gateway, ở Option Elastic IP allocation ID, bạn nên click Allocate Elastic IP.
Lưu ý quan trọng: Bắt buộc phải tạo NAT gateway vào subnet mà bạn định làm public subnet! Nếu bạn tạo NAT gateway vào private subnet thì sẽ không sử dụng được!
5. Tạo route table:
https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#CreateRouteTable:
Click link trên để tạo route table, nhớ chọn đúng VPC mà bạn đã tạo tại bước 1.
Mặc định lúc vừa tạo ra, sẽ chỉ có duy nhất 1 route như này.
Click Edit route để sửa:
Với route table của public subnet: Add thêm route với destination là 0.0.0.0/0 (::/0 nếu sử dụng IPv6). Target thì chọn Internet gateway đã tạo ở bước 3, rồi nhấn Save changes
Với route table của private subnet: Destination là 0.0.0.0/0, target thì chọn NAT gateway đã tạo ở bước 4 rồi nhấn save changes.
6. Associate các subnet vào route table:
Tại route table public subnet:
Click tab Subnet association
Tại mục Explicit subnet associations, click Edit subnet associations
Click chọn các subnet bạn muốn làm public subnet, và nhấn save associations.
Bạn làm tương tự với route table private subnet.
7. Tạo bastion server
Để đảm bảo an toàn, các tài nguyên EC2 instances nên được đặt trong private subnet. Tuy nhiên, vì là nằm trong private subnet nên bạn sẽ không thể SSH vào từ internet được.
Do đó, bạn cần tạo 1 – 2 instance tại public subnet để có thể SSH vào bastion server rồi tiếp tục SSH vào các instance trong private subnet.
Chọn VPC bạn vừa tạo.
Hãy chọn subnet cho bastion server là public subnet, và chọn Enable public IP:
8. SSH vào server trong private subnet từ local:
Cách 1: sử dụng SSH key (cách này đơn giản nhất, nhiều máy local access cũng OK, nhưng dùng cho testing thì được, hoặc là trong những use case nhất định, còn thực tế đặt private key trên server ở public subnet là không nên!)
Đầu tiên, cần SSH vào trong bastion host bằng câu lệnh:
ssh -i <ssh-key-file> <user>@<public-ip>
Sau khi ssh vào trong server rồi, bạn mở file private key đã download từ trên aws console xuống máy local. (Có thể mở bằng notepad hoặc notepad++)
Trên server bastion host:
nano <tên-key-file>
Lưu ý: tên keyfile phải đúng với tên của keyfile download từ AWS Console về, không tự ý đổi tên!
Dán nội dung keyfile vào, nhấn ctrl X, rồi nhấn enter để save lại
Chmod lại quyền:
chmod 400 <tên-key-file>
Lúc này, lại tiếp tục ssh vào private server:
ssh -i <tên-key-file> <user>@<private-server-ip>
Done!
Lưu ý quan trọng:
Tuy đơn giản, nhưng cách này thường ít dùng trong production! Vì đặt private key lên trên 1 server ngoài public subnet là rủi ro về bảo mật!
Bastion Host là kỹ thuật chỉ sử dụng với kết nối SSH nên không cài đặt những thứ khác trên bastion host
Thường trong thực tế, người ta sẽ sử dụng ssh agent forwarding hoặc SSH Tunnel để login vào trong private server. Tuy nhiên nhược điểm là: configure máy local A access, sang máy B không dùng được, phải configure cho cả máy B thì máy B mới access được.
Cách 2: sử dụng SSH agent forwarding để login vào private instance:
Nếu bạn chưa biết về SSH agent forwarding thì hãy đọc thêm tại link sau nhé:
https://www.ssh.com/academy/ssh/agent
Cách thực hiện SSH agent forwarding, xem thêm tại đây:
Ở đây mình sử dụng Git Bash để SSH. Bạn có thể sử dụng Linux terminal, Mac terminal, MobaXterm,… Nếu dùng trên Windows, bạn có thể install git vào máy và dùng Git bash như mình, hoặc dùng Putty như hướng dẫn ở link trên của AWS:
Bước 1: Khởi động SSH agent:
ssh-agent -s
kết quả trả về sẽ có dạng như sau:
SSH_AUTH_SOCK=/tmp/ssh-ltFVrruEcNjv/agent.1983; export SSH_AUTH_SOCK;
SSH_AGENT_PID=1984; export SSH_AGENT_PID;
echo Agent pid 1984;
Tiếp tục chạy lệnh:
ssh-add -k <key-file-name>
Nếu gặp lỗi như sau:
$ ssh-add -k <key-file-name>
Could not open a connection to your authentication agent.
Thì hãy thử chạy câu lệnh sau:
eval `ssh-agent -s`
exec ssh-agent bash
Sau đó chạy lại câu lệnh
ssh-add -k <key-file-name>
Trả về như sau thì OK:
Identity added: <key-file-name> (<key-file-name>)
Bước 2: Chạy lệnh:
ssh-add -L
Lúc này sẽ trả ra 1 key dạng như sau:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/V9xnZuE/cLT9Ehb8XmfKywzmDNTXVazgNACH6m8P3inlS+tkLxxxxxxxClFEehVoP3FQNC7GEFhxjkTApSF1Zdyfl7gmCbS1DCaVlss1ProuDclKxxxxxxxxxxxfx73V8yuNeRMXekTTxUh/bUfhKOt9NOULnzweb7hnpjbfnmQzokq1z0lYBJjX3mXcMrtHu6xpM5TO9tjWYdn+cdu6sKmCmFX0B36BBMHXq/A5fnFYt8pe4bf+iAKyhIQTdpX9wk3n7U3PD+xxxxxxxxCRt5mEkHaS33ieZcpBn5LKfL0oQt8P04cJ605/xxxxxxxxxxxx <key-file-name>
Bước 3: SSH vào bastion server:
ssh -A <user>@<public-ip>
Lúc này bạn sẽ thấy access được:
The authenticity of host '<public-ip> (<public-ip>)' can't be established.
ED25519 key fingerprint is SHA256:5gxxxxxtb4DJWb2PxxxxxxxzII2+VVo+aO2Puu3k.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '<public-ip>' (ED25519) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-16-137-98 ~]$
Tiếp tục SSH vào private server:
ssh <user>@<private-ip>
Done!
Với cách sử dụng SSH forwarding thế này, bạn sẽ không cần mang private key lên trên server, sẽ đảm bảo an toàn, mà vẫn có thể đứng từ local để access vào private IP.
Memo:
Ngoài ra, có thể sử dụng SSH Tunnel để SSH vào private instance. Nếu sử dụng SSH Tunnel thì bạn có thể share cái tunnel của bạn cho những người có chung dải IP:
https://www.phase2technology.com/blog/multiple-ssh-tunnels
Về cơ bản, SSH Tunnel là kiểu như sau: Giả sử có 1 webserver trong private subnet có IP là 10.0.0.1 cổng 443, ở máy của mình trong mạng có IP là 192.168.0.1, giờ muốn ssh tunnel để các máy khác trong mạng có thể connect tới 10.0.0.1:443 thì sẽ dùng lệnh kiểu như sau:
ssh -L 192.168.0.1:443:10.0.0.1:443 account@bastion_host
vậy là các máy khác trong mạng, cứ truy cập vào 192.168.0.1:443 là vào được máy 10.0.0.1:443
1 tunnel có thể cho nhiều port cũng được.
Còn có một cách khác là dùng SSH Tunnel sock:
https://ma.ttias.be/socks-proxy-linux-ssh-bypass-content-filters/
Tạo một con socks trên máy mình rồi share cho người khác thì họ có thể truy cập vào tất cả các ports hay IP trong private network.
Tham khảo thêm về SSH Tunel (nếu thích):
https://www.ssh.com/academy/ssh/tunneling/example#local-forwarding
9. Chú ý:
– Bạn sẽ không cần trả phí cho VPC, nhưng phải trả phí cho những resources sử dụng bên trong VPC. 1 tài khoản, 1 region mặc định sẽ chỉ được phép tạo ra 5 VPCs thôi, nếu cần hơn thì phải request với AWS để nâng limit
– Bạn có thể xóa VPC default của region bình thường! Nhưng lưu ý là nếu xóa hết thì lúc bạn tạo EC2 instance sẽ phải tạo VPC trước (muốn xây nhà, thì phải quy hoạch đất đã), nếu không sẽ không tạo được.
– Ngoài cách sử dụng bastion host, thì cũng có cách để không cần dùng bastion host cũng có thể SSH vào private IP, tuy nhiên kỹ thuật bastion host là kỹ thuật thường xuyên được sử dụng, và cũng có thể nói phản ánh rất rõ tính chất của VPC: trong cùng 1 VPC thì có thể kết nối với nhau!
Nếu bạn hứng thú với cách không sử dụng bastion host, thì hãy google thêm nhé!
– VPC là 1 phần nặng và khó, hãy chịu khó thực hành nhiều + đọc tài liệu nhiều! Muốn có được chứng chỉ của AWS thì buộc bạn phải thực hành thật nhiều, lab thật nhiều!
– Trường hợp nếu đã xóa default VPC, mà muốn khôi phục lại:
Bạn chỉ cần nhấn Create default VPC, còn lại AWS lo!