Course-এর সূচি

3.4

Bastion Host, NAT Instance ও NAT Gateway

private সার্ভারে নিরাপদে ঢোকা, আর সেগুলোকে বাইরে না খুলেই internet-এ যেতে দেওয়া: ধাপে ধাপে NAT, high availability আর খরচ।

30 মিনিট পড়া + Animation

টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।

এই lesson শেষ করে তুমি যা পারবে

  • Bastion Host বসিয়ে admin-দের private সার্ভারে shell খোলার ব্যবস্থা করতে, আর এর Security Group ঠিকমতো সাজাতে।
  • পরীক্ষায় “কোনো inbound port খোলা যাবে না” লেখা থাকলে কেন Session Manager (বা EC2 Instance Connect Endpoint) এখনকার সঠিক উত্তর, সেটা বুঝিয়ে বলতে।
  • NAT কীভাবে private সার্ভারকে ইন্টারনেটে যেতে দেয়, অথচ ইন্টারনেট থেকে কেউ তাকে ছুঁতে পারে না, সেটা ব্যাখ্যা করতে।
  • ঠিকভাবে একটা NAT Instance বানাতে (source/destination check, Elastic IP, route), আর এটা কেন পুরোনো দিনের জিনিস তা জানতে।
  • High availability মাথায় রেখে NAT Gateway সাজাতে, zonal আর Regional NAT Gateway-এর পার্থক্য বুঝতে, আর কখন Private NAT Gateway লাগে তা চিনতে।

#Private Subnet থেকে যে দুটো ঝামেলা আসে

Lesson 3.3-এ আমরা database আর application সার্ভারকে private করে দিয়েছি। ওদের কোনো public address নেই, Internet Gateway-তে যাওয়ার route-ও নেই। Default হিসেবে এটাই ঠিক। কিন্তু এতে রোজকার কাজে দুটো সমস্যা দাঁড়ায়:

  1. ভেতরে ঢুকে কাজ করা। যে সার্ভারে ইন্টারনেট থেকে পৌঁছানোই যায় না, একজন engineer সেখানে shell খুলবে কীভাবে?
  2. বাইরে যেতে দেওয়া। Private সার্ভারকে তো security patch নামাতে হয়, container image টানতে হয়, payment API-তে call করতে হয়। ইন্টারনেট থেকে নিজে নাগালের মধ্যে না এসে সে এগুলো করবে কীভাবে?

প্রথম সমস্যার সমাধান Bastion Host (তার চেয়েও ভালো সমাধান Session Manager)। দ্বিতীয়টার সমাধান NAT: হয় একটা NAT Gateway, নয়তো পুরোনো ডিজাইনে একটা NAT Instance।

#Bastion Host

Bastion Host (অনেকে একে jump box-ও বলে) আসলে একটা ছোট EC2 Instance। এটা থাকে Public Subnet-এ, আর এর একটা public IP বা Elastic IP থাকে। Admin-রা আগে Bastion-এ SSH (port 22, Linux) বা RDP (port 3389, Windows) করে ঢোকে, তারপর সেখান থেকে private সার্ভারে যায়।

পুরো ডিজাইনটা ঠিক থাকবে কি না, তা নির্ভর করে দুটো Security Group-এর ওপর:

Security GroupInbound ruleকেন
Bastion HostPort 22 (বা 3389) খোলা থাকবে শুধু admin-দের address থেকে, যেমন 203.0.113.25/32 বা অফিসের rangeকখনোই 0.0.0.0/0 দেবে না: সারা দুনিয়ার জন্য খোলা SSH port কয়েক মিনিটের মধ্যেই আক্রমণের মুখে পড়ে
Private সার্ভারPort 22 (বা 3389) খোলা থাকবে শুধু Bastion-এর Security Group থেকে (sg-…)IP না দিয়ে group-এর রেফারেন্স দিলে Bastion বদলালেও rule কাজ করে যায়, আর Public Subnet-এর বাকি সব মেশিন আপনা থেকেই বাদ পড়ে

