strutture:lnf:dr:calcolo:wireless:eduroam
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
strutture:lnf:dr:calcolo:wireless:eduroam [2015/11/27 18:59] – [Radius Server] pistoni@infn.it | strutture:lnf:dr:calcolo:wireless:eduroam [2018/03/07 18:17] (current) – pistoni@infn.it | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Configurazione Gateway per eduroam ====== | ||
+ | |||
+ | Ai LNF e' stata implementata la rete wireless [[http:// | ||
+ | |||
+ | La soluzione tecnica prevede l' | ||
+ | E' stata creata una macchina virtuale (SL 6.1) con 2 interfacce LAN che svolge le funzioni di Gateway tra la rete WL eduroam e la rete internet pubblica. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | In particolare il gateway svolge le funzioni di DHCP server, Router IP, Firewall/ | ||
+ | |||
+ | ===== Radius Server ===== | ||
+ | |||
+ | Questo documento fornisce una guida per l' | ||
+ | * Installare l' | ||
+ | * Posizionarsi nella directory ove sono situati i file di configurazione (ad esempio: / | ||
+ | |||
+ | |||
+ | **radiusd.conf** | ||
+ | |||
+ | * Modificare {{: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | impostare la variabile prefix (ove e' installato il s/w freeradius) | ||
+ | |||
+ | prefix = / | ||
+ | | ||
+ | definire l' | ||
+ | |||
+ | user = radiusd | ||
+ | group = radiusd | ||
+ | |||
+ | impostare opportunamente la sezione log: | ||
+ | |||
+ | log { | ||
+ | ... | ||
+ | | ||
+ | ... | ||
+ | | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | **eap.conf** | ||
+ | |||
+ | * Modificare {{: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | eap { | ||
+ | | ||
+ | | ||
+ | ... | ||
+ | tls { | ||
+ | ... | ||
+ | certdir = ${confdir}/ | ||
+ | cadir = ${confdir}/ | ||
+ | ... | ||
+ | ## | ||
+ | ## Inserire i nomi dei files rispettivamente della chiave privata e del certificato x509 (rilasciato dalla CA INFN) | ||
+ | private_key_file = ${certdir}/ | ||
+ | certificate_file = ${certdir}/ | ||
+ | ... | ||
+ | ## inserire il file contenente tutti i certificati della lista https:// | ||
+ | ## Attenzione!: | ||
+ | ## di COMODO (root CA) e UTN-USERFirst-Client-Authentication-and-Email (Intermediate CA) [Vedi file allcacert allegato] | ||
+ | CA_file = ${cadir}/ | ||
+ | ... | ||
+ | fragment_size = 1200 | ||
+ | check_cert_cn = %{User-Name} | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | ttls { | ||
+ | ... | ||
+ | ## | ||
+ | ... | ||
+ | copy_request_to_tunnel = yes | ||
+ | ... | ||
+ | use_tunneled_reply = yes | ||
+ | ... | ||
+ | virtual_server = " | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | peap { | ||
+ | ... | ||
+ | default_eap_type = mschapv2 | ||
+ | ... | ||
+ | copy_request_to_tunnel = yes | ||
+ | ... | ||
+ | use_tunneled_reply = yes | ||
+ | ... | ||
+ | virtual_server = " | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | Allegato: {{: | ||
+ | |||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | **proxy.conf** | ||
+ | |||
+ | * Modificare {{: | ||
+ | |||
+ | ===== ===== | ||
+ | home_server localhost { | ||
+ | ... | ||
+ | secret = mysecret1 | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | realm LOCAL { | ||
+ | # If we do not specify a server pool, the realm is LOCAL, and | ||
+ | # requests are not proxied to it. | ||
+ | } | ||
+ | ... | ||
+ | realm NULL { | ||
+ | authhost | ||
+ | accthost | ||
+ | nostrip | ||
+ | } | ||
+ | ... | ||
+ | realm lnf.infn.it { | ||
+ | type = radius | ||
+ | authhost | ||
+ | accthost | ||
+ | secret | ||
+ | nostrip | ||
+ | } | ||
+ | ... | ||
+ | home_server radius-garr-1 { | ||
+ | type = auth+acct | ||
+ | ipaddr | ||
+ | port = 1812 | ||
+ | secret | ||
+ | status_check | ||
+ | } | ||
+ | home_server radius-garr-2 { | ||
+ | type = auth+acct | ||
+ | ipaddr | ||
+ | port = 1812 | ||
+ | secret | ||
+ | status_check | ||
+ | } | ||
+ | home_server_pool EDUROAM { | ||
+ | type = fail-over | ||
+ | home_server | ||
+ | home_server | ||
+ | } | ||
+ | realm DEFAULT { | ||
+ | pool = EDUROAM | ||
+ | nostrip | ||
+ | } | ||
+ | ... | ||
+ | ====== ====== | ||
+ | |||
+ | **clients.conf** | ||
+ | |||
+ | * Modificare {{: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | client localhost { | ||
+ | ... | ||
+ | secret = mysecret | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | # | ||
+ | # Definizione relativa al server stesso (edugw) | ||
+ | # | ||
+ | client edugw.lnf.infn.it { | ||
+ | secret | ||
+ | shortname | ||
+ | nastype | ||
+ | } | ||
+ | # | ||
+ | # Definizione relativa al radius server di autenticazione dei LNF (radius.lnf.infn.it) | ||
+ | # a cui vengono demandate via proxy tutte le richieste di autenticazione relative al dominio lnf | ||
+ | # | ||
+ | client radius.lnf.infn.it { | ||
+ | secret | ||
+ | shortname | ||
+ | nastype | ||
+ | } | ||
+ | # | ||
+ | # Definizione (eventuale) del server di monitoring (Nagios) | ||
+ | # | ||
+ | client 193.206.84.50 { | ||
+ | secret | ||
+ | shortname | ||
+ | nastype | ||
+ | } | ||
+ | # | ||
+ | # Definizione del server proxy del GARR (DEFAULT GARR) | ||
+ | # | ||
+ | client 192.84.145.15 { | ||
+ | secret | ||
+ | shortname | ||
+ | nastype | ||
+ | } | ||
+ | # | ||
+ | # Definizione del Wireless LAN Controller WLC4400 AP Ports IP | ||
+ | # | ||
+ | client 172.16.14.18 { | ||
+ | secret | ||
+ | shortname | ||
+ | nastype | ||
+ | } | ||
+ | client 172.16.14.19 { | ||
+ | secret | ||
+ | shortname | ||
+ | nastype | ||
+ | } | ||
+ | # | ||
+ | # Elenco degli aironet dei LNF ordinati per IP Address (o N. di edificio) | ||
+ | # | ||
+ | client 172.16.1.2 { | ||
+ | secret | ||
+ | shortname | ||
+ | nastype | ||
+ | } | ||
+ | ... | ||
+ | etc | ||
+ | ... | ||
+ | | ||
+ | In alternativa alla definizione dell' | ||
+ | |||
+ | client 172.16.0.0/ | ||
+ | secret | ||
+ | shortname | ||
+ | nastype | ||
+ | } | ||
+ | | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | **modules/ | ||
+ | |||
+ | * Al fine di specializzare i log, in modo che venga scritto anche il subject del certificato dell' | ||
+ | |||
+ | |||
+ | * Creare logger-accept in modo che contenga la stringa di log per le richieste di autenticazione EAP-TLS accettate; vedi esempio: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | exec logger-accept { | ||
+ | wait = yes | ||
+ | #radiuspid = " | ||
+ | outlog = " | ||
+ | program = "/ | ||
+ | input_pairs = request | ||
+ | output_pairs = reply | ||
+ | # | ||
+ | shell_escape = yes | ||
+ | } | ||
+ | |||
+ | * Creare logger-reject in modo che contenga la stringa di log per le richieste di autenticazione EAP-TLS rifiutate; vedi esempio: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | exec logger-reject { | ||
+ | wait = yes | ||
+ | #radiuspid = " | ||
+ | outlog = " | ||
+ | program = "/ | ||
+ | input_pairs = request | ||
+ | output_pairs = reply | ||
+ | # | ||
+ | shell_escape = yes | ||
+ | } | ||
+ | |||
+ | * Nota: non sono riuscito a far scrivere il pid del processo radiusd nel log, ma non e' molto importante. | ||
+ | |||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | **sites-enabled/ | ||
+ | |||
+ | * Modificare {{: | ||
+ | |||
+ | ===== ===== | ||
+ | ... | ||
+ | authorize { | ||
+ | ... | ||
+ | eap | ||
+ | ... | ||
+ | files | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | Authenticate { | ||
+ | ... | ||
+ | eap | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | |||
+ | * e inserire i controlli sul certificato dell' | ||
+ | |||
+ | ... | ||
+ | post-auth { | ||
+ | ... | ||
+ | # | ||
+ | # Reply-Message += " | ||
+ | # Reply-Message += " | ||
+ | # Reply-Message += " | ||
+ | # Reply-Message += " | ||
+ | # Reply-Message += " | ||
+ | # | ||
+ | # Reply-Message += " | ||
+ | # Reply-Message += " | ||
+ | # Reply-Message += " | ||
+ | # Reply-Message += " | ||
+ | # Reply-Message += " | ||
+ | # } | ||
+ | if ( TLS-Client-Cert-Subject !~ /^$/ ) { | ||
+ | # accetta tutti i certificati tranne quello rilasciato dalla CA INFN (per via della policy della CA) | ||
+ | if ( TLS-Client-Cert-Issuer == "/ | ||
+ | logger-reject | ||
+ | reject | ||
+ | } | ||
+ | else { | ||
+ | logger-accept | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | **sites-enabled/ | ||
+ | |||
+ | Il server inner-tunnel viene chiamato in causa nel caso di richiesta di autenticazione passata all' | ||
+ | * Modificare {{: | ||
+ | |||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | server inner-tunnel { | ||
+ | ... | ||
+ | authorize { | ||
+ | ... | ||
+ | eap { | ||
+ | ok = return | ||
+ | } | ||
+ | ... | ||
+ | files | ||
+ | ... | ||
+ | if ( " | ||
+ | fail | ||
+ | } | ||
+ | } | ||
+ | ... | ||
+ | Authenticate { | ||
+ | ... | ||
+ | eap | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | |||
+ | * Nota: le ultime righe nella sezione // | ||
+ | |||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | **users** | ||
+ | |||
+ | * Modificare il file users secondo le esigenze di sede; puo' essere utile aggiungere un utente locale di test per la verifica della funzionalita' | ||
+ | |||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | test Auth-Type := Local, Cleartext-Password := " | ||
+ | | ||
+ | # | ||
+ | |||
+ | |||
+ | * Nota: lasciare una riga vuota sotto ogni entry del file users | ||
+ | |||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | **Start del server radius** | ||
+ | |||
+ | * Prima dello start occorre modificare la proprieta' | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | chown -R radiusd: | ||
+ | chmod -R u+rw, | ||
+ | chmod -R g-r,o-r certs/* | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Lanciare il servizio in debug mode: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | / | ||
+ | |||
+ | oppure (piu' verboso): | ||
+ | |||
+ | / | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Lanciare il servizio come daemon: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | / | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Start automatico al boot | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | chkconfig --add radiusd | ||
+ | chkconfig --level 35 radiusd on | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Eseguire un banale test di autenticazione: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | / | ||
+ | |||
+ | (verificare il file di log / | ||
+ | |||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * **Buona fortuna!** | ||
+ | |||
+ | |||
+ | ====== DHCP Server ====== | ||
+ | |||
+ | Il server edugw e' abilitato anche come DHCP server per distribuire gli indirizzi IP ai nodi wireless connessi al SSID eduroam (sulla VLAN 202). | ||
+ | Una delle due interfacce (qualla connessa alla VLAN 202) ha indirizzo 192.168.202.1/ | ||
+ | |||
+ | * Creare o modificare il file {{: | ||
+ | * Lanciare il servizio come daemon: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | / | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Start automatico al boot | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | chkconfig --add dhcpd | ||
+ | chkconfig --level 35 dhcpd on | ||
+ | |||
+ | |||
+ | ====== Router IP ====== | ||
+ | |||
+ | Il server edugw svolge le funzioni di router dei pacchetti IP dalla rete Wireless (SSID eduroam, VLAN 202, network 192.168.202.0/ | ||
+ | L' | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Per abilitare il routing (IP forwanding) occorre modificare il file / | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | # Controls IP packet forwarding | ||
+ | net.ipv4.ip_forward = 1 | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Quindi dare il seguente comando: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | sysctl -p | ||
+ | |||
+ | |||
+ | ====== Firewall/ | ||
+ | |||
+ | Il server edugw svolge la funzione di NAT server per la traslazione degli indirizzi privati dei nodi connessi in Wireless al SSID eduroam. | ||
+ | Tale funzione viene abilitata tramite comandi iptables. Lo stesso iptables e' utilizzato anche per alcune attivita' | ||
+ | (Firewall). | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Per abilitare il NAT occorre creare o modificare il file {{: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | # | ||
+ | # Source NAT to one IP | ||
+ | # | ||
+ | iptables -t nat -A POSTROUTING -j LOG --log-level info --log-prefix " NAT: " -m state --state NEW | ||
+ | iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 193.205.228.102 | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Quindi eseguire lo script: | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | / | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * Attenzione: i log generati dal comando iptables indicato sopra, non sono affatto esaustivi. In tali log infatti manca il source IP e la source PORT translati dal NAT (nel caso specifico la mancanza grave e' quella della source PORT traslata, in quanto il source IP traslato e' univocamente impostato a 193.205.228.102). In mancanza di tali informazioni, | ||
+ | - Abbiamo installato conntrack (dai conntrack-tools: | ||
+ | - Abbiamo creato lo script perl {{: | ||
+ | - inserito la seguente riga in / | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | ctrk: | ||
+ | |||
+ | ====== ====== | ||
+ | |||
+ | * In questo modo oltre ai normali log derivati da iptables, nel file / | ||
+ | * Queste info possono anche essere ridirette ad un syslog centrale (noi abbiamo syslog-ng). | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | --- // | ||
+ | |||
+ | --- // | ||
+ | |||
+ | |||
+ | |||