Difference between revisions of "Eduroam Configuration"
| Line 1: | Line 1: | ||
| − | ''' | + | '''freeRADIUS basic configuration for eduroam''' |
| − | + | Make sure you have a fresh Ubuntu 18.04 server ready. Update system before starting the config process. | |
| − | + | Note: This configuration guide is based upon https://wiki.freeradius.org/guide/eduroam | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | == | + | == Configuration == |
| − | + | Add a test user to the freeradius authorize. We create bob@uni<YOURID>.edu.np user with a password "hello" for the lab test. Be sure to remove this user before moving to production. | |
| − | |||
| − | + | === Users === | |
File: /etc/freeradius/3.0/users (/etc/freeradius/3.0/mods-config/files/authorize) | File: /etc/freeradius/3.0/users (/etc/freeradius/3.0/mods-config/files/authorize) | ||
| Line 25: | Line 14: | ||
"bob@uni0.edu.np" Cleartext-Password := "hello" | "bob@uni0.edu.np" Cleartext-Password := "hello" | ||
Reply-Message := "Hello, %{User-Name}" | Reply-Message := "Hello, %{User-Name}" | ||
| − | |||
Reload freeradius | Reload freeradius | ||
| − | |||
# systemctl restart freeradius | # systemctl restart freeradius | ||
| − | |||
Testing | Testing | ||
| + | # radtest bob@uni0.edu.np hello localhost 7 testing123 | ||
| − | + | Try several times, with incorrect password as well. Make sure you understand each of the parameters clearly. | |
| + | === Clients (NAS) === | ||
| + | File: /etc/freeradius/3.0/clients.conf | ||
| − | |||
## clients.conf -- client configuration directives | ## clients.conf -- client configuration directives | ||
####################################################################### | ####################################################################### | ||
| Line 62: | Line 50: | ||
} | } | ||
| − | File: sites-available/eduroam -- radius configuration | + | File: /etc/freeradius/3.0/sites-available/eduroam -- radius configuration |
## sites-available/eduroam -- radius configuration | ## sites-available/eduroam -- radius configuration | ||
####################################################################### | ####################################################################### | ||
| + | The domain users will add to their username to have their credentials | ||
| + | # routed to your institution. You will also need to register this | ||
| + | # and your RADIUS server addresses with your NRO. | ||
| + | operator_name = "uni0.edu.np" | ||
| + | |||
| + | # The VLAN to assign eduroam visitors | ||
| + | eduroam_guest_vlan = "1" | ||
| + | |||
| + | # The VLAN to assign your students/staff | ||
| + | eduroam_local_vlan = "1" | ||
| + | |||
server eduroam { | server eduroam { | ||
listen { | listen { | ||
| − | type = | + | type = auth |
ipaddr = * | ipaddr = * | ||
| − | port = | + | port = 1812 |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| + | |||
authorize { | authorize { | ||
| − | # | + | # Log requests before we change them |
| − | + | linelog_recv_request | |
| − | if ( | + | |
| − | update | + | # split_username_nai is a policy in the default distribution to |
| − | + | # split a username into username and domain. We reject user-name | |
| − | + | # strings without domains, as they're not routable. | |
| + | split_username_nai | ||
| + | if (noop || !&Stripped-User-Domain) { | ||
| + | reject | ||
| + | } | ||
| + | |||
| + | # Send the request to the NRO for your region. | ||
| + | # The details of the FLRs (Federation Level RADIUS servers) | ||
| + | # are in proxy.conf. | ||
| + | # You can make this condition as complex as you like, to | ||
| + | # include additional subdomains just concatenate the conditions | ||
| + | # with &&. | ||
| + | if (&Stripped-User-Domain != "${operator_name}") { | ||
| + | update { | ||
| + | control:Load-Balance-Key := &Calling-Station-ID | ||
| + | control:Proxy-To-Realm := 'eduroam_flr' | ||
| + | |||
| + | # Operator name (RFC 5580) identifies the network the | ||
| + | # request originated from. It's not absolutely necessary | ||
| + | # but it helps with debugging. | ||
| + | request:Operator-Name := "1${operator_name}" | ||
} | } | ||
| + | return | ||
| + | } | ||
| + | |||
| + | # If the EAP module returns 'ok' or 'updated', it means it has handled | ||
| + | # the request and we don't need to call any other modules in this | ||
| + | # section. | ||
| + | eap { | ||
| + | ok = return | ||
| + | updated = return | ||
} | } | ||
| − | + | } | |
| − | + | ||
| − | + | pre-proxy { | |
| − | + | attr_filter.pre-proxy | |
| + | linelog_send_proxy_request | ||
| + | } | ||
| + | |||
| + | post-proxy { | ||
| + | attr_filter.post-proxy | ||
| + | linelog_recv_proxy_response | ||
| + | } | ||
| + | |||
| + | authenticate { | ||
eap | eap | ||
| − | |||
| − | |||
| − | |||
} | } | ||
| − | + | ||
| − | + | post-auth { | |
| − | + | # To implement eduroam you must: | |
| + | # - Use wireless access points or a controller which supports | ||
| + | # dynamic VLAN assignments. | ||
| + | # - Have that feature enabled. | ||
| + | # - Have the guest_vlan/local_vlan available to the controller, | ||
| + | # or to all your access points. | ||
| + | # eduroam user traffic *MUST* be segregated, this is *NOT* optional. | ||
| + | update reply { | ||
| + | Tunnel-Type := VLAN | ||
| + | Tunnel-Medium-Type := IEEE-802 | ||
| + | } | ||
| + | if (&control:Proxy-To-Realm) { | ||
| + | update reply { | ||
| + | Tunnel-Private-Group-ID := ${eduroam_guest_vlan} | ||
| + | } | ||
} | } | ||
| − | + | else { | |
| − | + | update reply { | |
| + | Tunnel-Private-Group-ID := ${eduroam_local_vlan} | ||
| + | } | ||
} | } | ||
| − | + | ||
| − | + | # We're sending a response to one of OUR network devices for one of | |
| + | # OUR users so provide it with the real user-identity. | ||
| + | if (&session-state:Stripped-User-Name) { | ||
| + | update reply { | ||
| + | User-Name := "%{session-state:Stripped-User-Name}@%{Stripped-User-Domain}" | ||
| + | } | ||
} | } | ||
| − | + | ||
| − | + | linelog_send_accept | |
| − | + | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Post-Auth-Type REJECT { | Post-Auth-Type REJECT { | ||
| − | + | attr_filter.access_reject | |
| + | linelog_send_reject | ||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
} | } | ||
Revision as of 12:26, 1 January 2019
freeRADIUS basic configuration for eduroam
Make sure you have a fresh Ubuntu 18.04 server ready. Update system before starting the config process.
Note: This configuration guide is based upon https://wiki.freeradius.org/guide/eduroam
Configuration
Add a test user to the freeradius authorize. We create bob@uni<YOURID>.edu.np user with a password "hello" for the lab test. Be sure to remove this user before moving to production.
Users
File: /etc/freeradius/3.0/users (/etc/freeradius/3.0/mods-config/files/authorize)
## Users - user logins
#######################################################################
"bob@uni0.edu.np" Cleartext-Password := "hello"
Reply-Message := "Hello, %{User-Name}"
Reload freeradius
# systemctl restart freeradius
Testing
# radtest bob@uni0.edu.np hello localhost 7 testing123
Try several times, with incorrect password as well. Make sure you understand each of the parameters clearly.
Clients (NAS)
File: /etc/freeradius/3.0/clients.conf
## clients.conf -- client configuration directives
#######################################################################
client localhost {
ipaddr = 127.0.0.1
secret = testing123
nas_type = other # localhost isn't usually a NAS...
}
client testing {
ipaddr = 45.64.162.158
secret = testing123
nas_type = other
}
client nepal-flr-1 {
ipaddr = 202.52.0.18
netmask = 32
secret = longSecretPasswordHere
require_message_authenticator = no
shortname = nepal-flr-1
nastype = other
virtual_server = eduroam
}
File: /etc/freeradius/3.0/sites-available/eduroam -- radius configuration
## sites-available/eduroam -- radius configuration
#######################################################################
The domain users will add to their username to have their credentials
# routed to your institution. You will also need to register this
# and your RADIUS server addresses with your NRO.
operator_name = "uni0.edu.np"
# The VLAN to assign eduroam visitors
eduroam_guest_vlan = "1"
# The VLAN to assign your students/staff
eduroam_local_vlan = "1"
server eduroam {
listen {
type = auth
ipaddr = *
port = 1812
}
authorize {
# Log requests before we change them
linelog_recv_request
# split_username_nai is a policy in the default distribution to
# split a username into username and domain. We reject user-name
# strings without domains, as they're not routable.
split_username_nai
if (noop || !&Stripped-User-Domain) {
reject
}
# Send the request to the NRO for your region.
# The details of the FLRs (Federation Level RADIUS servers)
# are in proxy.conf.
# You can make this condition as complex as you like, to
# include additional subdomains just concatenate the conditions
# with &&.
if (&Stripped-User-Domain != "${operator_name}") {
update {
control:Load-Balance-Key := &Calling-Station-ID
control:Proxy-To-Realm := 'eduroam_flr'
# Operator name (RFC 5580) identifies the network the
# request originated from. It's not absolutely necessary
# but it helps with debugging.
request:Operator-Name := "1${operator_name}"
}
return
}
# If the EAP module returns 'ok' or 'updated', it means it has handled
# the request and we don't need to call any other modules in this
# section.
eap {
ok = return
updated = return
}
}
pre-proxy {
attr_filter.pre-proxy
linelog_send_proxy_request
}
post-proxy {
attr_filter.post-proxy
linelog_recv_proxy_response
}
authenticate {
eap
}
post-auth {
# To implement eduroam you must:
# - Use wireless access points or a controller which supports
# dynamic VLAN assignments.
# - Have that feature enabled.
# - Have the guest_vlan/local_vlan available to the controller,
# or to all your access points.
# eduroam user traffic *MUST* be segregated, this is *NOT* optional.
update reply {
Tunnel-Type := VLAN
Tunnel-Medium-Type := IEEE-802
}
if (&control:Proxy-To-Realm) {
update reply {
Tunnel-Private-Group-ID := ${eduroam_guest_vlan}
}
}
else {
update reply {
Tunnel-Private-Group-ID := ${eduroam_local_vlan}
}
}
# We're sending a response to one of OUR network devices for one of
# OUR users so provide it with the real user-identity.
if (&session-state:Stripped-User-Name) {
update reply {
User-Name := "%{session-state:Stripped-User-Name}@%{Stripped-User-Domain}"
}
}
linelog_send_accept
Post-Auth-Type REJECT {
attr_filter.access_reject
linelog_send_reject
}
}
}
File: sites-available/eduroam-inner-tunnel
## sites-available/eduroam-inner-tunnel -- radius configuration
#######################################################################
server eduroam-inner-tunnel {
authorize {
auth_log
eap
mschap
#sql
files
}
authenticate {
eap
mschap
Auth-Type MS-CHAP {
mschap
}
}
post-auth {
reply_log
}
}
File: proxy.conf
## proxy.conf
#######################################################################
proxy server {
default_fallback = no
}
home_server npflr1 {
type = auth+acct
ipaddr = 202.52.0.18
port = 1812
secret = longSecretPasswordHere
status_check = status-server
}
home_server npflr2 {
type = auth+acct
ipaddr = 202.52.0.4
port = 1812
secret = longSecretPasswordHere
status_check = status-server
}
home_server_pool EDUROAM {
type = fail-over
home_server = npflr1
home_server = npflr2
}
realm NULL {
nostrip
}
realm "^uni0\.edu\.np" {
nostrip
}
realm "~.+$" {
pool = EDUROAM
nostrip
}
File: mods-available/eap.conf
## mods-available/eap.conf -- Configuration for EAP types (PEAP, TTLS, etc.)
#######################################################################
eap {
default_eap_type = peap
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
max_sessions = ${max_requests}
tls {
certdir = ${confdir}/certs
cadir = ${confdir}/certs
private_key_password = whatever
private_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
certificate_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
ca_file = /etc/ssl/certs/ca-certificates.crt
dh_file = ${certdir}/dh
random_file = /dev/urandom
fragment_size = 1024
include_length = yes
check_crl = no
cipher_list = "DEFAULT"
}
ttls {
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
virtual_server = "eduroam-inner-tunnel"
}
peap {
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
virtual_server = "eduroam-inner-tunnel"
}
mschapv2 {
}
}