Private সার্ভারে shell খোলা

Database সার্ভারের কোনো public address নেই। পুরোনো দিনের Bastion Host আর Session Manager পাশাপাশি রেখে দেখো; Session Manager-এ কোনো port খোলাই লাগে না।

পরিস্থিতি

Bastion SG: SSH চলবে শুধু 203.0.113.25/32 থেকে। Database SG: SSH চলবে শুধু Bastion-এর Security Group থেকে।

VPC10.0.0.0/16
Public Subnet
Private Subnet
Admin203.0.113.25
Scanner192.0.2.66
Bastion Host10.0.0.20source 203.0.113.25/32 ✓
Web Server10.0.0.30
Database Server10.0.10.40
SSH :22
ধাপ 1 / 3
1

Admin প্রথমে SSH (port 22) দিয়ে Bastion-এর public address-এ ঢোকে। Bastion-এর Security Group port 22 খুলে রেখেছে শুধু admin-এর নিজের address, মানে 203.0.113.25/32-এর জন্য।

#এখনকার সমাধান: কোনো inbound port-ই লাগবে না

Bastion যতই ছোট হোক, সেটাও একটা সার্ভার। একে নিয়মিত patch করতে হয়, এর SSH key সামলে রাখতে হয়, কোন কোন IP ঢুকতে পারবে সেই তালিকা হালনাগাদ রাখতে হয়, আবার এর জন্য টাকাও গুনতে হয়। AWS দুটো উপায় দেয়, যাতে Bastion ছাড়াই কাজ চলে:

  • AWS Systems Manager Session Manager। Instance-এর ভেতরে একটা agent চলে (Amazon Linux আর নতুন Windows AMI-তে এটা আগে থেকেই install করা থাকে)। এই agent নিজেই Systems Manager service-এর সঙ্গে একটা বাইরের দিকে HTTPS connection খোলে। তুমি console বা CLI থেকে shell খোলো, আর কে কোন Instance-এ ঢুকতে পারবে সেটা ঠিক করে IAM। এখানে কোনো inbound rule লাগে না, port 22 লাগে না, SSH key লাগে না, public IP-ও লাগে না। প্রতিটা session চাইলে S3 বা CloudWatch Logs-এ log করে রাখা যায়। শর্ত দুটো: Instance-এর একটা IAM role থাকতে হবে যাতে Systems Manager-এর permission আছে, আর বাইরে যাওয়ার একটা পথ থাকতে হবে (NAT Gateway, অথবা Systems Manager-এর জন্য VPC endpoint)।
  • EC2 Instance Connect Endpoint। এটা একটা endpoint, যেটা তুমি VPC-র ভেতরে বানাও। Console বা CLI থেকে তোমার SSH বা RDP connection এটা tunnel করে private Instance পর্যন্ত পৌঁছে দেয়। পরিচয় যাচাই করে IAM, আর Bastion বা public IP কিছুই লাগে না।

#NAT: বাইরে যাওয়া যাবে, ভেতরে আসা যাবে না

NAT (Network Address Translation) বাইরে যাওয়া packet-এর source address বদলে দেয়। ব্যাপারটা এরকম: Public Subnet-এ বসা NAT ডিভাইস একটা private সার্ভারের (10.0.10.10) packet হাতে নেয়। তারপর source-এর জায়গায় নিজের public address বসিয়ে দেয়, আর কার packet কোন address-এ গেল সেই জোড়াটা একটা translation table-এ লিখে রাখে। উত্তর ফিরে এলে উল্টো কাজটা করে, মানে আসল private address বসিয়ে ভেতরে পাঠিয়ে দেয়।

আসল চাবিকাঠি ওই table-এই। Table-এ কোনো entry তৈরি হয় কেবল তখনই, যখন ভেতরের কোনো সার্ভার নিজে কথা শুরু করে। ইন্টারনেট থেকে এমন কোনো packet এল যার সঙ্গে মেলে এমন entry নেই, তাহলে সেটার যাওয়ার কোনো জায়গা থাকে না, তাই সেটা ফেলে দেওয়া হয়। ফলে private সার্ভার বাইরে যেতে পারে, কিন্তু বাইরে থেকে তার দিকে কোনো দরজা খোলা থাকে না।

