ЁЯПл The SchoolтА║ЁЯПл VPCтА║ЁЯФв рдзрдбрд╛ 02 тАФ CIDR рдЖрдгрд┐ IP addresses: campus рд╕рд╛рдареА рдШрд░рд╛рдВрдЪреЗ рдирдВрдмрд░
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯФв рдзрдбрд╛ 02 тАФ CIDR рдЖрдгрд┐ IP addresses: campus рд╕рд╛рдареА рдШрд░рд╛рдВрдЪреЗ рдирдВрдмрд░

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-why-vpc ┬╖ рдкреБрдвреЗ: lesson-03-subnets-azs


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбрд╛ 01, рдЖрдгрд┐ рдирдВрдмрд░: 10.20.0.0/16 рд╕рд╛рд░рдЦрд╛ CIDR block рддреБрдордЪреНрдпрд╛ рдорд╛рд▓рдХреАрдЪреЗ рдХрд┐рддреА рдкрддреНрддреЗ рдЖрд╣реЗрдд рддреЗ рдХрд╕реЗ рд╕рд╛рдВрдЧрддреЛ, рдХреЛрдгрддреНрдпрд╛ ranges private рдЖрд╣реЗрдд, рдЖрдгрд┐ рдкрд░рдд рдлрд┐рд░рд╡рддрд╛ рди рдпреЗрдгрд╛рд░рд╛ рдЖрд░рд╛рдЦрдбреНрдпрд╛рдЪрд╛ рдПрдХ рдирд┐рдпрдо тАФ рдХрдзреАрдЪ overlap рдирдХреЛ. vpc/demo.py рдордзреАрд▓ cidr() рдЖрдгрд┐ vpc/network.py рдордзреАрд▓ overlaps().

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

Campus рд╡рд░рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реАрд▓рд╛ рдШрд░рд╛рдЪрд╛ рдирдВрдмрд░ рд▓рд╛рдЧрддреЛ, рдореНрд╣рдгрдЬреЗ рдкрддреНрд░реЗ рддрд┐рдереЗ рдкреЛрд╣реЛрдЪрддрд╛рдд. IPv4 address рдореНрд╣рдгрдЬреЗ рдЪрд╛рд░ рдирдВрдмрд░, рдЬрд╕реЗ 10.20.96.15.

рд╢рд╛рд│рд╛ рдкреНрд░рддреНрдпреЗрдХ рдирдВрдмрд░ рдПрдХреЗрдХ рдХрд░реВрди рд▓рд┐рд╣рд┐рдд рдирд╛рд╣реА. рддреА рдПрдХ рдирд┐рдпрдо рд▓рд┐рд╣рд┐рддреЗ: "10.20. рдиреЗ рд╕реБрд░реВ рд╣реЛрдгрд╛рд░реЗ рд╕рдЧрд│реЗ рдирдВрдмрд░". рддреЛ рдирд┐рдпрдо рдореНрд╣рдгрдЬреЗ CIDR block: 10.20.0.0/16.

/16 рдЪрд╛ рдЕрд░реНрде: рдкрд╣рд┐рд▓реЗ 16 bits рдард░рд▓реЗрд▓реЗ тАФ рдмрд╛рдХреАрдЪреЗ рддреБрдордЪреЗ. рдХрдореА bits рдард░рд╡рд▓реЗ рддрд░ рдЬрд╛рд╕реНрдд рдирдВрдмрд░ рдорд┐рд│рддрд╛рдд. рдЬрд╛рд╕реНрдд bits рдард░рд╡рд▓реЗ рддрд░ рдХрдореА:

