ЁЯУТ рдзрдбрд╛ 02 тАФ рдлрд╛рдЯрдХ рдХрд╕реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рддреЗ (PAT)
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-why-nat ┬╖ рдкреБрдвреЗ: lesson-03-gateway-vs-instance
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01, рдЖрдгрд┐ рдкреНрд░рддреНрдпрдХреНрд╖ рдиреЛрдВрджрд╡рд╣реА: port address translation (PAT). рдПрдХрдЪ public IP
рдЕрдиреЗрдХ private рдмрд╛рдХрд╛рдВрдирд╛ рдкреБрд░рддреЛ, рдЖрдгрд┐ рдлрд╛рдЯрдХ рджреЗрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ port рд╡рд░реВрди рддреЛ рддреНрдпрд╛рдВрдирд╛ рд╡реЗрдЧрд│реЗ рдУрд│рдЦрддреЛ.
nat/demo.py рдордзреАрд▓ pat() рдиреЛрдВрджрд╡рд╣реА рдУрд│-рдУрд│ рдХрд░реВрди рдЫрд╛рдкрддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рдПрдХрд╛рдЪ рдлрд╛рдЯрдХрд╛рддреВрди рдмрд╛рд╣реЗрд░ рдЬрд╛рддрд╛рдд. рддреНрдпрд╛рдВрдЪреА рд╕рдЧрд│реА рдкрддреНрд░реЗ рдПрдХрд╛рдЪ рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдкрддреНрддреНрдпрд╛рдиреЗ рдмрд╛рд╣реЗрд░ рдкрдбрддрд╛рдд. рдордЧ рдХреЛрдгрддреЗ рдЙрддреНрддрд░ рдХреБрдареЗ рдЬрд╛рдпрдЪреЗ рд╣реЗ рд░рдЦрд╡рд╛рд▓рджрд╛рд░рд╛рд▓рд╛ рдХрд╕реЗ рдХрд│рддреЗ?
рд░рдЦрд╡рд╛рд▓рджрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдлреЗрд░реАрд▓рд╛ рдПрдХ рддрд┐рдХреАрдЯ рдХреНрд░рдорд╛рдВрдХ ЁЯОЯя╕П рджреЗрддреЛ рдЖрдгрд┐ рддреЛ рдиреЛрдВрджрд╡рд╣реАрдд рд▓рд┐рд╣рд┐рддреЛ:
| рддрд┐рдХреАрдЯ | рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА | рдХреБрдареЗ рдЧреЗрд▓реА |
|---|---|---|
| 1024 | рдмрд╛рдХ 25, рдЦреЛрд▓реА 48 | рдкреБрд╕реНрддрдХрд╛рдВрдЪреЗ рджреБрдХрд╛рди |
| 1025 | рдмрд╛рдХ 7, рдЦреЛрд▓реА 64 | рдкреБрд╕реНрддрдХрд╛рдВрдЪреЗ рджреБрдХрд╛рди |
| 1024 | рдмрд╛рдХ 25, рдЦреЛрд▓реА 48 | рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп |
рдЙрддреНрддрд░ рдкрд░рдд рдпреЗрддреЗ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЕрд╕рддреЗ "рд╢рд╛рд│реЗрдЪрд╛ рдкрддреНрддрд╛, рддрд┐рдХреАрдЯ 1025, рдкреБрд╕реНрддрдХрд╛рдВрдЪреНрдпрд╛ рджреБрдХрд╛рдирд╛рдХрдбреВрди". рд░рдЦрд╡рд╛рд▓рджрд╛рд░ рддреА рдУрд│ рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рддреЗ рдмрд╛рдХ 7 рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╡рддреЛ. рджреЛрди рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдВрдЪрд╛ private рдЦрд┐рд╕рд╛ рдХреНрд░рдорд╛рдВрдХ рдПрдХрдЪ рдЕрд╕рд▓рд╛ рддрд░реА рдЪрд╛рд▓рддреЗ тАФ рддрд┐рдХрд┐рдЯреЗ рд╡реЗрдЧрд│реА рдЕрд╕рддрд╛рдд, рддреНрдпрд╛рдореБрд│реЗ рдЙрддреНрддрд░реЗ рдХрдзреАрдЪ рдПрдХрдореЗрдХрд╛рдВрдд рдорд┐рд╕рд│рдд рдирд╛рд╣реАрдд.
рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛, рддрд┐рдХреАрдЯ 1024 рджреЛрдирджрд╛ рдЖрд▓реЗ рдЖрд╣реЗ. рддреЗ рдЪрд╛рд▓рддреЗ: рдПрдХ рдлреЗрд░реА рдкреБрд╕реНрддрдХрд╛рдВрдЪреНрдпрд╛ рджреБрдХрд╛рдирд╛рдд рдЧреЗрд▓реА, рджреБрд╕рд░реА рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рдд. рд░рдЦрд╡рд╛рд▓рджрд╛рд░ рддрд┐рдХреАрдЯ рдЖрдгрд┐ рдЙрддреНрддрд░ рдХреЛрдг рд▓рд┐рд╣рд┐рдд рдЖрд╣реЗ рд╣реЗ рджреЛрдиреНрд╣реА рдЬреБрд│рд╡рддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
d1["ЁЯкС 10.20.48.25:50001"]
d2["ЁЯкС 10.20.64.7:50001"]
gate["ЁЯЪк 13.232.10.20<br/>ЁЯУТ register<br/>1024 тЖФ 10.20.48.25:50001 (pypi)<br/>1025 тЖФ 10.20.64.7:50001 (pypi)"]
pypi["ЁЯМР pypi 151.101.0.223:443"]
d1 -->|"1 out"| gate
d2 -->|"1 out"| gate
gate -->|"2 :1024 and :1025"| pypi
pypi -->|"3 answer to :1025"| gate
gate -->|"4 row 1025 тЖТ 10.20.64.7"| d2
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/nat/lesson-diagrams.html#l02
тЭУ рдХрд╛рдп
- Connection рдкрд╛рдЪ рдЧреЛрд╖реНрдЯреАрдВрдиреА рдУрд│рдЦрд▓реЗ рдЬрд╛рддреЗ: source IP, source port, destination IP, destination port, protocol (NAT gateway рд╕рд╛рдареА TCP, UDP рдХрд┐рдВрд╡рд╛ ICMP).
- PAT (port address translation) тАФ рдЕрдиреЗрдХ private addresses рдПрдХрдЪ public address рд╡рд╛рдкрд░рддрд╛рдд;
рдлрд╛рдЯрдХ source port рд╕реБрджреНрдзрд╛ рдмрджрд▓рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рдкреНрд░рддреНрдпреЗрдХ connection рд▓рд╛ рддреНрдпрд╛ destination рд╕рд╛рдареА рд╡реЗрдЧрд│рд╛
public
IP:portрдорд┐рд│рддреЛ. - Translation table (рдиреЛрдВрджрд╡рд╣реА) тАФ model рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рдУрд│
(public_ip, public_port, destination)рдиреЗ рдУрд│рдЦрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдд private(ip, port)рд╡ рддреА рд╢реЗрд╡рдЯрдЪреА рд╡рд╛рдкрд░рд▓реА рдЧреЗрд▓реНрдпрд╛рдЪреА рд╡реЗрд│ рдЕрд╕рддреЗ. - рддреЛрдЪ рд╕рдВрд╡рд╛рдж, рддреАрдЪ рдУрд│ тАФ рддреНрдпрд╛рдЪ рдмрд╛рдХрд╛рд╡рд░реВрди рдЖрдгрд┐ рддреНрдпрд╛рдЪ port рд╡рд░реВрди рддреНрдпрд╛рдЪ destination рдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛ packet рдЖрдкрд▓реА рдУрд│ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рддреЛ. рдореНрд╣рдгреВрдирдЪ TCP connection рд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рдЖрдпреБрд╖реНрдпрднрд░ рдПрдХрдЪ public port рд░рд╛рд╣рддреЛ.
- Ports рдкреНрд░рддреНрдпреЗрдХ destination рд╕рд╛рдареА рд╡реЗрдЧрд│реЗ тАФ public port 1024 рдПрдХрд╛рдЪ рд╡реЗрд│реА pypi рдХрдбреЗ рдЖрдгрд┐ GitHub рдХрдбреЗ рд╡рд╛рдкрд░рд╛рдд рдЕрд╕реВ рд╢рдХрддреЛ. рдореНрд╣рдгреВрдирдЪ AWS рдЪреА рдорд░реНрдпрд╛рджрд╛ (рдзрдбрд╛ 08) рдкреНрд░рддреНрдпреЗрдХ unique destination рд╕рд╛рдареА рдЕрд╕рддреЗ.
- рдкрд░рддреАрдЪрд╛ traffic тАФ рдЙрддреНрддрд░рд╛рдЪрд╛ destination
IP:portрдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ source рдПрдЦрд╛рджреНрдпрд╛ рдУрд│реАрд╢реА рдЬреБрд│рд▓рд╛ рддрд░рдЪ рддреЗ рдЖрдд рдШреЗрддрд▓реЗ рдЬрд╛рддреЗ. рдмрд╛рдХреА рд╕рдЧрд│реЗ drop рд╣реЛрддреЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг machines рдкреЗрдХреНрд╖рд╛ public IPv4 addresses рдЦреВрдкрдЪ рдХрдореА рдЖрд╣реЗрдд. PAT рдореБрд│реЗ рд╕рдВрдкреВрд░реНрдг VPC рдПрдХрдЪ address (рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реА) рд╡рд╛рдкрд░реВ рд╢рдХрддреЗ, рдЖрдгрд┐ NAT "рдлрдХреНрдд outbound" рдЕрд╕рдгреНрдпрд╛рдЪреЗ рдХрд╛рд░рдгрд╣реА рд╣реАрдЪ рдиреЛрдВрджрд╡рд╣реА рдЖрд╣реЗ: рдУрд│ рдирд╛рд╣реА, рддрд░ рдкреНрд░рд╡реЗрд╢ рдирд╛рд╣реА. рдкреБрдвреЗ рддреБрдореНрд╣реА "connection reset" рдХрд┐рдВрд╡рд╛ "cannot allocate port" errors debug рдХрд░рд╛рд▓ (рдзрдбрд╛ 08), рддреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рд╣реАрдЪ рдиреЛрдВрджрд╡рд╣реА debug рдХрд░рдд рдЕрд╕рд╛рд▓.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
nat/gateway.py рдордзреНрдпреЗ send() рдЖрдзреА рддреНрдпрд╛рдЪ src рдЖрдгрд┐ dst рдЪреА рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реА
рдУрд│ рд╢реЛрдзрддреЗ рдЖрдгрд┐ рддреА рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рддреЗ. рддреА рдирд╕реЗрд▓, рддрд░ рддреНрдпрд╛ IP рд╡рд░ рддреНрдпрд╛ destination рдХрдбреЗ рдЖрдзреАрдЪ рд╡рд╛рдкрд░рд╛рдд рдирд╕рд▓реЗрд▓рд╛
рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди рдореЛрдХрд│рд╛ port (1024 рдкрд╛рд╕реВрди рд╡рд░) рдШреЗрддреЗ, рдУрд│ рд▓рд┐рд╣рд┐рддреЗ рдЖрдгрд┐ (public_ip, public_port) рдкрд░рдд рджреЗрддреЗ.
nat/demo.py рдордзреАрд▓ pat() рддреАрди connections рдкрд╛рдард╡рддреЗ рдЖрдгрд┐ g.table рдЫрд╛рдкрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 nat/demo.py pat
python3 - <<'EOF'
import sys; sys.path.insert(0, "nat"); from gateway import NatGateway
GITHUB = ("140.82.112.3", 443, "tcp")
g = NatGateway("nat-a", ["13.232.10.20"])
for desk in ("10.20.48.25", "10.20.64.7", "10.20.80.9"):
print(desk, "тЖТ", g.send((desk, 50001), GITHUB))
print("same desk again тЖТ", g.send(("10.20.64.7", 50001), GITHUB), "┬╖ rows:", len(g.table))
print("answer on 1026 тЖТ", g.reply("13.232.10.20", 1026, GITHUB))
print("answer on 1027 тЖТ", g.reply("13.232.10.20", 1027, GITHUB))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
pat рддреАрди translations рдЫрд╛рдкрддреЗ:
10.20.48.25:50001 тЖТ 151.101.0.223:443 written as 13.232.10.20:1024
10.20.64.7:50001 тЖТ 151.101.0.223:443 written as 13.232.10.20:1025
10.20.48.25:50002 тЖТ 140.82.112.3:443 written as 13.232.10.20:1024
рдордЧ рдиреЛрдВрджрд╡рд╣реА, рдЖрдгрд┐ answer to 13.232.10.20:1025 from pypi тЖТ back to ('10.20.64.7', 50001).
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
10.20.48.25 тЖТ ('13.232.10.20', 1024)
10.20.64.7 тЖТ ('13.232.10.20', 1025)
10.20.80.9 тЖТ ('13.232.10.20', 1026)
same desk again тЖТ ('13.232.10.20', 1025) ┬╖ rows: 3
answer on 1026 тЖТ ('10.20.80.9', 50001)
answer on 1027 тЖТ None
рддреАрди рдмрд╛рдХрд╛рдВрдиреА рдПрдХрдЪ private port 50001 рд╡рд╛рдкрд░рд▓рд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рддреАрди рд╡реЗрдЧрд╡реЗрдЧрд│реЗ public ports рдорд┐рд│рд╛рд▓реЗ. рдкреБрдиреНрд╣рд╛ рдкрд╛рдард╡рд▓реНрдпрд╛рдиреЗ рдирд╡реА рдУрд│ рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рдирд╛рд╣реА. Port 1027 рдХрдзреА рджрд┐рд▓рд╛рдЪ рдЧреЗрд▓рд╛ рдирд╡реНрд╣рддрд╛, рдореНрд╣рдгреВрди рддреНрдпрд╛рдЪреЗ "рдЙрддреНрддрд░" drop рдЭрд╛рд▓реЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдПрдХрдЪ public IP рдЕрдиреЗрдХ рдмрд╛рдХрд╛рдВрдирд╛ рдкреБрд░рддреЛ, рдХрд╛рд░рдг рдлрд╛рдЯрдХ ports рд╡рд╛рдЯрддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рд╣реВрди рдареЗрд╡рддреЗ; рдиреЛрдВрджрд╡рд╣реА рд╣реА рдЙрддреНрддрд░рд╛рдВрд╕рд╛рдареАрдЪреА рдкрддреНрддреНрдпрд╛рдВрдЪреА рд╡рд╣реА рдЖрд╣реЗ рдЖрдгрд┐ рдЕрдиреЛрд│рдЦреА рд▓реЛрдХрд╛рдВрд╡рд┐рд░реБрджреНрдзрдЪреЗ рдХреБрд▓реВрдкрд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- public port рдЖрдгрд┐ private port рдПрдХрдЪ рдЕрд╕рддреЛ рдЕрд╕реЗ рд╕рдордЬрдгреЗ тАФ рддреЛ рдлрд╛рдЯрдХ рдирд┐рд╡рдбрддреЗ
- рдПрдХрд╛ server рд╡рд░реВрди рд╣реЛрдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ connection рд▓рд╛ рдПрдХрдЪ public port рдорд┐рд│реЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ тАФ рдкреНрд░рддреНрдпреЗрдХ connection рд▓рд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдорд┐рд│рддреЛ
- "рдПрдХ public IP = рдПрдХрд╛ рд╡реЗрд│реА рдПрдХрдЪ connection" рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рдгреЗ тАФ PAT рдкреНрд░рддреНрдпреЗрдХ destination рд╕рд╛рдареА рд╣рдЬрд╛рд░реЛ рджреЗрддреЛ
- рдиреЛрдВрджрд╡рд╣реАрд▓рд╛ рдЖрдХрд╛рд░ рдЖрдгрд┐ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рдгреНрдпрд╛рдЪрд╛ рдХрд╛рд▓рд╛рд╡рдзреА рдЕрд╕рддреЛ рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ тАФ рдзрдбрд╛ 08
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ рддреБрдореНрд╣реА NAT gateway рдЪреА рдиреЛрдВрджрд╡рд╣реА рдереЗрдЯ рд╡рд╛рдЪреВ рд╢рдХрдд рдирд╛рд╣реА тАФ рддреА рддреБрдореНрд╣рд╛рд▓рд╛ metrics рдЖрдгрд┐ flow logs рдордзреВрди рджрд┐рд╕рддреЗ. NAT gateway рдЪреНрдпрд╛ network interface рд╡рд░рдЪреЗ VPC Flow Logs рдкреНрд░рддреНрдпреЗрдХ translation рдЪреА private рдмрд╛рдЬреВ рдЖрдгрд┐ public рдмрд╛рдЬреВ рджрд╛рдЦрд╡рддрд╛рдд:
aws ec2 describe-nat-gateways --nat-gateway-ids nat-0abc --query 'NatGateways[].NatGatewayAddresses[].[PublicIp,PrivateIp,NetworkInterfaceId]'
aws ec2 create-flow-logs --resource-type NetworkInterface --resource-ids eni-0abc --traffic-type ALL --log-destination-type cloud-watch-logs --log-group-name nat-flow-logs --deliver-logs-permission-arn arn:aws:iam::111122223333:role/flow-logs
aws cloudwatch get-metric-statistics --namespace AWS/NATGateway --metric-name ActiveConnectionCount --dimensions Name=NatGatewayId,Value=nat-0abc --start-time 2026-09-27T00:00:00Z --end-time 2026-09-27T06:00:00Z --period 300 --statistics Maximum
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ:
ActiveConnectionCountрдореНрд╣рдгрдЬреЗ рдпрд╛ рдХреНрд╖рдгреА рдиреЛрдВрджрд╡рд╣реАрдЪрд╛ рдЖрдХрд╛рд░. рдХреЛрдгрддреЗрд╣реА business рдХрд╛рд░рдг рдирд╕рддрд╛рдирд╛ рддреЛ рд╡рд╛рдврдд рдЧреЗрд▓рд╛, рддрд░ рдЖрддрд▓реЗ рдХрд╛рд╣реАрддрд░реА connections рдЙрдШрдбрдд рдЖрд╣реЗ рдЖрдгрд┐ рдмрдВрдж рдХрд░рдд рдирд╛рд╣реА.
тПня╕П рдкреБрдвреЗ
AWS рджреЛрди рдкреНрд░рдХрд╛рд░рдЪреА рдлрд╛рдЯрдХреЗ рджреЗрддреЗ: рдПрдХ AWS рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдЪрд╛рд▓рд╡рддреЗ, рдЖрдгрд┐ рдПрдХ рддреБрдореНрд╣реА EC2 instance рдкрд╛рд╕реВрди рдмрд╛рдВрдзрддрд╛. NAT gateway рд╡рд┐рд░реБрджреНрдз NAT instance тАФ scaling, failover, security groups рдЖрдгрд┐ рдЦрд░реНрдЪ.
git checkout lesson-03-gateway-vs-instance