NAT Gateway private সার্ভারকে বাইরে যেতে দেয়, কিন্তু কাউকে ভেতরে ঢুকতে দেয় না

Private Subnet-এর একটা app সার্ভার security patch নামাচ্ছে। পথে address কীভাবে বদলে যায়, খেয়াল করে দেখো।

পরিস্থিতি

Private Route Table: 0.0.0.0/0 → nat-… · Public Route Table: 0.0.0.0/0 → igw-…

VPC10.0.0.0/16
Public Subnet10.0.0.0/24
Private Subnet10.0.10.0/24
App Server10.0.10.10
NAT Gateway10.0.0.50 · EIP 203.0.113.80
Internet Gateway
Patch Server198.51.100.30
HTTPS

App সার্ভার থেকে বের হওয়ার সময়

Source

10.0.10.10:43122

Destination

198.51.100.30:443

ধাপ 1 / 4
1

App সার্ভার patch সার্ভারের সঙ্গে connection খোলে। ওর Subnet-এর Route Table বলছে 0.0.0.0/0 যাবে NAT Gateway-তে, আর NAT Gateway বসানো আছে একটা Public Subnet-এ।

#NAT Instance (পুরোনো পদ্ধতি)

NAT Gateway আসার আগে NAT-এর কাজটা তোমাকে নিজেই একটা EC2 Instance-এ চালাতে হতো। পরীক্ষায় এটা এখনো “পুরোনো option” হিসেবে আসে, আর প্রশ্ন ঘোরে মূলত একটা setting নিয়েই।

কীভাবে বানাতে হয়:

  1. Instance-টা চালু করো একটা Public Subnet-এ, সঙ্গে একটা Elastic IP (বা public IP) দাও।
  2. Instance-এর source/destination check বন্ধ করো। Default অবস্থায় প্রতিটা EC2 Instance এমন traffic ফেলে দেয় যেটা তার নিজের কাছ থেকে আসেনি বা তার নিজের কাছে আসছে না। অথচ NAT Instance-এর কাজই হলো অন্য মেশিনের traffic পার করে দেওয়া। তাই check চালু থাকলে সে কোনো শব্দ না করে সব traffic ফেলে দেয়। NAT নিয়ে পরীক্ষায় এটাই সবচেয়ে বেশি আসে।
  3. Private Subnet-এর Route Table-এ 0.0.0.0/0-এর target হিসেবে NAT Instance (i-…) দাও।
  4. এর Security Group-এ inbound-এ private Subnet থেকে HTTP/HTTPS, আর outbound-এ ইন্টারনেটের দিকে HTTP/HTTPS খোলা রাখতে হবে। Instance-টা নিজে সামলাতে চাইলে তোমার network থেকে SSH-ও খুলে দিও।

নতুন কোনো system-এ এখন কেউ এটা কেন বানায় না:

  • সবকিছু তোমাকেই দেখতে হয়: OS patch, NAT software, monitoring।
  • High availability নিজে থেকে নেই: Instance বা তার AZ বসে গেলে, কোনো script বা Auto Scaling group নতুন একটা দিয়ে না বদলানো পর্যন্ত private সার্ভারগুলো ইন্টারনেট পায় না।
  • Bandwidth আটকে থাকে Instance type-এর সীমায়।
  • AWS আগে একটা তৈরি করা NAT AMI দিত, সেটা ছিল Amazon Linux 1-এর ওপর বানানো, আর ওটার support এখন শেষ। আজ বানাতে চাইলে নতুন কোনো image-এ NAT নিজেকেই configure করতে হবে।

#NAT Gateway

NAT Gateway হলো managed service হিসেবে NAT, মানে NAT-এর কাজটা AWS নিজে চালায়। আজকের দিনে সাধারণত এটাই বেছে নেওয়া হয়।