рдЖрдгрдЦреА рдПрдХ рдирд┐рдпрдо. рджреЛрди campuses рдиреА рддреЗрдЪ рдШрд░рд╛рдВрдЪреЗ рдирдВрдмрд░ рд╡рд╛рдкрд░рд▓реЗ, рддрд░ 10.0.5.9 рд╕рд╛рдареАрдЪреНрдпрд╛ рдкрддреНрд░рд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛ campus рд▓рд╛ рдЬрд╛рдпрдЪреЗ рддреЗ рдХрд│рдгрд╛рд░ рдирд╛рд╣реА. рдореНрд╣рдгреВрди рдЬреА range рддреБрдореНрд╣реА рдХрдзреАрддрд░реА рдЬреЛрдбреВ рд╢рдХрддрд╛, рддреА рддреБрдореНрд╣реА рдХрдзреАрдЪ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рдд рдирд╛рд╣реА.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    ip["10.20.96.15<br/>00001010.00010100.01100000.00001111"]
    p16["/16 тЖТ first 16 bits fixed<br/>65,536 addresses"]
    p20["/20 тЖТ 4,096"]
    p24["/24 тЖТ 256"]
    p28["/28 тЖТ 16"]
    ip --> p16 --> p20 --> p24 --> p28
    office["ЁЯПв office 10.0.0.0/16"]
    bad["10.0.128.0/17 тЖТ OVERLAPS"]
    good["10.20.0.0/16 тЖТ no overlap"]
    office -.-> bad
    office -.-> good

ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/vpc/lesson-diagrams.html#l02

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг range рд╣рд╛ рдЕрд╕рд╛ рдПрдХрдЪ рдирд┐рд░реНрдгрдп рдЖрд╣реЗ рдЬреЛ рдирдВрддрд░ рдмрджрд▓рдгреЗ рдЬрд╡рд│рдЬрд╡рд│ рдЕрд╢рдХреНрдп рдЕрд╕рддреЗ. Servers рдиреА рднрд░рд▓реЗрд▓реНрдпрд╛ VPC рд▓рд╛ рдПрдХрд╛ weekend рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ numbering рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА. рдЬреНрдпрд╛ рджрд┐рд╡рд╢реА office VPN, partner рдХрд┐рдВрд╡рд╛ рджреБрд╕рд░рд╛ Region рдЬреЛрдбрд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ, рддреНрдпрд╛ рджрд┐рд╡рд╢реА overlap рд╣реЛрдгрд╛рд░реА range рдПрдХрд╛ рддрд╛рд╕рд╛рдЪреНрдпрд╛ рдХрд╛рдорд╛рдЪреЗ migration рдХрд░реВрди рдЯрд╛рдХрддреЗ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

vpc/demo.py рдордзреАрд▓ cidr() рдЪрд╛рд░ prefixes рд╕рд╛рдареА 2 ** (32 - p) рдЫрд╛рдкрддреЛ, рдЖрдгрд┐ рдордЧ overlaps() рдиреЗ рддреАрди рдЙрдореЗрджрд╡рд╛рд░ ranges office network 10.0.0.0/16 рд╡рд┐рд░реБрджреНрдз рддрдкрд╛рд╕рддреЛ. vpc/network.py рдордзреАрд▓ overlaps() рд╣реА Python рдЪреНрдпрд╛ ipaddress.ip_network(...).overlaps(...) рд╡рд░ рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдПрдХ рдУрд│ рдЖрд╣реЗ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 vpc/demo.py cidr
python3 - <<'EOF'
import sys, ipaddress; sys.path.insert(0, "vpc"); from network import overlaps
for c in ("10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "10.20.0.0/16", "8.8.8.0/24"):
    print(c.ljust(15), "private" if ipaddress.ip_network(c).is_private else "PUBLIC")
for p in (17, 22, 26):
    print(f"/{p}", 2 ** (32 - p))
print(overlaps("10.20.0.0/16", "10.21.0.0/16"), overlaps("10.20.0.0/16", "10.20.200.0/24"))
EOF

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

cidr рдЪрд╛рд░ рдЖрдХрд╛рд░ рдЫрд╛рдкрддреЛ тАФ 65,536, 4,096, 256, 16 тАФ рдЖрдгрд┐ рдордЧ:

   10.0.0.0/16    vs the office network 10.0.0.0/16: OVERLAPS тАФ pick another range
   10.0.128.0/17  vs the office network 10.0.0.0/16: OVERLAPS тАФ pick another range
   10.20.0.0/16   vs the office network 10.0.0.0/16: no overlap тЖТ safe to connect later

рддреБрдордЪрд╛ snippet рддреАрди RFC 1918 ranges рд╕рд╛рдареА рдЖрдгрд┐ 10.20.0.0/16 рд╕рд╛рдареА private рдЫрд╛рдкрддреЛ, 8.8.8.0/24 рд╕рд╛рдареА PUBLIC; рдордЧ /17 32768, /22 1024, /26 64; рдЖрдгрд┐ рдордЧ False True тАФ 10.21.0.0/16 рд╢реЗрдЬрд╛рд░реА рдЖрд╣реЗ, рдкрдг 10.20.200.0/24 campus рдЪреНрдпрд╛ рдЖрдд рдЖрд╣реЗ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рддреБрдореНрд╣реА рдХреЛрдгрддрд╛рд╣реА prefix рдЖрдХрд╛рд░ рдореНрд╣рдгреВрди рд╡рд╛рдЪреВ рд╢рдХрддрд╛, private range рдЖрдгрд┐ public range рдордзрд▓рд╛ рдлрд░рдХ рдУрд│рдЦреВ рд╢рдХрддрд╛, рдЖрдгрд┐ overlap рдмрд╛рдВрдзрд▓рд╛ рдЬрд╛рдгреНрдпрд╛рдкреВрд░реНрд╡реАрдЪ рдкрдХрдбреВ рд╢рдХрддрд╛.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд

рдореЛрдареНрдпрд╛ teams рдкреВрд░реНрдг company рд╕рд╛рдареА рдПрдХрдЪ IP рдЖрд░рд╛рдЦрдбрд╛ рдареЗрд╡рддрд╛рдд тАФ рдкреНрд░рддреНрдпреЗрдХ VPC, рдкреНрд░рддреНрдпреЗрдХ Region, office, partners тАФ рдЖрдгрд┐ рддреНрдпрд╛рддреВрдирдЪ ranges рд╡рд╛рдЯрддрд╛рдд, рд╕рд╣рд╕рд╛ IPAM рд╡рд╛рдкрд░реВрди.

рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд; IDs рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ рдЖрд╣реЗрдд):

