#!/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()