104 lines
4.4 KiB
Python
104 lines
4.4 KiB
Python
#!/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()
|