This is a FreeRADIUS configuration used to implement an EAP/802.1x wireless network. The following features are implemented.
##Features:
- Wireless access using EAP authentication. Wireless users log onto the wireless network using username and password. Each user will have a its own profile. This profile contains: mobile number, email, first name, last name etc.
- Each user's network traffic will be limited to monthly quota. This quota includes both uploads and downloads. Once the quota is reached, user will be disconnected from the network.
- Network quota reset every month on a given date. For example, quota resets on 3rd of every month.
- Users can be managed via user groups. This means that the same network policy can be applied to a group of users. A network policy could be like, 50 G of quota and reset on 3rd of every month.
- Restrict users to certain network access points. For example, the user group students can only have access to the NAS located in the science block.
- Send user data usage warning messages via email and SMS. Once the user reached 50%, 80% or 100% of its quota, a warning message will be sent through both email and SMS.
##Environment: This is the environment used to implement the wireless network with EAP authentication.
- Email server: mailgun.
- SMS gateway: smsgateway.me.
- NAS (dynamic ip): Mikrotik.
- Radius server (static ip): FreeRADIUS Version 3 hosted with CoreOS + Docker.
- GUI for user management: OWUMS hosted with CoreOS + Docker.
##Requirements:
- Debian baseed linux distros
- FreeRADIUS Version 2 or Version 3
- Cron
- Curl
- Perl
##Configuration:
To use this implementation a sets of configuration data needs to be correctly entered. The mysql sample configuration are at radius-configdb/owums_sample.sql. This sql schema can be use for both version 3 and 2. Email and SMS configuration are at radius-config/version.3/mods-config/perl/config_data.pm. In version 2, Email and SMS configuration are hard coded in radius-config/version.2/perl/sendwarningmail.pl.
###Radius Database:
These are the default values.
Version 3: radius-config/version.3/mods-available/sql
driver = "rlm_sql_mysql"
server = "mysql"
port = 3306
login = "radius"
password = "radpass"
radius_db = "owums_db"
Version 2: radius-config/version.2/sql.conf
database = "owums_db"
server = "mysql"
port = 3306
login = "radius"
password = "radpass"
###Wireless Users:
Table: users
An user must belong to at least one user group.
| id | crypted_password | active | given_name | surname | username | mobile_suffix | sentmail | |
|---|---|---|---|---|---|---|---|---|
| 10 | bob@mail.com | 7KU14qfW | 1 | Bob | Jones | bob | 0413129133 | 0 |
Table: radius_groups
| id | name |
|---|---|
| 5 | staff |
Table: radius_groups_users
| user_id | radius_group_id |
|---|---|
| 10 | 5 |
###Network Information:
Table: nas
| nasname | shortname | type | secret | nasidentifier |
|---|---|---|---|---|
| headoffice | headoffice | mikrotik | radius | 02-0C-42-B7-A9-5E:GRACE UPON GRACE |
nasnameis a description of the NAS.shortnameshoudl be unique to identify the NAS.typethe type of the NAS.secretradius server secret.nasidentifierthe mac-address and SSID. Note the format.
###Network policy:
Table: radius_checks
This is to set the traffic quota and reset date.
| check_attribute | op | value | radius_entity_id |
|---|---|---|---|
| Reset-Date | := | 3 | 5 |
| Total-Bytes | := | 16106127360 | 5 |
check_attributecan be eitherReset-DateorTotal-Bytes.Reset-Dateis the reset date of the month. It must be between 1-26.Total-Bytesis the total network quota in bytes (upload and download).opmust be:=.radius_entity_idis theradius_groups.idof a group. For this example, it is groupstaff.valuethis is the value of thecheck_attribute.
Table: radius_replies
This radius implementation does send Mikrotik-Total-Limit and Mikrotik-Total-Limit-Gigawordsin the reply attribute. These attributes should terminate the session when quota is reached. However Mikrotik NAS does not behave this way. I do not know why. To work around this problem, each session will be forced to reconnect after a period of time (1 hour). When an user reconnects, radius server will check the network usage and enforce the network policy.
| reply_attribute | op | value | radius_entity_id |
|---|---|---|---|
| Session-Timeout | := | 10800 | 5 |
reply_attributecan only beSession-Timeout.radius_entity_idis theradius_groups.idof a group. For this example, it is groupstaff.valuethis is the value of thereply_attribute.Session-Timeoutthis is the time limit of each session. The value is in seconds.
Table: radsitegroup
This grant user group access to NAS. In this example, user group staff have access to NAS headoffice.
| groupname | nasshortname |
|---|---|
| staff | headoffice |
groupnamemust be an existing group name inradius_groups.name.nasshortnamemust be an existing nas innas.shortnameor it can have the valueALL.ALLwill grant access to all NAS in thenastable.
###Email and SMS:
This is the email and sms configuration for version 3. This information is at radius-config/version.3/mods-config/perl/config_data.pm.
###Cron job:
##Docker
##Build Docker image
Version3:
-
Download the Dockerfile
bash$ curl -O https://raw.githubusercontent.com/zhex900/radius-config/master/version.3/Dockerfile -
Download the supervisord.conf.
bash$ curl -O https://raw.githubusercontent.com/zhex900/radius-config/master/version.3/supervisord.conf -
Build image.
docker build -t zhex900/freeradius3 .
##Automatic Build for Docker Image
-
Download the radius-config
bash$ git clone https://github.com/zhex900/radius-config.git -
Go to the Docker folder
bash$ cd radius-config/version.3/Docker -
Build image. This will take a long time.
bash$ sh make.sh
##Run the Docker image
bash$ docker run -d --name freeradius3 --link mysql-service:mysql -p 1812:1812/udp -p 1813:1813/udp zhex900/freeradius3
This image is 334.4 MB.
##Initial Setup
###Change configuration from default
To make changes to the radius database settings and config_data.pm, you will need to get into the docker container. This is how you get into the container. Once you are in, all the freeradius configuration files are in /etc/freeradius. You can make changes as needed.
bash$ docker exec -it freeradius3 bash
After you made the changes. You will need to restart the freeradius server. For this container freeradius is managed by supervisord.
bash$ supervisorctl
supervisor> restart freeradius
supervisor> exit
You can type exit to get out of the container.
To save your changes to your image.
bash$ docker commit -m "updated mysql config and config_data.pm" freeradius3 zhex900/freeradius3
###Setup database
bash$ mysql -u root -ppassword -h mysql
mysql> CREATE DATABASE owums_db;
mysql> create user 'radius'@'%' IDENTIFIED BY 'radpass';
mysql> grant ALL PRIVILEGES on owums_db.* to 'radius'@'%';
mysql> exit;
bash$ wget https://raw.github.com/zhex900/radius-config/master/db/owums_sample.sql
bash$ mysql -u radius -pradpass -h mysql owums_db < /etc/freeradius/db/owums_db_default.sql
This does the following three things.
- Create new radius user
- Create
owums_dbdatabse - Copy the default database