aws ec2 create-ipam --operating-regions RegionName=ap-south-1
aws ec2 create-ipam-pool --ipam-scope-id ipam-scope-0123456789abcdef0 \
    --address-family ipv4 --locale ap-south-1
aws ec2 provision-ipam-pool-cidr --ipam-pool-id ipam-pool-0123456789abcdef0 --cidr 10.0.0.0/8
aws ec2 create-vpc --ipv4-ipam-pool-id ipam-pool-0123456789abcdef0 --ipv4-netmask-length 16

тПня╕П рдкреБрдвреЗ

Campus рдХрдбреЗ 65,536 рдШрд░рд╛рдВрдЪреЗ рдирдВрдмрд░ рдЖрд╣реЗрдд. рдЖрддрд╛ рддреЗ wings рдордзреНрдпреЗ рд╡рд╛рдЯрд╛, рдкреНрд░рддреНрдпреЗрдХ рдЗрдорд╛рд░рддреАрд╕рд╛рдареА рдПрдХ тАФ subnets рдЖрдгрд┐ AZs, рдЖрдгрд┐ AWS рдкреНрд░рддреНрдпреЗрдХ wing рдордзреНрдпреЗ рд╕реНрд╡рддрдГрдХрдбреЗ рдареЗрд╡рддреЛ рддреЗ 5 рдирдВрдмрд░.

git checkout lesson-03-subnets-azs

ЁЯФв Lesson 02 тАФ CIDR & IP addresses: house numbers for the campus

ЁЯУН You are here: Lesson 02 of 12 ┬╖ Previous: lesson-01-why-vpc ┬╖ Next: lesson-03-subnets-azs


ЁЯУж What's in this branch

Lesson 01, plus the numbers: how a CIDR block like 10.20.0.0/16 says how many addresses you own, which ranges are private, and the one planning rule you cannot undo тАФ never overlap. cidr() in vpc/demo.py and overlaps() in vpc/network.py.

ЁЯзТ Explain like I'm 5

Every room on the campus needs a house number so letters reach it. An IPv4 address is four numbers, like 10.20.96.15.

The school does not list every number one by one. It writes a rule: "all numbers that start with 10.20.". That rule is a CIDR block: 10.20.0.0/16.

The /16 means: the first 16 bits are fixed тАФ the rest are yours. Fix fewer bits and you get more numbers. Fix more bits and you get fewer:

