Aceasta este o continuare a întrebării mele anterioare în trimiterea rutelor statice de la implementarea serverului DHCP Freeradius în combinație cu serverul Strongswan VPN.
Când depanez Freeradius folosind tcpdump și Wireshark, am aflat că pot trimite rute statice fără clasă de pe serverul DHCP Freeradius prin adăugarea DHCP-Classless-Static-Route
și DHCP-Site-specific-25
(aka Microsoft static route) opțiuni la mine DHCP-Descoperire
și Solicitare DHCP
secțiuni ale fișierului de configurare a serverului dhcp.
Cu toate acestea: Se pare că rutele statice nu sunt acceptate de clientul Microsoft VPN dacă setez gateway-ul implicit să fie 0.0.0.0
după cum sugerează Documentație Strongswan.
Cel puțin nu pot găsi rutele anunțate pe clientul meu Windows când folosesc imprimare traseu -4
.
De asemenea, nu pot adăuga rutele manual pe clientul Windows când folosesc 0.0.0.0
ca gateway standard prin interfața VPN.
In orice caz:
Să spunem că vreau să accesez subrețeaua 192.168.200.0/24
prin VPN și serverul meu VPN atribuie adresa 192.168.201.2/24
către clientul meu Windows. Apoi, este de fapt posibil să creați o rută statică pe partea clientului Windows declarând că subrețeaua 192.168.200.0/24 este accesibilă prin 192.168.201.2 folosind comanda Windows:
traseu adauga 192.168.200.0 masca 255.255.255.0 192.168.201.2
Știu că pare puțin ciudat, dar pot da ping oricărei gazde de pe 192.168.200.0
subrețea, așa că atâta timp cât funcționează sunt fericit. :-)
Dar: m-aș bucura mai mult dacă aș putea face același lucru făcând publicitate rutelor de pe serverul meu VPN, în loc să o fac manual pe toți clienții VPN. :-)
Asta înseamnă că trebuie să fac un pic de programare dinamică la configurația DHCP în Freeradius. În cazul meu, înseamnă că trebuie să fac o referire la un modul perl în DHCP-Discover și DHCP-request care preia adresa IP vpn client alocată, o convertesc în octeți și o combin cu rutele statice care sunt, de asemenea, date ca octeți.
Un exemplu:
Subrețeaua 192.168.200.0/24
va fi codificat ca 0x18c0a8c8
ca masca de subrețea este mai întâi codificată.
Clientul 192.168.201.2/24
va fi codificat ca 0xc0a8c902
deoarece doar convertește fiecare număr din adresa IP în hex.
Codificarea finală pentru traseu va fi: 0x18c0a8c8c0a8c902
întrucât este doar o concatinare a celor două șiruri.
Apoi trebuie să folosesc actualizați răspunsul
cu urmatorul cod:
actualizare răspuns {
&DHCP-Classless-Static-Route = 0x18c0a8c8c0a8c902
&DHCP-Site-specific-25 = 0x18c0a8c8c0a8c902
}
Dacă există mai multe rute, atunci toate rutele vor fi concatenate într-un șir lung.
Partea dificilă:
Să presupunem că aveți configurația implicită a serverului DHCP Freeradius așa cum se găsește în freeradius/3.0/sites-available/dhcp
fişier.
Structura generală a fișierului pentru DHCP-Discover și DHCP-Request este următoarea:
dhcp DHCP-Request {
actualizare răspuns {
&DHCP-Message-Type = DHCP-Ack
}
actualizare răspuns {
# Opțiuni generale DHCP, cum ar fi GW implicit, DNS, durata de închiriere a adresei IP etc.
}
controlul actualizării {
&Pool-Name := „vpn_pool”
}
dhcp_sqlippool
Bine
}
Apoi, din câte am adunat, trebuie să îmi apelez modulul perl după dhcp_sqlippool
a fost sunat și înainte de a se întoarce Bine
, deoarece dhcp_sqlippool
este modulul care atribuie adresa IP clientului VPN.
Asta înseamnă că versiunea mea ar fi ceva de genul:
dhcp DHCP-Request {
actualizare răspuns {
&DHCP-Message-Type = DHCP-Ack
}
actualizare răspuns {
# Opțiuni generale DHCP, cum ar fi GW implicit, DNS, durata de închiriere a adresei IP etc.
}
controlul actualizării {
&Pool-Name := „vpn_pool”
}
dhcp_sqlippool
perl
# Dacă modulul perl nu a returnat nicio eroare
dacă(ok) {
actualizare răspuns {
# Perl-Route conține un șir codificat hex cu toate rutele.
&DHCP-Classless-Static-Route = Rută-Perl
&DHCP-Site-specific-25 = Perl-Route
}
}
# Nu sunteți sigur dacă acesta este necesar?
actualizare răspuns {
&DHCP-End-Options = 255
}
Bine
}
Pentru ca acesta să funcționeze, trebuie să activez perl sub freeradius/3.0/mods-enabled
folder și modificați numele fișierului în freeradius/3.0/mods-enabled/perl
să-l îndrept către modulul meu perl. Ca de exemplu:
nume fișier = ${modconfdir}/${.:instance}/dhcp/Options.pm
Dar cum fac referire la apelul către perl în mod corect?
Am crezut că trebuie să activez linia func_post_auth = post_auth
în freeradius/3.0/mods-enabled/perl
și creează un sub post_auth
secțiunea din modulul meu perl pentru a gestiona apelurile de la Freeradius, dar din câte văd în jurnalul meu, primesc următoarea eroare în Freeradius:
(8) perl: perl_embed:: module = /etc/freeradius/3.0/mods-config/perl/dhcp/Options.pm ,
func = post_auth exit status= Subrutină nedefinită &main::post_auth apelată.
...
(8) [perl] = eșec
(8) } # dhcp DHCP-Discover = eșec
Deci ce este ceea ce nu văd?