বৈশিষ্ট্যবিস্তারিত
পুরোপুরি managedকোনো OS নেই, patch করার ঝামেলা নেই, নিজে কোনো software চালাতে হয় না।
Bandwidthশুরু হয় 5 Gbps থেকে, দরকার হলে নিজে থেকেই 100 Gbps পর্যন্ত বাড়ে।
কোথায় থাকেএকটা (zonal, public) NAT Gateway তৈরি হয় একটা নির্দিষ্ট AZ-এর Public Subnet-এ, আর এটা একটা Elastic IP ব্যবহার করে। নিজের AZ-এর ভেতরে এর redundancy আছে।
Internet Gateway লাগবেইএর Subnet থেকে 0.0.0.0/0-এর route যেতে হবে VPC-র IGW-তে। IGW না থাকলে এটা ইন্টারনেটে পৌঁছাতে পারে না।
Security Group নেইNAT Gateway-তে Security Group লাগানো যায় না। Traffic নিয়ন্ত্রণ করতে হবে Instance-এর Security Group আর Subnet-এর network ACL দিয়ে।
কারা ব্যবহার করেঅন্য Subnet-এর Instance-গুলো এর দিকে route করে। এর নিজের (public) Subnet-এর Instance এটা ব্যবহার করে না, ওরা সরাসরি IGW দিয়ে বের হয়।
ইন্টারনেটে বের হওয়ার জন্য শুধু IPv4IPv6 সার্ভারের যদি শুধু বাইরে যাওয়ার মতো ইন্টারনেট লাগে, তাহলে এর বদলে egress-only internet gateway ব্যবহার করো (Chapter 22)।
খরচঘণ্টা ধরে চার্জ হয়, সঙ্গে প্রতি GB process করার জন্য আলাদা চার্জ। এর ওপর সাধারণ data transfer-এর খরচ তো আছেই।

#NAT Instance বনাম NAT Gateway

NAT InstanceNAT Gateway
কে সামলায়তুমি (OS, software, patch)AWS
Availabilityনিজে বানাতে হয় (script, Auto Scaling)নিজের AZ-এর ভেতরে redundant; পুরো HA চাইলে প্রতি AZ-এ একটা
BandwidthInstance type-এর ওপর নির্ভর করে5 Gbps, বেড়ে 100 Gbps পর্যন্ত
Security Groupহ্যাঁ, সঙ্গে network ACL-ওনা; শুধু network ACL
Source/destination checkতোমাকে বন্ধ করতে হবেপ্রযোজ্য নয়
Bastion হিসেবেও চালানোযায় (তবে উচিত নয়)না
খরচInstance-এর ঘণ্টা + data transferGateway-এর ঘণ্টা + প্রতি GB processing + data transfer

নিজেকে যাচাই করোপ্রশ্ন

Private Instance-গুলোকে ইন্টারনেট থেকে update নামাতে হবে, কিন্তু ইন্টারনেট থেকে কেউ যেন কখনো ওদের কাছে পৌঁছাতে না পারে। সমাধানটা highly available হতে হবে, আর কোনো রক্ষণাবেক্ষণের ঝামেলা থাকা চলবে না। কী ব্যবহার করবে?

#NAT Gateway আর high availability

একটা zonal NAT Gateway একটা AZ-এর ভেতরে highly available। কিন্তু পুরো AZ-টাই যদি বসে যায়, Gateway-ও তার সঙ্গে বসে যায়। তাই production-এ নিয়ম হলো:

  • যতগুলো AZ ব্যবহার করছ, প্রতিটাতে একটা করে NAT Gateway বানাও, আর প্রতিটা রাখো সেই AZ-এর Public Subnet-এ।
  • প্রতিটা AZ-এর private Subnet-কে আলাদা Route Table দাও, যেখানে 0.0.0.0/0 যাবে একই AZ-এর NAT Gateway-তে।

