Radius

💡
Toutes les configurations sont commit sur mon github : https://github.com/Nathan0510/Blog

Configuration Proxmox / EVE-NG

Mon serveur chez OVH commence à devenir limité. J'ai donc opté pour un mini pc MinisForum que j'ai posé chez moi. L'interconnexion se fait entre une VM debian (virtualisé dans un proxmox), qui me sert de routeur, et mon serveur, le tout avec un wireguard. Je route ensuite le trafic que j'ai envie dans le tunnel.

Derrière le routeur, j'ai mon VLAN où je vais mettre mes VMs qui vont me servir dans le cadre de ce blog.

EVE-NG fonctionne avec des interfaces PNET. De base, y'en a 10. Une est utilisée pour l'IP publique et une autre pour l'interco entre le serveur physique et le lab. J'ai utilisé l'interface PNET9.

Ensuite, il faut raccorder le réseau sur un leaf et propager le VLAN dans la fabric !

LNS1#sh run int Po10.3999
interface Port-channel10.3999
 description *** INTERCO PROXMOX ***
 encapsulation dot1Q 3999
 ip address 100.100.100.10 255.255.255.0
end

LNS1#sh run | i 100.100.101
ip route 100.100.101.0 255.255.255.0 Port-channel10.3999 100.100.100.1

Subnet de management du backbone : 100.100.100.0/24.
Subnet des serveurs derrière le routeur debian : 100.100.101.0/24

Configuration LNS

On efface tous ce qu'on a fait dans l'épisode collecte L2 en PPP sur les LNS !

Pour commencer, on définit l'IP du radius et le mot de passe :

LNS1#sh run | s radius
radius server radius
 address ipv4 100.100.101.1 auth-port 1812 acct-port 1813
 key naruto 

Je vous avez aussi parlé du triple AAA. Hé bah le voici :

LNS1#sh run | s aaa
aaa group server radius radius-naruto
 server name radius
aaa authentication ppp default group radius-naruto
aaa authorization network default group radius-naruto local
aaa accounting network default start-stop group radius-naruto

Il faut aussi configurer les IP des loopback pour le unnumbered sur l'interface Virtual-Template. Bien sûr, les IPs doivent être différentes sur les deux différents LNS 😄. Je suis parti avec les IPs des Looback me servant au MPLS. Je ne pense pas qu'il s'agisse de la "best pratice" donc à voir !

LNS1#sh run int virtual-template 1
interface Virtual-Template1
 mtu 1492
 ip unnumbered Loopback1
 no peer default ip address
 ppp authentication chap callin
end

Au final, c'est même plus simple de configurer avec un radius plutôt qu'en local.

Installation de Freeradius

Il existe plusieurs outils pour un radius. J'ai décidé de partir sur le plus connu : Feeradius. Il peut gérer aussi bien le PPP que le DHCP.

Allez, on l'installe sur une petite debian :

root@radius:~# cat /etc/debian_version
12.6

root@radius:~# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Le paquet s'appelle...... freeradius !

root@radius:~# apt install freeradius