One more rule. If two campuses use the same house numbers, a letter for 10.0.5.9 cannot know which campus to go to. So you never reuse a range you might one day connect.

ЁЯЧ║я╕П Diagram

flowchart LR
    ip["10.20.96.15<br/>00001010.00010100.01100000.00001111"]
    p16["/16 тЖТ first 16 bits fixed<br/>65,536 addresses"]
    p20["/20 тЖТ 4,096"]
    p24["/24 тЖТ 256"]
    p28["/28 тЖТ 16"]
    ip --> p16 --> p20 --> p24 --> p28
    office["ЁЯПв office 10.0.0.0/16"]
    bad["10.0.128.0/17 тЖТ OVERLAPS"]
    good["10.20.0.0/16 тЖТ no overlap"]
    office -.-> bad
    office -.-> good

ЁЯЧ║я╕П Drawn version + a lab: https://school-edh.pages.dev/vpc/lesson-diagrams.html#l02

тЭУ What

ЁЯдФ Why

Because the range is the one decision that is almost impossible to change later. A VPC full of servers cannot be renumbered on a weekend. The day the office VPN, a partner or a second Region must connect, an overlapping range turns a one-hour job into a migration.

ЁЯФз How (in this repo)

cidr() in vpc/demo.py prints 2 ** (32 - p) for four prefixes, then checks three candidate ranges against the office network 10.0.0.0/16 with overlaps(). overlaps() in vpc/network.py is one line on top of Python's ipaddress.ip_network(...).overlaps(...).

ЁЯзк Try it

python3 vpc/demo.py cidr
python3 - <<'EOF'
import sys, ipaddress; sys.path.insert(0, "vpc"); from network import overlaps
for c in ("10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "10.20.0.0/16", "8.8.8.0/24"):
    print(c.ljust(15), "private" if ipaddress.ip_network(c).is_private else "PUBLIC")
for p in (17, 22, 26):
    print(f"/{p}", 2 ** (32 - p))
print(overlaps("10.20.0.0/16", "10.21.0.0/16"), overlaps("10.20.0.0/16", "10.20.200.0/24"))
EOF

тЬЕ Verify тАФ what you should see

cidr prints the four sizes тАФ 65,536, 4,096, 256, 16 тАФ then:

   10.0.0.0/16    vs the office network 10.0.0.0/16: OVERLAPS тАФ pick another range
   10.0.128.0/17  vs the office network 10.0.0.0/16: OVERLAPS тАФ pick another range
   10.20.0.0/16   vs the office network 10.0.0.0/16: no overlap тЖТ safe to connect later

Your snippet prints private for the three RFC 1918 ranges and for 10.20.0.0/16, PUBLIC for 8.8.8.0/24; then /17 32768, /22 1024, /26 64; then False True тАФ 10.21.0.0/16 is a neighbour, but 10.20.200.0/24 is inside the campus.

ЁЯПБ What you just proved

You can read any prefix as a size, tell a private range from a public one, and catch an overlap before it is built.

тЪая╕П Common mistakes

ЁЯПн In production

Large teams keep one IP plan for the whole company тАФ every VPC, every Region, the office, the partners тАФ and hand out ranges from it, usually with IPAM.

On a real account (needs the AWS CLI and credentials; IDs are examples):

aws ec2 create-ipam --operating-regions RegionName=ap-south-1
aws ec2 create-ipam-pool --ipam-scope-id ipam-scope-0123456789abcdef0 \
    --address-family ipv4 --locale ap-south-1
aws ec2 provision-ipam-pool-cidr --ipam-pool-id ipam-pool-0123456789abcdef0 --cidr 10.0.0.0/8
aws ec2 create-vpc --ipv4-ipam-pool-id ipam-pool-0123456789abcdef0 --ipv4-netmask-length 16

тПня╕П Next

The campus owns 65,536 house numbers. Now split them into wings, one per building тАФ subnets and AZs, and the 5 numbers AWS keeps in every wing.

git checkout lesson-03-subnets-azs
тЖР Previouswhy vpcNext тЖТsubnets azs

This page is the lesson's README from the lesson-02-cidr-ips branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.