একটা NAT Gateway সবাই মিলে ভাগাভাগি করলে দুটো সমস্যা হয়, এভাবে সাজালে দুটোই এড়ানো যায়:

  1. Single point of failure: যে AZ-এ একমাত্র NAT Gateway-টা আছে, সেটা বসে গেলে বাকি যে AZ-গুলো ঠিকঠাক চলছে, ওরাও ইন্টারনেট হারায়।
  2. Cross-AZ data খরচ: AZ B থেকে AZ A-র NAT Gateway-তে যত গিগাবাইট যায়, প্রতিটার জন্য inter-AZ transfer-এর বিল হয়, NAT processing-এর খরচের ওপরে।

NAT-এর জন্য cross-AZ failover-এর দরকার নেই। কারণ একটা AZ বসে গেলে, যে সার্ভারগুলো ওই AZ-এর NAT Gateway ব্যবহার করত, সেগুলোও তো ওই AZ-এর সঙ্গেই চলে যায়।

NAT Gateway ও Availability Zone

Zonal NAT Gateway থাকে একটা AZ-এর ভেতরেই। একটা AZ বসে গেলে কী হয়, তিনভাবে দেখো: প্রতি AZ-এ একটা করে, সবাই মিলে একটা, আর Regional NAT Gateway।

পরিস্থিতি

Route Table AZ A: 0.0.0.0/0 → NAT A · Route Table AZ B: 0.0.0.0/0 → NAT B

VPC
AZ A
AZ B
Public
Private
Public
Private
Internet Gateway
NAT Gateway A
NAT Gateway B
App Server
App Server
ধাপ 1 / 2
1

প্রতিটা AZ-এর Public Subnet-এ তার নিজের NAT Gateway আছে, আর প্রতিটা AZ-এর private Route Table দেখাচ্ছে নিজের AZ-এর NAT Gateway-এর দিকে। Traffic-কে কখনো অন্য AZ-এ যেতে হয় না।

#Regional NAT Gateway

২০২৫ সালের নভেম্বর থেকে NAT Gateway regional availability mode-এও বানানো যায়। Regional NAT Gateway কোনো Public Subnet-এ বসে না, এটা সরাসরি VPC-র সঙ্গে যুক্ত থাকে:

  • একটাই NAT Gateway (একটা ID, route-এ একটাই target) VPC-র সব AZ-এর কাজ চালায়;
  • তোমার workload যে যে AZ-এ আসে, AWS নিজে থেকেই সেই AZ যোগ করে, আবার দরকার না থাকলে সরিয়ে দেয় (নতুন AZ-এ ছড়াতে কিছুটা সময় লাগতে পারে, প্রায় এক ঘণ্টা পর্যন্ত);
  • এটা রাখার জন্য কোনো Public Subnet লাগে না, আর এর নিজের একটা Route Table থাকে;
  • Automatic mode-এ এর public IP address-ও AWS সামলায়; manual mode-এ Elastic IP তুমি নিজে দাও।

মানে “প্রতি AZ-এ একটা” সাজানোর যে resilience, সেটা পাওয়া যায় অনেক কম ঝামেলায়। Zonal NAT Gateway এখনো আছে, আর private NAT-এর জন্য (নিচে দেখো) এখনো ওটাই লাগে।

#Public বনাম Private NAT Gateway

NAT Gateway দুই রকম connectivity type-এর হয়:

Public NAT GatewayPrivate NAT Gateway
কোথায় তৈরি হয়Public Subnet-এPrivate Subnet-এ
Elastic IPলাগেলাগে না
Internet Gatewayলাগেব্যবহার হয় না
কী কাজে লাগেPrivate Subnet → ইন্টারনেটPrivate Subnet → Transit Gateway বা Virtual Private Gateway হয়ে অন্য VPC বা on-premises network
সাধারণত কেন লাগেবাইরে ইন্টারনেটে যাওয়ার জন্যঅন্য network-এর range তোমার range-এর সঙ্গে overlap করে, অথবা ওরা শুধু ছোট একটা অনুমোদিত range থেকে আসা traffic নেয়