root@radius:~# systemctl status freeradius
● freeradius.service - FreeRADIUS multi-protocol policy server
     Loaded: loaded (/lib/systemd/system/freeradius.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-07-26 22:25:31 CEST; 1 week 0 days ago

Les fichiers de configurations sont présents dans /etc/freeradius :

root@radius:/etc/freeradius# tree
.
└── 3.0
    ├── certs
    ├── clients.conf
    ├── dictionary
    ├── experimental.conf
    ├── hints -> mods-config/preprocess/hints
    ├── huntgroups -> mods-config/preprocess/huntgroups
    ├── mods-available
    ├── mods-config
    │   ├── attr_filter
    │   │   ├── access_challenge
    │   │   ├── access_reject
    │   │   ├── accounting_response
    │   │   ├── coa
    │   │   ├── post-proxy
    │   │   └── pre-proxy
    │   ├── files
    │   │   ├── accounting
    │   │   ├── authorize
    │   │   ├── dhcp
    │   │   └── pre-proxy
    │   ├── perl
    │   │   └── example.pl
    │   ├── preprocess
    │   │   ├── hints
    │   │   └── huntgroups
    │   ├── python3
    │   │   ├── example.py
    │   │   └── radiusd.py
    │   ├── README.rst
    │   ├── realm
    │   │   └── freeradius-naptr-to-home-server.sh
    │   ├── sql
    │   │   ├── counter
    │   │   │   ├── mysql
    │   │   │   ├── postgresql
    │   │   │   └── sqlite
    ├── mods-enabled
    │   ├── always -> ../mods-available/always
    │   ├── attr_filter -> ../mods-available/attr_filter
    │   ├── chap -> ../mods-available/chap
    │   ├── detail -> ../mods-available/detail
    │   ├── detail.log -> ../mods-available/detail.log
    │   ├── digest -> ../mods-available/digest
    │   ├── dynamic_clients -> ../mods-available/dynamic_clients
    │   ├── eap -> ../mods-available/eap
    │   ├── echo -> ../mods-available/echo
    │   ├── exec -> ../mods-available/exec
    │   ├── expiration -> ../mods-available/expiration
    │   ├── expr -> ../mods-available/expr
    │   ├── files -> ../mods-available/files
    │   ├── linelog -> ../mods-available/linelog
    │   ├── logintime -> ../mods-available/logintime
    │   ├── mschap -> ../mods-available/mschap
    │   ├── ntlm_auth -> ../mods-available/ntlm_auth
    │   ├── pap -> ../mods-available/pap
    │   ├── passwd -> ../mods-available/passwd
    │   ├── preprocess -> ../mods-available/preprocess
    │   ├── radutmp -> ../mods-available/radutmp
    │   ├── realm -> ../mods-available/realm
    │   ├── replicate -> ../mods-available/replicate
    │   ├── soh -> ../mods-available/soh
    │   ├── sradutmp -> ../mods-available/sradutmp
    │   ├── unix -> ../mods-available/unix
    │   ├── unpack -> ../mods-available/unpack
    │   └── utf8 -> ../mods-available/utf8
    ├── panic.gdb
    ├── policy.d
    ├── proxy.conf
    ├── radiusd.conf
    ├── README.rst
    ├── sites-available
    ├── sites-enabled
    │   ├── default -> ../sites-available/default
    │   └── inner-tunnel -> ../sites-available/inner-tunnel
    ├── templates.conf
    ├── trigger.conf
    └── users -> mods-config/files/authorize

59 directories, 281 files

Je ne sais pas si vous avez vu mais il existe un module SQL ! En effet, on peut installer une base de données et gérer nos clients avec. Pour l'instant, je suis parti sur une autre méthode : le fichier user ! Peut être que je ferai la migration après.

Bon et maintenant ? Il faut bien "lier" le radius aux LNS !

Et ca se trouve dans le fichier clients.conf

root@radius:/etc/freeradius/3.0# cat clients.conf
client localhost {
        ipaddr = 127.0.0.1
        proto = *
        secret = testing123
        nas_type         = other        # localhost isn't usually a NAS...
        limit {
                max_connections = 16
                lifetime = 0
                idle_timeout = 30
        }
}

client LNS1 {
        ipaddr          = 100.100.100.10
        secret          = naruto
        shortname       = LNS1
        nastype         = cisco
}

client LNS2 {
        ipaddr          = 100.100.100.11
        secret          = naruto
        shortname       = LNS2
        nastype         = cisco
}

On renseigne les deux LNS avec leur IP et le mot de passe qu'on avait défini dans la configuration du radius sur les cisco.

Et comme je vous l'avait dit, je configure les utilisateurs dans le fichier users :

root@radius:/etc/freeradius/3.0# cat users
nathan@naruto.ninja Cleartext-Password := "nathan"
    Service-Type := Framed-User,
    Framed-Protocol := PPP,
    Framed-MTU := 1492,
    Framed-IP-Address := 109.205.64.50,
    Framed-IP-Netmask := 255.255.255.255


sasuke@naruto.ninja Cleartext-Password := "sasuke"
    Service-Type := Framed-User,
    Framed-Protocol := PPP,
    Framed-MTU := 1492,
    Framed-IP-Address := 109.205.64.51,
    Framed-IP-Netmask := 255.255.255.255

Les différents attributs sont définis dans la RFC 3580 (https://www.freeradius.org/rfc/rfc3580.html). Pour l'instant, je ne souhaite que donner une IP à un client donc j'utilise uniquement le Framed-IP-Address, Framed-IP-Netmask, Framed-MTU et Framed-Protocol. Ils seront toujours utilisés !

Je sais pas si vous vous en souvenez mais dans l'épisode de la configuration de la collecte L2 en PPP, les users n'avaient pas de @XXX.XXX. Alors pourquoi en avoir mis ?

Tout ce qui se trouve après le @ est défini comme un REALM. Ce realm va varier en fonction des opérateurs et SURTOUT, si c'est une collecte L2TP.

Dans une collecte L2TP, le BAS de l'opérateur tiers va s'appuyer sur ce realm pour monter le tunnel.

Dans notre cas, pourquoi en avoir mis un vu que c'est une collecte L2 ? Car on va s'amuser après ! On peut faire un proxy radius basé sur le realm 😄 Ca peut être marrant à tester.

Dans un prochain épisode, on verra comment configurer un lien dans un L3VPN MPLS ! Et aussi le principe de secours avec les Framed-Route !

CPE Mikrotik

Rien ne change mis à part le login dans la configuration du PPP. Le CPE récupère bien une IP, sa route par défaut et arrive à taper Internet. D'ailleurs dans le traceroute, le premier saut est 100.127.0.1, soit l'IP de notre LNS. Vu que l'IP du ppp est un /32, on ne peut pas définir de next-hop ! Donc dans la requête PPP, le LNS va donner l'IP de son interface Virtual-template, ici 100.127.0.1 ! Le premier saut se fera donc avec cette IP.

[admin@Sasuke] /interface/pppoe-client> export
/interface pppoe-client
add add-default-route=yes disabled=no interface=ether1 name=test \
    service-name=Internet user=sasuke@naruto.ninja

[admin@Sasuke] /ip/address> print
Flags: D - DYNAMIC
Columns: ADDRESS, NETWORK, INTERFACE
#   ADDRESS           NETWORK          INTERFACE
1 D 109.205.64.51/32  109.205.66.127   test

[admin@Sasuke] /ip/route> print
Flags: D - DYNAMIC; A - ACTIVE; c, v, y - COPY
Columns: DST-ADDRESS, GATEWAY, DISTANCE
    DST-ADDRESS         GATEWAY    DISTANCE
DAv 0.0.0.0/0           test              1
DAc 100.127.0.1/32   test              0

[admin@Sasuke] > /tool/traceroute 1.1.1.1
Columns: ADDRESS, LOSS, SENT, LAST, AVG, BEST, WORST, STD-DEV
#  ADDRESS         LOSS  SENT  LAST    AVG   BEST  WORST  STD-DEV
1  100.127.0.1  0%       1  6.4ms   6.4   6.4   6.4          0
2  100.65.0.6      0%       1  23ms    23    23    23           0
3  1.1.1.1         0%       1  23.3ms  23.3  23.3  23.3         0

On fait la même chose pour le deuxième client :

[admin@Naruto] /interface/pppoe-client> export
/interface pppoe-client
add add-default-route=yes disabled=no interface=ether1 name=test \
    service-name=internet user=nathan@naruto.ninja

[admin@Naruto] /ip/address> print
Flags: D - DYNAMIC
Columns: ADDRESS, NETWORK, INTERFACE
#   ADDRESS           NETWORK          INTERFACE
1 D 109.205.64.50/32  109.205.66.127   test

[admin@Naruto] /ip/route> print
Flags: D - DYNAMIC; A - ACTIVE; c, v, y - COPY
Columns: DST-ADDRESS, GATEWAY, DISTANCE
    DST-ADDRESS         GATEWAY    DISTANCE
DAv 0.0.0.0/0           test              1
DAc 100.127.0.1/32   test              0

LNS

Et côté LNS, ca donne quoi ?

LNS1#sh ip route
B*    0.0.0.0/0 [20/0] via 100.65.0.6, 00:15:19
      100.0.0.0/8 is variably subnetted, 9 subnets, 3 masks
C        100.64.0.0/29 is directly connected, Port-channel10.10
L        100.64.0.1/32 is directly connected, Port-channel10.10
C        100.65.0.0/29 is directly connected, Port-channel10.11
L        100.65.0.1/32 is directly connected, Port-channel10.11
C        100.100.100.0/24 is directly connected, Port-channel10.3999
L        100.100.100.10/32 is directly connected, Port-channel10.3999
S        100.100.101.0/24 [1/0] via 100.100.100.1, Port-channel10.3999
C        100.127.0.1/32 is directly connected, Loopback1
i L2     100.127.0.2/32 [115/20] via 100.64.0.2, 00:02:28, Port-channel10.10
      109.0.0.0/32 is subnetted, 5 subnets
C        109.205.64.50 is directly connected, Virtual-Access2.2
C        109.205.64.51 is directly connected, Virtual-Access2.1
C        109.205.66.127 is directly connected, Loopback55
B        109.205.66.128 [200/0] via 100.127.0.2, 00:15:07

 
LNS1#ping 109.205.64.50
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 109.205.64.50, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 5/6/8 ms

LNS1#ping 109.205.64.51
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 109.205.64.51, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/5/6 ms

On arrive bien à ping les CPE. Et si vous remarquez, les routes sont apprises en connected ! Et si, c'était la même chose pour les framed-routes ca serait pas mal, vous ne pensez pas ? 😏😏

Wireshark

Les premiers échanges se font toujours (PADI, etc). Cependant, ce n'est plus le LNS qui donne la configuration du client mais le Radius. Deux types d'échanges : Access et Accouting !

Le premier un Acces-Request :

On y retrouve le nom d'utilisateur et le mot de passe CHAP. D'autres attributs peuvent s'y trouver mais pour l'instant, on s'en fiche un peu ! On va pas se compliquer la vie 😄

Le deuxième est un Acces-Accept :

Deux trucs importants ! Tout d'abord, il valide l'authentification ! Bah oui, ca peut paraître bête, mais si l'user et le mot de passe ne matche pas, alors il ne renvoie pas ce message 😋. Ensuite, il délivre les attributs pour le client (autorisation). On retrouve tous les attributs qu'on avait renseigné dans le fichier users, à savoir la MTU, le protocole, l'IP et le masque !

Mais du coup, le Accouting il est où ?

Le AAA ! Authentication Authorization Accounting

On a authentifié (couple login/mot de passe), on a autorisé (IP délivrée par le radius). Il faut donc bien faire l'accouting !

Dans les échanges accouting, le Radius va pouvoir voir si le client est toujours en vie, combien de données il consomme.

Imaginez avec un beau SI, en un clic, voir la consommation d'un client, s'il est en vie (Je comprends que maintenant ton taf Jean-Eudes 😋)

Conclusion

On vient de mettre en place la première vraie collecte dans le backbone ! On peut résumer ce qu'on vient de faire avec le schéma juste en dessous :

Le couple PPP/Radius est très simple à mettre en oeuvre mais se pose une grande question qui divise beaucoup de monde...

Qui s'en occupe ? Le réseau ou le système ?

Hé bah, c'est le réseau ! De toute façon, dans un monde où réseau, système, virtualisation tend à fusionner, je ne vois pas de problème.

Je termine sur un petit mot de fin : Recherche tome 71 naruto collector edition fnac SVPPPP