simplex-api/simplex.md
2024-04-10 15:19:16 +02:00

173 lines
9.1 KiB
Markdown

# Introducció
A mesura que l'associació ha anat actualizant la infraestructura de serveis proveïment d'accés a Internet, s'ha incrementat la complexitat dels elements de suport dels processos d'AAA. Els processos adminstratius de gestió de subscripcions a serveis i d'afiliats a la associació s'han sobrecarregat de tal manera, que ja no és possible una gestió manual directe sobre tots els components que hi intervenen.
## Descripció del sistema de proveïment
L'element central del sistema de proveïment és un _Border Network Gateway_ (BNG). Aquest element està format per un servidor L2TP i PPPoE que proporciona connexions PPP als CPE dels subscriptors. Aquests dispositius poden accedir al BNG a través d'una xarxa L3 (Guifi.net) o bé de circuits L2 (bitstreams).
Per tal de centralitzar els processos d'AAA, comptem amb un servidor RADIUS amb registres basats en una base de dades relacional. De moment, només implementem processos d'_Autentication_ i d'_Access_. L'_Accounting_ no està previst que sigui implementar a curt termini.
Les implementacions amb que comptem són a la taula següent:
| Funció | Implementació | Versió |
|--------------------|----------------|------------------------------|
| L2TP/PPPoE server | Accel-PPP | 0.12.0 |
| RADIUS server | FreeRADIUS | 3.0.12+dfsg-5+deb9u1 |
| Database | MySQL | 15.1 Distrib 10.1.41-MariaDB |
El següent esquema representa la topologia dels elements esmentats:
```
Components d'infraestructura de provisionament del BNG
+----------+
+-----------+ +------------+ | SQL |
+-----+ | | socket:1701 | | socket:SQL | +---+
| CPE +-------+ BNG +<------------->+ RADIUS |<------------>+ radreply | |
+-----+ | |<--------+ | | +----------+ +---+
+-----------+ | +------------+ | radcheck | |
^ | +----------+ |
| socket:2001 +------------+ socket:3799 | (...) |
| | +----------+
+-----*-----+ +------*-----+
| | | |
| accel-cmd | | radclient |
| | | |
+-----------+ +------------+
```
Quan un CPE correctament configurat envia al BNG una sol·licitud de connexió, aquest intercanvia els següents missatges amb el servidor RADIUS:
```
[BNG] => [RADIUS] Access-Request id=1 <User-Name "<access_id>@exo.cat"> <Framed-Protocol PPP> <···>
[BNG] <= [RADIUS] Access-Accept id=1 <Framed-Protocol PPP> <Framed-IP-Address 45.150.184.2> <Delegated-IPv6-Prefix 2a0f:de00:fe00:200::/56> <NAS-Port-Id "<access_id>"> <···>
```
Vegeu més detalls en aquest [document](https://farga.exo.cat/exo/projectes/src/branch/master/2024-1-bitstreams/access-services-bitstreams.md#definici%C3%B3-de-serveis-finals-i-portadors).
FreeRADIUS consulta en primer lloc la taula _radcheck_ per verificar que el password transferit pel CPE (MS-CHAP/CHAP) és correcte. En el mateix moment, envia al NAS (BNG) els atributs necessaris:
```
attribute = Framed-IP-Address
attribute = Delegated-IPv6-Prefix
attribute = NAS-Port-Id
```
Aquests valors són a les taules _radreply_ segons consultes creuades a d'altres taules (_radgroupreply_, _radusergroup_). Hem de tenir en compte que aquestes taules registren els circuits de provisió no de les persones subscrites.
# Requeriments de SIMPLEX
Es plantega la implementació d'un programri que permeti integrar les actuals funcions de gestió de circuits de provisionament (connexions PPP) amb funciones extra orientades a gestionar els perfils de persones afiliades a l'associació. Es planteja doncs:
* Afegir un registre de dades personals de persones afiliades
* Afegir un registre de serveis (p.ex: Basic Radio, Sarenet Competitive, EXtra IPv4, etc.)
* Les funcions fonamentals que caldrà implementar són:
- Afegir/eliminar/modificar nova persona afiliada, afegir/eliminar nou servei
- Afegir/eliminar/modificar circuit de provisionament: credencials, IPv4/IPv6
- Obtenir llistes d'afiliacions i d'alres dades relacionades amb el servei subscrit
- Obtenir dades sobre l'estat de les connexios (BNG)
- Enviar missatges de control de la connexió (DAE server)
- Autenticar, autoritzar i gestionar els comptes dels administradors dels serveis
La solució ha de permetre una alta integració dels diferents agents, és a dir, les aplicacions que puguin dur a terme totes o un group de les funcions esmentades i els elements existents (BNG, RADIUS, SQL). També ha de permtre una gran modularitat i distribució en xarxa.
# Proposta de disseny
Atés que tots els elements existents basen el seu funcionament amb crides de socket (xarxa) i es requereix una alta integració, proposem el desenvolupament de:rest api authentication ssh key
* Una REST API que implementi les crides accessibles pels agents (aplicacions)
* Un agent basat en text orientat a administradors avançats i que permeti iteracions de desenvolupament assumibles (relativament curtes)
* Un agent basat en web orientat a adminitradors básics i/o avançats
El següent esquema descriu l'arquitectura general de la solució SIMPLEX:
```
Arquitectura general de SIMPLEX
+-----------+ +------------+ +----------+
+-----+ | | socket:1701 | | socket:SQL | SQL +---+
| CPE +-------+ BNG +<------------->+ RADIUS |<------------>+ | |
+-----+ | +<--------+ | | +----->| radreply | +---+
+-----------+ | +------------+ | +----------+ | |
^ | | | radcheck | |
| | | +----------+ |
| socket:2001 +------+ socket:3799 | | (...) |
| | | socket:SQL +----------+
| | |
+-----*----------------------*-------------------*-------------------------+
| SAPI |
+--------------------------------------------------------------------------+
^
|
| GET/POST/DELETE URI
|
+----*----+
| |
| Agent-X |
| |
+---------+
```
## Especificacions de les estructures de dades
L'intercanvi de missatges HTTP s'especifica amb un _media type_ tipus JSON. Aquest format és genèric i cal
definir el format del contingut d'aquest tipus de missatges. L'API inclou una sèrie de controladors que gestionen les estructures de dades en format JSON.
### Carrier
La declaració de variables de l'endpoint _Carrier_ és:
```
PATH = /carrier/<CarrierId::Integer>
MEDIA_TYPE = application/json
DATA_STRUCT = {
"id": <CarrierId::Integer>,
"name": <CarrierName:String>,
"data": <OptionalCarrierData::Json>,
"structure": <SpxDataScheme::TRBEx>
```
En aquest cas, el camp `structure` defineix les dades personalitzades del servei portador que presta el carrier.
### Transport
La declaració de variables de l'endpoint _Transport_ és:
```
PATH = /transport/<TransportId::Integer>
MEDIA_TYPE = application/json
DATA_STRUCT = {
"id": <TransportId::Integer>,
"data": <SpxDataScheme::TRBEx>,
"carrierId": <CarrierId::Integer>
}
```
### Estructures de dades de serveis portadors
Les següents definicions es poden aplicar a les estructures de dades vinculades als serveis portadors:
```
>> Simplex Data Scheme: TRBE1
{
"sref": "TRBE1",
"name": "NEBA",
"location": "",
"s_vlan": {"sid": "Service VLAN", "vid": 3864, "pcp": 0},
"c_vlan": {"sid": "Customer VLAN", "vid": -1, "pcp": 0},
"r_vlan": {"sid": "R/S VLAN", "vid": 24, "pcp": 3},
"endpointDev": "%Echolife EG8010H%",
"snAuth": "",
"passAuth": ""
}
>> Simplex Data Scheme: TRBE2:
{
"sref": "TRBE2",
"name": "Orange",
"location": "",
"s_vlan": {"sid": "Service VLAN", "vid": 3864, "pcp": 0},
"c_vlan": {"sid": "Customer VLAN", "vid": -1, "pcp": 0},
"r_vlan": {"sid": "R/S VLAN", "vid": 23, "pcp": 0},
"endpointDev": "%Mikrotik hAPac2%",
"eoipRemAddress": "%10.254.254.254%",
"eoipTunId": -1
}
```