ЁЯУМ рдзрдбрд╛ 05 тАФ Elastic IPs рдЖрдгрд┐ allow-listing
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-per-az-routing ┬╖ рдкреБрдвреЗ: lesson-06-costs
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ04, рдЖрдгрд┐ рдлрд╛рдЯрдХрд╛рдЪрд╛ рд╕реНрдерд┐рд░ рдкрд░рддреАрдЪрд╛ рдкрддреНрддрд╛: Elastic IP. Partners рддреЛ allow-list рдХрд╛
рдХрд░рддрд╛рдд, рджреБрд╕рд░рд╛ IP рдлрд╛рдЯрдХрд╛рд▓рд╛ ports рдЪрд╛ рджреБрд╕рд░рд╛ рд╕рдВрдЪ рдХрд╕рд╛ рджреЗрддреЛ, рдЖрдгрд┐ рдкрддреНрддрд╛ рдореНрд╣рдгрдЬреЗ рдУрд│рдЦ рдХрд╛ рдирд╛рд╣реА.
nat/demo.py рдордзреАрд▓ eip() рд╣реЗ рджрд╛рдЦрд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдлрд╛рдЯрдХрд╛рддреВрди рдмрд╛рд╣реЗрд░ рдкрдбрдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрд░рд╛рдЪреНрдпрд╛ рдорд╛рдЧреЗ рд╢рд╛рд│реЗрдЪрд╛ рдкрддреНрддрд╛ рдЕрд╕рддреЛ. рдЧрд╛рд╡рд╛рддрд▓реА рдПрдХ рдмрдБрдХ рдореНрд╣рдгрддреЗ: "рдЖрдореНрд╣реА рдлрдХреНрдд рддреНрдпрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░реВрди рдЖрд▓реЗрд▓реАрдЪ рдкрддреНрд░реЗ рдЙрдШрдбрддреЛ". рдЫрд╛рди тАФ рджреБрд╕рд▒реНрдпрд╛ рдЧрд╛рд╡рд╛рддрд▓рд╛ рдЕрдиреЛрд│рдЦреА рдорд╛рдгреВрд╕ рд╢рд╛рд│рд╛ рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рд╕реЛрдВрдЧ рдШреЗрдК рд╢рдХрдд рдирд╛рд╣реА.
рдкрдг рдиреАрдЯ рдкрд╛рд╣рд╛. рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдЪреНрдпрд╛ рдкрддреНрд░рд╛рдорд╛рдЧреЗ рддреЛрдЪ рдкрддреНрддрд╛ рдЕрд╕рддреЛ: рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрд┐рдХреЗрдЪреНрдпрд╛, рдХреЕрдиреНрдЯреАрдирдЪреНрдпрд╛, рдкрд╣рд┐рд▓реНрдпрд╛ рджрд┐рд╡рд╢реАрдЪреНрдпрд╛ рдирд╡реНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдЪреНрдпрд╛рд╣реА. рдмрдБрдХреЗрдиреЗ рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрд┐рдХреЗрд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рд▓реЗрд▓рд╛ рдирд╛рд╣реА. рддрд┐рдиреЗ рд╕рдВрдкреВрд░реНрдг рд╢рд╛рд│реЗрд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рд▓рд╛ рдЖрд╣реЗ.
рдЖрдгрд┐ рд╢рд╛рд│реЗрдд рдЧрд░реНрджреА рд╡рд╛рдврд▓реА рдХреА рддреА рдлрд╛рдЯрдХрд╛рдЪрд╛ рджреБрд╕рд░рд╛ рдкрддреНрддрд╛ рдЬреЛрдбрддреЗ. рдЖрддрд╛ рдмрдБрдХреЗрд▓рд╛ рджреЛрдиреНрд╣реА рдорд╛рд╣реАрдд рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗрдд, рдирд╛рд╣реАрддрд░ рдЕрд░реНрдзреА рдкрддреНрд░реЗ рди рд╡рд╛рдЪрддрд╛рдЪ рд░рд╛рд╣рддрд╛рдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
app["ЁЯкС payments app"] --> gate
web["ЁЯкС web app"] --> gate
job["ЁЯкС batch job"] --> gate
gate["ЁЯЪк NAT gateway<br/>ЁЯУМ 13.232.10.20<br/>ЁЯУМ 13.232.10.30"]
gate -->|"1 from a listed IP"| partner["ЁЯПж partner firewall<br/>allow 13.232.10.20/32<br/>allow 13.232.10.30/32"]
partner -->|"2 still check who: mTLS / signed request"| ok["тЬЕ"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/nat/lesson-diagrams.html#l05
тЭУ рдХрд╛рдп
- Elastic IP (EIP) тАФ рддреБрдореНрд╣реА release рдХрд░реЗрдкрд░реНрдпрдВрдд рддреБрдордЪреНрдпрд╛ account рдЪрд╛ рдЕрд╕рд▓реЗрд▓рд╛ рд╕реНрдерд┐рд░ public IPv4 address. Public NAT gateway рд▓рд╛ рдПрдХ рд▓рд╛рдЧрддреЛ; private subnets рдордзреВрди рдирд┐рдШрдгрд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ connection source address рдореНрд╣рдгреВрди рддреЛрдЪ рдШреЗрдКрди рдмрд╛рд╣реЗрд░ рдкрдбрддреЗ.
- рд╕реНрдерд┐рд░ egress IP тАФ рдкрддреНрддрд╛ рдмрджрд▓рдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди partners рддреЛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ firewall allow-list рдордзреНрдпреЗ
рдЯрд╛рдХреВ рд╢рдХрддрд╛рдд (
13.232.10.20/32). - Secondary IPs тАФ NAT gateway рд╢реА рддреБрдореНрд╣реА 8 IP addresses рдкрд░реНрдпрдВрдд рдЬреЛрдбреВ рд╢рдХрддрд╛ (primary рдЖрдгрд┐ secondary рдорд┐рд│реВрди; рддреБрдордЪреЗ Service Quotas рддрдкрд╛рд╕рд╛, default рдХрдореА рдЕрд╕реВ рд╢рдХрддреЛ). рдкреНрд░рддреНрдпреЗрдХ IP рдкреНрд░рддреНрдпреЗрдХ unique destination рдХрдбреЗ рдЖрдгрдЦреА 55,000 рдПрдХрд╛рдЪ рд╡реЗрд│рдЪреЗ connections рджреЗрддреЛ (рдзрдбрд╛ 08). рдордЧ partners рдиреА рддреЗ рд╕рдЧрд│реЗ allow-list рдХрд░рд╛рдпрд▓рд╛ рд╣рд╡реЗрдд.
- IP рдореНрд╣рдгрдЬреЗ рдУрд│рдЦ рдирд╛рд╣реА тАФ рддреНрдпрд╛ NAT рдорд╛рдЧрдЪреЗ рдкреНрд░рддреНрдпреЗрдХ workload рддреЛрдЪ address рд╡рд╛рдкрд░рддреЗ. рддреЛ allow-list рдХрд░рдгреЗ рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рдВрд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рдгреЗ. рддреНрдпрд╛рдЪреНрдпрд╛рд╕реЛрдмрдд рдЦрд░реЗ authentication рд╡рд╛рдкрд░рд╛: mTLS, signed requests, OAuth tokens рдХрд┐рдВрд╡рд╛ рдпреЛрдЧреНрдп рддрдкрд╛рд╕рдгреАрд╕рд╣ API keys.
- Public IPv4 addresses рдирд╛ рдкреИрд╕реЗ рд▓рд╛рдЧрддрд╛рдд тАФ AWS public IPv4 addresses рд╕рд╛рдареА, Elastic IPs рд╕рд╣, рдкреНрд░рддрд┐ рддрд╛рд╕ рдкреИрд╕реЗ рдШреЗрддреЗ; pricing page рддрдкрд╛рд╕рд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг partner firewalls (banks, payment providers, рд╕рд░рдХрд╛рд░реА APIs) рдмрд░реЗрдЪрджрд╛ рдлрдХреНрдд рдУрд│рдЦреАрдЪреНрдпрд╛ addresses рд╡рд░реВрдирдЪ traffic рд╕реНрд╡реАрдХрд╛рд░рддрд╛рдд. NAT рдорд╛рдЧрдЪреЗ servers рд╣реЗ рд╕реЛрдбрд╡рддрд╛рдд: рдЕрдиреЗрдХ рдмрджрд▓рдгрд╛рд░реЗ servers, рдПрдХ рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реА рд╕реНрдерд┐рд░ addresses. рдкрдг teams рдмрд░реЗрдЪрджрд╛ рдЗрдереЗрдЪ рдерд╛рдВрдмрддрд╛рдд, рдЖрдгрд┐ рдордЧ allow-list рд╣реЗрдЪ рдПрдХрдореЗрд╡ рдХреБрд▓реВрдк рдЙрд░рддреЗ тАФ рдЖрдгрд┐ VPC рдордзреАрд▓ рдХреЛрдгрддреЗрд╣реА compromised workload рддреНрдпрд╛рддреВрди рдЖрд░рд╛рдорд╛рдд рдЬрд╛рдК рд╢рдХрддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
nat/gateway.py рдордзреАрд▓ NatGateway(name, public_ips) IPs рдЪреА рдпрд╛рджреА рдШреЗрддреЗ.
send() рдкрд╣рд┐рд▓рд╛ IP рд╡рд╛рдкрд░реВрди рдкрд╛рд╣рддреЗ; рддреНрдпрд╛ IP рдиреЗ рддреНрдпрд╛ destination рдХрдбреЗ ports_per_dest ports рд╡рд╛рдкрд░рд▓реЗ рдХреА рддреЗ
рдкреБрдврдЪреНрдпрд╛ IP рдХрдбреЗ рдЬрд╛рддреЗ. nat/demo.py рдордзреАрд▓ eip() рджреЛрди рдкрддреНрддреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЯрдХрд╛рд╕рд╛рдареА
partner allow-list рдЫрд╛рдкрддреЗ. ports_per_dest рд▓рд╣рд╛рди рдХреЗрд▓реНрдпрд╛рдиреЗ рдореВрдарднрд░ connections рдордзреНрдпреЗрдЪ рддреБрдореНрд╣реА рдкреБрдврдЪреНрдпрд╛
IP рдХрдбреЗ рд╕рд╛рдВрдбрдгреЗ рдкрд╛рд╣реВ рд╢рдХрддрд╛.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 nat/demo.py eip
python3 - <<'EOF'
import sys; sys.path.insert(0, "nat"); from gateway import NatGateway
PYPI = ("151.101.0.223", 443, "tcp")
for ips in (["13.232.10.20"], ["13.232.10.20", "13.232.10.30"]):
g = NatGateway("nat-a", ips, ports_per_dest=3)
out = [g.send(("10.20.48.25", 40000 + i), PYPI) for i in range(7)]
print(len(ips), "IP(s):", [r[0] + ":" + str(r[1]) if r else "ERR" for r in out], "┬╖ errors:", g.errors)
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
eip рд╣реЗ partner firewall allow-list: 13.232.10.20/32, 13.232.10.30/32,
every desk behind the gate looks like one of these 2 addresses тАФ add IPs (up to 8) for more ports
рдЖрдгрд┐ allow-listing the NAT's IP trusts EVERY workload behind it рд╣реА рд╕реВрдЪрдирд╛ рдЫрд╛рдкрддреЗ.
рддреБрдордЪрд╛ snippet (55,000 рдРрд╡рдЬреА рдкреНрд░рддреНрдпреЗрдХ destination рд╕рд╛рдареА 3 ports, рдореНрд╣рдгрдЬреЗ screen рд╡рд░ рдорд╛рд╡реЗрд▓) рд╣реЗ рдЫрд╛рдкрддреЛ:
1 IP(s): ['13.232.10.20:1024', '13.232.10.20:1025', '13.232.10.20:1026', 'ERR', 'ERR', 'ERR', 'ERR'] ┬╖ errors: 4
2 IP(s): ['13.232.10.20:1024', '13.232.10.20:1025', '13.232.10.20:1026', '13.232.10.30:1024', '13.232.10.30:1025', '13.232.10.30:1026', 'ERR'] ┬╖ errors: 1
рджреБрд╕рд▒реНрдпрд╛ IP рдиреЗ рдиреЛрдВрджрд╡рд╣реАрддреАрд▓ рдЬрд╛рдЧрд╛ рджреБрдкреНрдкрдЯ рдХреЗрд▓реА. рдЖрдгрд┐ connections 4тАУ6
13.232.10.30 рд╡рд░реВрди рдмрд╛рд╣реЗрд░ рдкрдбрд▓реЗ тАФ рдлрдХреНрдд .20 рдпрд╛рджреАрдд рдЯрд╛рдХрд▓реЗрд▓реНрдпрд╛ partner рдиреЗ рддреЗ рдирд╛рдХрд╛рд░рд▓реЗ рдЕрд╕рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рд╕реНрдерд┐рд░ рдкрддреНрддреНрдпрд╛рдореБрд│реЗ partners рддреБрдордЪреА рд╢рд╛рд│рд╛ рдУрд│рдЦреВ рд╢рдХрддрд╛рдд, рдЖрдгрд┐ рдЬрд╛рд╕реНрдд рдкрддреНрддреЗ рдлрд╛рдЯрдХрд╛рд▓рд╛ рдЬрд╛рд╕реНрдд ports рджреЗрддрд╛рдд тАФ рдкрдг рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрддрд╛ partner рдЪреНрдпрд╛ рдпрд╛рджреАрдд рдЕрд╕рд╛рдпрд▓рд╛рдЪ рд╣рд╡рд╛, рдЖрдгрд┐ рддреНрдпрд╛рддрд▓рд╛ рдХреЛрдгрддрд╛рд╣реА рдкрддреНрддрд╛ рдХреЛрдгрддреЗ workload call рдХрд░рдд рдЖрд╣реЗ рддреЗ рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- partner API рд╕рд╛рдареА IP allow-listing рд╣реЗрдЪ рдПрдХрдореЗрд╡ рд╕рдВрд░рдХреНрд╖рдг
- port errors рджреБрд░реБрд╕реНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА secondary IP рдЬреЛрдбрдгреЗ рдЖрдгрд┐ partners рдирд╛ рди рд╕рд╛рдВрдЧрдгреЗ тАФ рдЕрд░реНрдзреЗ calls fail рд╣реЛрдК рд▓рд╛рдЧрддрд╛рдд
- рд╕рд╛рдлрд╕рдлрд╛рдИ рдХрд░рддрд╛рдирд╛ рдЪреБрдХреВрди Elastic IP release рдХрд░рдгреЗ тАФ рддреЛрдЪ рдкрддреНрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдкрд░рдд рдорд┐рд│рдгрд╛рд░ рдирд╛рд╣реА
- private subnets рдордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ server рд▓рд╛ NAT рдЪрд╛ IP рдорд┐рд│рддреЛ рдЕрд╕реЗ рд╕рдордЬрдгреЗ тАФ рддреЗ рддреЛ share рдХрд░рддрд╛рдд; рддреНрдпрд╛рд╡рд░реВрди рдЖрддрд▓реЗ рдХрд╛рд╣реАрд╣реА reachable рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ public NAT gateway рд▓рд╛ secondary Elastic IP рдЬреЛрдбрд╛, рдЖрдгрд┐ partners рдирд╛ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА addresses рдЪреА рдпрд╛рджреА рдХрд╛рдврд╛:
aws ec2 allocate-address --domain vpc --tag-specifications 'ResourceType=elastic-ip,Tags=[{Key=Name,Value=nat-a-2}]'
aws ec2 associate-nat-gateway-address --nat-gateway-id nat-0abc --allocation-ids eipalloc-0def
aws ec2 describe-nat-gateways --nat-gateway-ids nat-0abc --query 'NatGateways[].NatGatewayAddresses[].[PublicIp,IsPrimary,Status]' --output table
Terraform рдордзреНрдпреЗ, secondary address рд╕рд╣ рддреЛрдЪ gateway:
resource "aws_nat_gateway" "a" {
allocation_id = aws_eip.nat_a.id
secondary_allocation_ids = [aws_eip.nat_a_2.id]
subnet_id = aws_subnet.public_a.id
}
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: egress IPs рдЪреА рдпрд╛рджреА рдПрдХрд╛рдЪ рдард┐рдХрд╛рдгреА рдареЗрд╡рд╛ (рдПрдХ output, wiki page, рдПрдХ parameter), address рдЬреЛрдбрдгреНрдпрд╛ рдХрд┐рдВрд╡рд╛ рдмрджрд▓рдгреНрдпрд╛рдЖрдзреА рддреА partners рдирд╛ рдкрд╛рдард╡рд╛, рдЖрдгрд┐ allow-list рд▓рд╛ рдХрдзреАрд╣реА рдПрдХрдореЗрд╡ рддрдкрд╛рд╕рдгреА рд╣реЛрдК рджреЗрдК рдирдХрд╛.
тПня╕П рдкреБрдвреЗ
рдлрд╛рдЯрдХ рдореЛрдлрдд рдирд╛рд╣реА. рддреНрдпрд╛рд▓рд╛ рджреЛрди рдореАрдЯрд░ рдЖрд╣реЗрдд, рдЖрдгрд┐ рддреНрдпрд╛рддрд▓рд╛ рдПрдХ рдЬрд╡рд│рдЬрд╡рд│ рдкреНрд░рддреНрдпреЗрдХ team рд▓рд╛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рддреЛ. рдлрд╛рдЯрдХрд╛рдЪрд╛ рдЦрд░реНрдЪ рдХрд┐рддреА.
git checkout lesson-06-costs