ЁЯЪк рдзрдбрд╛ 05 тАФ Internet gateway рдЖрдгрд┐ public subnets: рдореБрдЦреНрдп рджрд░рд╡рд╛рдЬрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-route-tables ┬╖ рдкреБрдвреЗ: lesson-06-sg-vs-nacl
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ04, рдЖрдгрд┐ рдкрд╣рд┐рд▓рд╛ рдкреВрд░реНрдг campus: vpc/demo.py рдордзреАрд▓ campus()
рддреАрди wings рдмрд╛рдВрдзрддреЛ тАФ public-a, app-a, data-a тАФ рдЬреНрдпрд╛рдВрдд web, app рдЖрдгрд┐ db рд╣реЗ desks рдЖрд╣реЗрдд, рдЖрдгрд┐
vpc/network.py рдордзреАрд▓ Campus.walk() рдПрдХрд╛ packet рдЪрд╛ рдмрд╛рд╣реЗрд░рдЪрд╛ рдкреНрд░рд╡рд╛рд╕ рдкрд╛рд╣рддреЛ. igw()
web рдЖрдгрд┐ db рдирд╛ internet рдХрдбреЗ рдкрд╛рдард╡рддреЛ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Campus рдЪреНрдпрд╛ рдХреБрдВрдкрдгрд╛рд▓рд╛ рд╢рд╣рд░рд╛рдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛ рдПрдХрдЪ рдореБрдЦреНрдп рджрд░рд╡рд╛рдЬрд╛ ЁЯЪк рдЖрд╣реЗ: internet gateway.
рджрд░рд╡рд╛рдЬрд╛ рдмрд╛рдВрдзрдгреЗ рдкреБрд░реЗрд╕реЗ рдирд╛рд╣реА. Wing рджрд░рд╡рд╛рдЬрд╛ рд╡рд╛рдкрд░рддреЛ рддреЛ рдлрдХреНрдд рддреНрдпрд╛рдЪреНрдпрд╛ corridor рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╡рд░ "рдмрд╛рдХреА рд╕рдЧрд│реЗ тЖТ рдореБрдЦреНрдп рджрд░рд╡рд╛рдЬрд╛" рдЕрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЕрд╕реЗрд▓ рддрд░рдЪ. Public wing рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╡рд░ рддрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ. Data wing рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╡рд░ рдирд╛рд╣реА тАФ рдореНрд╣рдгреВрди data wing рдордзреВрди рд╢рд╣рд░рд╛рдХрдбреЗ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдкрддреНрд░рд╛рд▓рд╛ рдПрдХрд╣реА рдУрд│ рд╕рд╛рдкрдбрдд рдирд╛рд╣реА рдЖрдгрд┐ рддреЗ drop рд╣реЛрддреЗ.
рдЖрдгрдЦреА рдПрдХ рдЧреЛрд╖реНрдЯ. рдкрддреНрд░ рджрд░рд╡рд╛рдЬрд╛рддреВрди рдмрд╛рд╣реЗрд░ рдЧреЗрд▓реНрдпрд╛рд╡рд░ рд╢рд╣рд░рд╛рд▓рд╛ рдЙрддреНрддрд░ рд▓рд┐рд╣рд┐рддрд╛ рдЖрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ. рдлрдХреНрдд
campus рдЪрд╛ рдирдВрдмрд░ (10.20.0.10) рдЕрд╕рд▓реЗрд▓реНрдпрд╛ desk рдХрдбреЗ рд╢рд╣рд░ рд╡рд╛рдкрд░реВ рд╢рдХреЗрд▓ рдЕрд╕рд╛ рдкрддреНрддрд╛рдЪ рдирд╛рд╣реА. рдореНрд╣рдгреВрди
рд╢рд╣рд░рд╛рд╢реА рдмреЛрд▓рдгрд╛рд▒реНрдпрд╛ desk рд▓рд╛ public рдкрддреНрддрд╛ рдкрдг рд▓рд╛рдЧрддреЛ тАФ рд╕рд╛рдзрд╛ public IP рдХрд┐рдВрд╡рд╛
Elastic IP. рджрд░рд╡рд╛рдЬрд╛ рджреЛрдиреНрд╣реА рджрд┐рд╢рд╛рдВрдиреА рдПрдХрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА рджреБрд╕рд░рд╛ рдкрддреНрддрд╛ рдмрджрд▓рддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
web["ЁЯЦея╕П web 10.20.0.10<br/>public-a ┬╖ public IP"]
db["ЁЯЧДя╕П db 10.20.96.15<br/>data-a"]
rtp["ЁЯкз rt-public<br/>0.0.0.0/0 тЖТ igw-school"]
rtd["ЁЯкз rt-data<br/>no 0.0.0.0/0"]
igw["ЁЯЪк igw-school"]
net["ЁЯМН 93.184.216.34:443"]
web --> rtp --> igw --> net
db --> rtd -->|"no route тЖТ dropped"| x["ЁЯЪл"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/vpc/lesson-diagrams.html#l05
тЭУ рдХрд╛рдп
- Internet gateway (IGW) тАФ VPC рд▓рд╛ internet рд╢реА рдЬреЛрдбрдгрд╛рд░рд╛ VPC рдЪрд╛ рдШрдЯрдХ. рдкреНрд░рддреНрдпреЗрдХ VPC рд▓рд╛ рдПрдХ IGW. AWS рддреЛ redundant рдЖрдгрд┐ scaled рдкрджреНрдзрддреАрдиреЗ рдЪрд╛рд▓рд╡рддреЛ; рддреНрдпрд╛рдЪрд╛ рдЖрдХрд╛рд░ рдард░рд╡рд╛рдпрдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. рддреЛ instance рдЪрд╛ private IP рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ public IP рдпрд╛рдВрдЪреНрдпрд╛рдд рднрд╛рд╖рд╛рдВрддрд░ рдХрд░рддреЛ.
- Public subnet тАФ рдЬреНрдпрд╛рдЪреНрдпрд╛ route table рдордзреНрдпреЗ
0.0.0.0/0 тЖТ igw-тАжрдЖрд╣реЗ рдЕрд╕рд╛ subnet. рддреЛ route рд╣реАрдЪ рддреНрдпрд╛рд▓рд╛ public рдмрдирд╡рдгрд╛рд░реА рдПрдХрдореЗрд╡ рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ. - Public IP тАФ internet рд╡рд░реВрди instance рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддрд╛ рдпрд╛рд╡реЗ, рдХрд┐рдВрд╡рд╛ instance рд▓рд╛ рдереЗрдЯ internet рд╢реА рдмреЛрд▓рддрд╛ рдпрд╛рд╡реЗ, рдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рд▓рд╛ public IPv4 address (launch рд╡реЗрд│реА рдЖрдкреЛрдЖрдк рдорд┐рд│рддреЛ, instance рдерд╛рдВрдмрд▓рд╛ рдХреА рд╕реЛрдбрд▓рд╛ рдЬрд╛рддреЛ) рдХрд┐рдВрд╡рд╛ Elastic IP (рддреБрдореНрд╣реА рд╕реЛрдбреЗрдкрд░реНрдпрдВрдд рддреБрдордЪрд╛рдЪ) рдкрдг рд▓рд╛рдЧрддреЛ. AWS public IPv4 addresses рд╕рд╛рдареА рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдкреИрд╕реЗ рдШреЗрддреЗ (рдкреНрд░рддреНрдпреЗрдХреА рдЕрдВрджрд╛рдЬреЗ $0.005 рдкреНрд░рддрд┐ рддрд╛рд╕ тАФ VPC pricing page рддрдкрд╛рд╕рд╛).
- Private subnet тАФ IGW рдХрдбреЗ route рдирд╛рд╣реА. рддреЛ public subnet рдордзреАрд▓ NAT gateway рдорд╛рд░реНрдЧреЗ рдмрд╛рд╣реЗрд░
рдЬрд╛рдК рд╢рдХрддреЛ (
0.0.0.0/0 тЖТ nat-тАж) тАФ NAT school рдкрд╛рд╣рд╛ тАФ рдЖрдгрд┐ internet рд╡рд░реВрди рдХреЛрдгреАрд╣реА рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рд╕рдВрд╡рд╛рдж рд╕реБрд░реВ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. - Isolated subnet тАФ default route рдЕрдЬрд┐рдмрд╛рдд рдирд╛рд╣реА. рдпрд╛ lab рдордзреАрд▓ data wing.
- IPv6 тАФ IPv6 addresses рдЬрдЧрднрд░рд╛рдд unique рдЕрд╕рддрд╛рдд. "рдлрдХреНрдд рдмрд╛рд╣реЗрд░" IPv6 рд╕рд╛рдареА egress-only internet gateway рдЕрд╕рддреЛ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдЦрд░реА рд╕реАрдорд╛ route table рдЖрд╣реЗ. рдШрдЯреНрдЯ security group рдЕрд╕рд▓реЗрд▓рд╛, рдкрдг IGW рдХрдбреЗ route рдЖрдгрд┐ public IP рдЕрд╕рд▓реЗрд▓рд╛ database internet рдкрд╛рд╕реВрди рдлрдХреНрдд рдПрдХрд╛ рдирд┐рдпрдо-рдмрджрд▓рд╛рдЪреНрдпрд╛ рдЕрдВрддрд░рд╛рд╡рд░ рдЕрд╕рддреЛ. рдмрд╛рд╣реЗрд░ рдЬрд╛рдгреНрдпрд╛рдЪрд╛ route рдирд╕рд▓реЗрд▓реНрдпрд╛ subnet рдордзреАрд▓ database рдкрд░реНрдпрдВрдд internet рд╡рд░реВрди рдкреЛрд╣реЛрдЪрддрд╛ рдпреЗрдд рдирд╛рд╣реА, рдордЧ рддреНрдпрд╛рдЪрд╛ security group рдХрд╛рд╣реАрд╣реА рдореНрд╣рдгреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
Campus.walk(src, dst_ip, proto, port) рдХреНрд░рдорд╛рдиреЗ рддрдкрд╛рд╕рддреЛ: source security group
(outbound), source subnet рдЪрд╛ NACL (outbound), рдЖрдгрд┐ рдордЧ route table. Target
local рдирд╕реЗрд▓, рддрд░ packet рддреНрдпрд╛ target рдорд╛рд░реНрдЧреЗ "subnet рд╕реЛрдбрддреЛ" рдЖрдгрд┐ walk рд╕рдВрдкрддреЛ. vpc/demo.py рдордзреАрд▓
igw() web рдЖрдгрд┐ db рдирд╛ 93.184.216.34:443 рдкрд░реНрдпрдВрдд рдЪрд╛рд▓рд╡рддреЛ. рд╣реЗ рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ model рдЖрд╣реЗ:
walk() public IP рддрдкрд╛рд╕рдд рдирд╛рд╣реА тАФ рддреЛ рднрд╛рдЧ рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 vpc/demo.py igw
python3 - <<'EOF'
import sys; sys.path.insert(0, "vpc"); from network import RouteTable
from demo import campus, VPC
c = campus()
c.rts["rt-public"] = RouteTable("rt-public", VPC) # take the gate sign down
print("web without the IGW route:", c.walk("web", "93.184.216.34", "tcp", 443))
c.rts["rt-data"].routes.append(("0.0.0.0/0", "igw-school")) # a mistake: point data at the gate
print("db with an IGW route: ", c.walk("db", "93.184.216.34", "tcp", 443)[0])
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
igw рдЫрд╛рдкрддреЛ:
web тЖТ internet :443 тЬЕ ЁЯзН sg-web out тЬУ ┬╖ ЁЯЪж acl-open rule 100 ALLOW ┬╖ ЁЯкз rt-public: 0.0.0.0/0 тЖТ igw-school ┬╖ ЁЯЪк leaves the subnet via igw-school
db тЖТ internet :443 ЁЯЪл ЁЯзН sg-db out тЬУ ┬╖ ЁЯЪж acl-data rule 110 ALLOW ┬╖ ЁЯкз no route тЖТ dropped
рддреБрдордЪрд╛ snippet рдЫрд╛рдкрддреЛ
web without the IGW route: (False, ['ЁЯзН sg-web out тЬУ', 'ЁЯЪж acl-open rule 100 ALLOW', 'ЁЯкз no route тЖТ dropped'])
тАФ рддреЛрдЪ desk, рддреЗрдЪ рд░рдХреНрд╖рдХ, рдкрд╛рдЯреА рдирд╛рд╣реА, internet рдирд╛рд╣реА. рдордЧ db with an IGW route: True:
рдПрдХрд╛ рдЪреБрдХреАрдЪреНрдпрд╛ route рдиреЗ data wing "public" рдХреЗрд▓рд╛. (AWS рдордзреНрдпреЗ db рд▓рд╛ рдкреНрд░рддреНрдпрдХреНрд╖ internet рд╢реА рдмреЛрд▓рдгреНрдпрд╛рд╕рд╛рдареА рддрд░реАрд╣реА
public IP рд▓рд╛рдЧрд▓рд╛ рдЕрд╕рддрд╛ тАФ model рддреА рддрдкрд╛рд╕рдгреА рд╡рдЧрд│рддреЗ.)
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
"Public" рдореНрд╣рдгрдЬреЗ route table рд╡рд░рдЪреА рдПрдХ рдУрд│. рддреА рдХрд╛рдврд╛ рдЖрдгрд┐ public wing рдмрдВрдж рд╣реЛрддреЛ; рддреА рдЬреЛрдбрд╛ рдЖрдгрд┐ data wing рд╕реБрджреНрдзрд╛ public рд╣реЛрддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдирд╛рд╡ рдХрд┐рдВрд╡рд╛ tag рд╡рд░реВрди subnet рд▓рд╛ "private" рдореНрд╣рдгрдгреЗ тАФ рддреНрдпрд╛рдЪрд╛ route table рд╡рд╛рдЪрд╛
- public subnet, рдкрдг instance рд▓рд╛ public IP рдирд╛рд╣реА тАФ рджрд░рд╡рд╛рдЬрд╛рдХрдбреЗ рдЙрддреНрддрд░ рдкрд░рдд рдкрд╛рдард╡рд╛рдпрд▓рд╛ рдкрддреНрддрд╛рдЪ рдирд╛рд╣реА
- app рдЖрдгрд┐ data рд╕рд╣ рдкреНрд░рддреНрдпреЗрдХ subnet рд╡рд░ "auto-assign public IPv4" рдЪрд╛рд▓реВ рдХрд░рдгреЗ
- "рддреНрдпрд╛рдВрдирд╛ updates рд▓рд╛рдЧрддрд╛рдд" рдореНрд╣рдгреВрди app servers public subnets рдордзреНрдпреЗ рдареЗрд╡рдгреЗ тАФ рддреНрдпрд╛рд╕рд╛рдареАрдЪ NAT рдЖрдгрд┐ endpoints рдЖрд╣реЗрдд
- рдЬреЛрдбрд▓реЗрд▓рд╛ IGW рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ route рдирд┐рд░реНрджреЗрд╢ рдХрд░реЗрдкрд░реНрдпрдВрдд рдХрд╛рд╣реАрдЪ рдХрд░рдд рдирд╛рд╣реА рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Public subnets рдордзреНрдпреЗ рдлрдХреНрдд load balancers рдЖрдгрд┐ NAT gateways рдЕрд╕рддрд╛рдд. Servers рдЖрдгрд┐ databases рдирд╛ public IP рдЕрдЬрд┐рдмрд╛рдд рдирд╕рддреЛ. Public IPs рдЖрдкреЛрдЖрдк рджреЗрдгрд╛рд▒реНрдпрд╛ subnets рд╡рд░ Security Hub рдмреЛрдЯ рдареЗрд╡рддреЛ.
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд; IDs рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ рдЖрд╣реЗрдд):
aws ec2 create-internet-gateway
aws ec2 attach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0
aws ec2 create-route --route-table-id rtb-0aaaaaaaaaaaaaaaa \
--destination-cidr-block 0.0.0.0/0 --gateway-id igw-0123456789abcdef0
aws ec2 modify-subnet-attribute --subnet-id subnet-0123456789abcdef0 --map-public-ip-on-launch
aws ec2 allocate-address --domain vpc
тПня╕П рдкреБрдвреЗ
рдкрд╛рдЯреНрдпрд╛ рд╕рд╛рдВрдЧрддрд╛рдд рдХреА packet рдХреБрдареЗ рдЬрд╛рдК рд╢рдХрддреЛ. рдЖрддрд╛: рдХреЛрдг рджрд╛рд░ рдареЛрдард╛рд╡реВ рд╢рдХрддреЛ. Security groups рд╡рд┐рд░реБрджреНрдз NACLs тАФ рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдЖрдгрд┐ wing рдЪреЗ рджрд╛рд░.
git checkout lesson-06-sg-vs-nacl