net/tools/subnets.py

104 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# ============================================================
# План адресации по фиксированной схеме (соответствует заданию 1).
# Вызываются скриптами настройки: output в формате key=value
# читается через eval в bash.
#
# HQ_BASE — базовая сеть офиса HQ (например 10.10.100.0/24):
# VLAN100 = +0 /27 (<=32 адресов): HQ-RTR = сеть+1, HQ-SRV = сеть+2
# VLAN200 = +32 /28 (<=16 адресов): HQ-RTR = сеть+1
# VLAN999 = +48 /29 (<=8 адресов): HQ-RTR = сеть+1, HQ-SW = сеть+2
# BR_BASE — базовая сеть офиса BR (например 10.10.200.0/24):
# BR-SRV = +0 /28 (<=16 адресов): BR-FW = сеть+1, BR-SRV = сеть+2
# линк = +32 /30 (мин. маска): BR-RTR = сеть+1, BR-FW = сеть+2
# GRE: 10.10.10.0/30 (сеть по заданию): HQ-RTR = .1, BR-RTR = .2
# Линки к ISP: сети по заданию, ISP = .1, роутер = .2
# ============================================================
import sys
import ipaddress
# Туннель GRE: сеть 10.10.10.0/30 (по заданию сеть 10.10.10.0/24, мин. маска)
GRE_HQ = ipaddress.ip_interface("10.10.10.1/30")
GRE_BR = ipaddress.ip_interface("10.10.10.2/30")
def iface(net, offset):
"""адрес с префиксом: первый хост плюс offset внутри сети"""
ip = ipaddress.ip_address(int(net.network_address) + offset)
return f"{ip}/{net.prefixlen}"
def plain(net, offset):
"""адрес без префикса"""
return str(ipaddress.ip_address(int(net.network_address) + offset))
def hq(base):
base = ipaddress.ip_network(base, strict=False)
n100 = ipaddress.ip_network((base.network_address + 0, 27)) # <=32
n200 = ipaddress.ip_network((base.network_address + 32, 28)) # <=16
n999 = ipaddress.ip_network((base.network_address + 48, 29)) # <=8
rows = [
("VLAN100_NET", str(n100)),
("VLAN200_NET", str(n200)),
("VLAN999_NET", str(n999)),
# адрес HQ-RTR в каждой VLAN
("VLAN100_ADDR", iface(n100, 1)),
("VLAN200_ADDR", iface(n200, 1)),
("VLAN999_ADDR", iface(n999, 1)),
# сервер
("HQ_SRV_IP", plain(n100, 2)),
("SRV_ADDR", iface(n100, 2)),
("SRV_GW", plain(n100, 1)),
# управление HQ-SW
("MGMT_ADDR", iface(n999, 2)),
("MGMT_GW", plain(n999, 1)),
# туннель (сеть и концы по заданию)
("GRE_LOCAL_HQ", str(GRE_HQ.ip)),
("GRE_LOCAL_BR", str(GRE_BR.ip)),
# DNS-записи таблицы 3 (ISP-линки фиксированы заданием)
("HQ_RTR_IP", plain(n100, 1)),
("ISP_TO_HQ_IP", "172.16.1.1"),
("ISP_TO_BR_IP", "172.16.2.1"),
]
return rows
def br(base):
base = ipaddress.ip_network(base, strict=False)
nsrv = ipaddress.ip_network((base.network_address + 0, 28)) # <=16
nlink = ipaddress.ip_network((base.network_address + 32, 30)) # мин. маска
rows = [
("BR_SRV_NET", str(nsrv)),
("BR_LINK_NET", str(nlink)),
("BR_SRV_FW", iface(nsrv, 1)), # адрес BR-FW в сети BR-SRV
("BR_SRV_ADDR", iface(nsrv, 2)), # адрес BR-SRV
("BR_SRV_GW", plain(nsrv, 1)), # шлюз BR-SRV (это BR-FW)
("BR_LINK_RTR", iface(nlink, 1)), # адрес BR-RTR на линке
("BR_LINK_FW", iface(nlink, 2)), # адрес BR-FW на линке
("BR_RTR_GW", plain(nlink, 1)), # шлюз BR-FW (это BR-RTR)
("BR_RTR_IP", plain(nlink, 1)), # DNS-запись br-rtr
("BR_FW_IP", plain(nlink, 2)), # DNS-запись br-fw
("BR_SRV_IP", plain(nsrv, 2)), # DNS-запись br-srv
]
return rows
def main():
if len(sys.argv) < 3 or sys.argv[1] not in ("hq", "br"):
print("Использование: subnets.py hq|br <базовая_сеть>" ,
file=sys.stderr)
sys.exit(1)
side = sys.argv[1]
base = sys.argv[2]
try:
rows = hq(base) if side == "hq" else br(base)
except ValueError:
print("Некорректная базовая сеть:", base, file=sys.stderr)
sys.exit(1)
for key, value in rows:
print(f"{key}={value}")
main()