Private NAT Gateway তোমার সার্ভারের address বদলে দেয় VPC-র একটা ছোট “routable” range-এর address দিয়ে, যে range অন্য network-এর সঙ্গে overlap করে না। এতে তোমার বাকি range-এর সঙ্গে overlap করা network-এও traffic পৌঁছাতে পারে। এটা কখনো ইন্টারনেটের ধারেকাছেও যায় না।

#নিজে করে দেখো

একটা private Subnet-এর জন্য NAT Gateway বানাও (ID-গুলোর জায়গায় তোমার নিজেরগুলো বসাও; NAT Gateway-এর ঘণ্টা ধরে খরচ আছে, তাই কাজ শেষে মুছে ফেলো):

EIP=$(aws ec2 allocate-address --domain vpc --query AllocationId --output text)
NAT=$(aws ec2 create-nat-gateway --subnet-id $PUBLIC_SUBNET --allocation-id $EIP \
      --query NatGateway.NatGatewayId --output text)
aws ec2 wait nat-gateway-available --nat-gateway-ids $NAT

aws ec2 create-route --route-table-id $PRIVATE_RT --destination-cidr-block 0.0.0.0/0 --nat-gateway-id $NAT

# Private Instance থেকে (Session Manager দিয়ে ঢুকে) দেখো ইন্টারনেট তোমাকে কোন public address-এ দেখছে:
curl -s https://checkip.amazonaws.com      # NAT Gateway-এর Elastic IP দেখাবে

# SSH-এর বদলে Session Manager (AWS CLI-র Session Manager plugin লাগবে):
aws ssm start-session --target i-0123456789abcdef0

# সব মুছে ফেলো
aws ec2 delete-nat-gateway --nat-gateway-id $NAT
aws ec2 release-address --allocation-id $EIP   # NAT Gateway মুছে যাওয়ার পরে

#সংক্ষেপে

মনে রাখার কথা

  • Bastion Host হলো Public Subnet-এ রাখা একটা EC2 Instance, যার মধ্য দিয়ে private সার্ভারে যাওয়া হয়। এর Security Group SSH/RDP খোলে শুধু admin-দের IP-র জন্য; আর private সার্ভার SSH/RDP খোলে শুধু Bastion-এর Security Group-এর জন্য।
  • Session Manager (বা EC2 Instance Connect Endpoint) দিয়ে shell পাওয়া যায় কোনো inbound port, SSH key বা Bastion ছাড়াই। নিয়ন্ত্রণ করে IAM, আর সব কিছু log হয়। পরীক্ষায় “port 22 না খুলে” দেখলেই এটা উত্তর।
  • NAT বাইরে যাওয়ার সময় source address বদলে দেয় আর একটা translation table রাখে। তাই private সার্ভার বাইরে connection শুরু করতে পারে, কিন্তু বাইরে থেকে কেউ ভেতরে connection শুরু করতে পারে না।
  • NAT Instance-এর জন্য লাগে Public Subnet, Elastic IP, তার দিকে route, আর source/destination check বন্ধ রাখা। এটা নিজে সামলাতে হয়, আর এটা পুরোনো পদ্ধতি।
  • NAT Gateway managed, 5–100 Gbps, Elastic IP নিয়ে Public Subnet-এ থাকে, Internet Gateway লাগে, এতে কোনো Security Group নেই, আর শুধু IPv4 সামলায় (IPv6-এর জন্য egress-only internet gateway)।
  • High availability চাইলে প্রতি AZ-এ একটা NAT Gateway আর প্রতি AZ-এর জন্য আলাদা Route Table, অথবা একটা Regional NAT Gateway। সবাই মিলে একটা NAT Gateway ব্যবহার করলে সেটা single point of failure, সঙ্গে cross-AZ খরচও বাড়ে।
  • Private NAT Gateway (EIP নেই, IGW নেই) দিয়ে এমন অন্য VPC বা on-premises network-এ যুক্ত হওয়া যায়, যাদের range overlap করে।