Category Archives: Linux & Software

Tutorial: Limitare il traffico dei proxy con TC ed Iptables

Opensource LogoQualche giorno fa ho dovuto far fronte ad un problema di sovraccarico di rete di alcuni server per un provider americano che eroga servizi di anonimato. Nello specifico, proxy e VPN. Ho dovuto quindi stendere un piccolo script per poter fare un po’ di traffic shaping. Ecco come l’ho creato.

Ambiente e servizi

Prima di tutto ho dato un’occhiata al traffico e al modo in cui la macchina eroga i servizi.

Il carico di rete alto proveniva essenzialmente dai proxy, che vengono usati per fare spidering dei siti internet. Si parla quindi di una grande mole di connessioni simultanee da parte dello stesso IP.

I proxy venivano anche usati per effettuare il download di files o lo streaming di flussi video. Ho provato poi a configurare un account nella mia macchina per controllare il numero medio di connessioni simultanee per un utilizzo standard del servizio ed ho visto che tocca punte di 40 connessioni (posta, browsing, ed altre piccole cose), mentre alcuni IP arrivavano anche a 500-600 connessioni.
Il proxy è in ascolto in porta 80.
Per una maggiore usabilità ho chiaramente dovuto escludere dei servizi dal sistema di shaping, come SSH, lasciandoli “liberi di correre”.

Ho deciso quindi di utilizzare un semplice traffic shaping avvalendomi di 2 tools molto potenti: TC e Iptables, che mi hanno consentito di creare una catena dinamica delle connessioni e dei rispettivi limiti di banda.

Ecco come funziona:

  • La banda viene limitata secondo le possibilità fisiche: se il provider ti offre un limite 10mbit di banda, pena un sovrapprezzo per megabyte, dovremo accuratamente settare la quantità di banda consentita
  • Le prime 50 connessioni simultanee vengono accodate a priorità 1 a massima velocità
  • Dalla connessione 51, le connessioni vengono accodate in una catena a banda limitata
  • I files vengono scaricati a piena velocità da 0 a 9.99Mbyte, da 10Mbyte a 49.99 Mbyte vengono accodati in una coda limitata, e da 50Mbyte in poi, in una coda ancor più limitata.
  • Possibilità di utilizzare solo una parte della banda totale, utilizzando i parametri “DESIRED” e “DEFAULT”

Vediamo un po’ come implementare questa soluzione:

Prima di tutto creo una sezione per la configurazione delle variabili che utilizzerà lo script:

# Configuration part:
# $IPT binary
IPT=/sbin/iptables
# Tc binary
TC=/sbin/tc
# Physical interface - no virtual interfaces allowed ($ETH:0, $ETH:1 etc)
ETH=eth0
# SSH server port - we accept all connections in order to bypass the shaper
SSH_PORT=131
# Total bw rate
TOTAL_BW=10mbit
# Bandwidth peak - Please set it a little lower than your real preference
PEAK_BW=10mbit
# Desired Bandwidth Rate - Useful if you want to use less bw of your real capacity
DESIRED_BW=9mbit
# Desired peak - Same as above
DESIRED_PEAK=10mbit
# Jail rate - Set it quite lower if you want real results
JAIL_BW=512mbit
# Jail peak - Same as above
JAIL_PEAK=1mbit
# Default Bandwidth
# Set: 1 for Total values
#      2 for Desired values
DEFAULT_BW=2
# Connection Limit - Note that we talk about symultaneous connections. A good value is 10
CONNLIMIT=30
# Set first size limit
FIRST_SIZE=10485760
# Set the total available bandwidth for the first size limit
FIRST_SIZE_BW=1mbit
# Set the total available peak for the first size limit
FIRST_SIZE_PEAK=1mbit
# Set second size limit
SECOND_SIZE=52428800
# Set the total available bandwidth for the second size limit
SECOND_SIZE_BW=512kbit
# Set the total available peak for the second size limit
FIRST_SIZE_BW_PEAK=512kbit
# End of configuration file

Dopodiché creo lo script vero e proprio:

Prima di tutto faccio un flush della tavola di mangle (che serve per il mark dei pacchetti) e della catena di OUTPUT – che è l’unica che utilizzerò -:

# Flush all queues
$TC qdisc del dev $ETH root
# Flush mangle chains
$IPT -t mangle -F
$IPT -t mangle -Z
$IPT -t mangle -X
$IPT -F OUTPUT

A questo punto posso creare la qdisc, con le relative classi:

# Creating New TC queue
$TC qdisc add dev $ETH root handle 1: htb default $DEFAULT_BW
$TC class add dev $ETH parent 1: classid 1:1 htb rate $TOTAL_BW ceil $PEAK_BW
$TC class add dev $ETH parent 1:1 classid 1:2 htb rate $DESIRED_BW ceil $DESIRED_PEAK
$TC class add dev $ETH parent 1:1 classid 1:3 htb rate $JAIL_BW ceil $JAIL_PEAK
$TC class add dev $ETH parent 1:1 classid 1:4 htb rate $FIRST_SIZE_BW ceil $FIRST_SIZE_PEAK
$TC class add dev $ETH parent 1:1 classid 1:5 htb rate $SECOND_SIZE_BW ceil $FIRST_SIZE_BW_PEAK

Poi aggancio le classi al device principale:
# Adding the queue lists to the main device
$TC qdisc add dev $ETH parent 1:2 sfq
$TC qdisc add dev $ETH parent 1:3 sfq
$TC qdisc add dev $ETH parent 1:4 sfq
$TC qdisc add dev $ETH parent 1:5 sfq

Dico a TC di effettuare il traffic shaping secondo il mark dei pacchetti di Iptables:

# Adding filter by packet mark
$TC filter add dev $ETH parent 1:0 protocol ip prio 1 handle 7 fw flowid 1:3
$TC filter add dev $ETH parent 1:0 protocol ip prio 1 handle 20 fw flowid 1:4
$TC filter add dev $ETH parent 1:0 protocol ip prio 1 handle 21 fw flowid 1:5

Ed infine creo le regole di MARK su Iptables e il canale preferenziale per SSH:

# Setting packet connmarks:
$IPT -A PREROUTING -t mangle -j CONNMARK --restore-mark
$IPT -A POSTROUTING -t mangle -m mark ! --mark 0 -j ACCEPT
$IPT -A POSTROUTING -t mangle -p tcp  -m connlimit --connlimit-above $CONNLIMIT -j MARK --set-mark 7
$IPT -A POSTROUTING -t mangle -j CONNMARK --save-mark
# Setting file size mark
$IPT -A OUTPUT -p tcp --sport $SSH_PORT -j ACCEPT
$IPT -A OUTPUT -p tcp -o $ETH -m connbytes --connbytes $SECOND_SIZE: --connbytes-dir both  --connbytes-mode bytes -j MARK --set-mark 21
$IPT -A OUTPUT -p tcp -o $ETH -m connbytes --connbytes $FIRST_SIZE:$SECOND_SIZE --connbytes-dir both  --connbytes-mode bytes -j MARK --set-mark 20
$IPT -A OUTPUT -p tcp  -m connlimit --connlimit-above $CONNLIMIT -j MARK --set-mark 7

Conclusione

Non sono sicuro al 100% che questo script sia stato steso in maniera perfetta, certo è che funziona abbastanza bene. I carichi sui suddetti server sono spariti e la navigazione con i proxy è fluida e veloce, nonostante ora venga utilizzato solamente circa un terzo della banda.

Come limitare il tempo o il volume dati con freeradius: Rlm_sqlcounter

Eccovi semplice un how-to che vi consentirà di abilitare le limitazione di traffico e di tempo su freeradius in pochi passi utilizzando Rlm_sqlcounter.

In un vecchio post ho parlato di come installare e configurare Coovachilli su Ubuntu, e utilizzarlo con un’autenticazione Radius basata su Mysql. Oggi vi mostrerò come  limitare gli account in base al volume di traffico e al tempo.

Lo strumento che andremo ad utilzzare è Rlm_sqlcounter.

Rlm_sqlcounter è un plugin per Freeradius che, tramite una query sql, restituisce il volume di tempo o di traffico rimanente nell’autenticazione mediante l’utilizzo di attributi radius specifici. In caso il tempo o il traffico siano terminati, l’autenticazione non andrà a buon fine.

Vi ricordo che l’autenticazione dovrà essere fatta tassativamente tramite mysql.

Gli attributi che verranno utilizzati sono:

Max-All-Session - Per quanto riguarda il volume di tempo (in secondi)
Max-All-MB - Per quanto riguarda il volume di traffico (in bytes)

L’implementazione è semplice. Le più moderne distribuzioni pacchettizzate (Debian, Ubuntu, Centos) già prevedono la possibilità di attivare il plugin. Pertanto quello che dovrete fare è:

Attivare il plugin nel file di configurazione principale di freeradius:

vim /etc/freeradius/radiusd.conf
oppure
vim /etc/raddb/radiusd.conf

e decommentare la seguente riga:

$INCLUDE ${confdir}/sqlcounter.conf

Dopodiché aprite – o create in caso non esistesse – il file sqlcounter.conf e aggiungete queste righe:

vim /etc/freeradius/sqlcounter.conf
oppure
vim /etc/raddb/sqlcounter.conf

e aggiungete queste righe:

sqlcounter noresetcounter {
counter-name = Max-All-Session-Time
check-name = Max-All-Session
sqlmod-inst = sql
key = User-Name
reset = never
query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}'"

}

sqlcounter octetslimit {
counter-name = Max-All-MB
check-name = Max-All-MB
reply-name = Chillispot-Max-Total-Octets
key = User-Name
reset = never
query = "SELECT SUM(acctinputoctets+acctoutputoctets) from radacct WHERE UserName='%{%k}'"
sqlmod-inst = sql
}

Infine andate ad attivare il count del traffico e del tempo:

vim /etc/freeradius/sites-available/default
oppure
vim /etc/raddb/sites-available/default

e in fondo alla sezione authorize aggiungete:

authorize {
...
...
...

noresetcounter
octetslimit
}

riavviate freeradius

/etc/init.d/freeradius restart
oppure
/etc/init.d/radiusd restart

A questo punto il vostro server dovrebbe essere apposto. Quello che resta da fare è provare a limitare un utente. Eccovi qualche esempio di utilizzo:

– L’utente test0001 ha un volume complessivo di tempo di 15 MegaBytes (l’utente può effettuare il login quante volte lo ritiene necessario, ma può essere online per una quantitaà totale di traffico di 15 MegaBytes, ovvero 165675008 bytes). La query da inserire sarà:

INSERT into radcheck VALUES ('','test0001','Max-All-MB','165675008',':=');

Fintanto che l’utente avrà a disposizione del tempo, l’autenticazione andrà a buon fine utilizzando la propria password:

[root@kingston raddb]#  radtest test0001 test 10.100.0.1 0 passwordradius
Sending Access-Request of id 228 to 10.100.0.1 port 1812
User-Name = "test0001"
User-Password = "test"
NAS-IP-Address = 173.255.219.122
NAS-Port = 0
rad_recv: Access-Accept packet from host 10.100.0.1 port 1812, id=132, length=20
ChilliSpot-Max-Total-Octets = 165675008
[root@kingston raddb]#

Una volta che il tempo si sarà esaurito, il radius non autenticherà l’utente:

[root@kingston raddb]#  radtest test0001 test 10.100.0.1 0 passwordradius
Sending Access-Request of id 228 to 10.100.0.1 port 1812
User-Name = "test0001"
User-Password = "test"
NAS-IP-Address = 173.255.219.122
NAS-Port = 0
rad_recv: Access-Reject packet from host 10.100.0.1 port 1812, id=228, length=68
Reply-Message = "Your maximum never usage time has been reached"
[root@kingston raddb]#

Lo stesso comportamento succede per quanto riguarda l’attributo Max-All-Session.

Se avete problemi con con il funzionamento vi ricordo che si può attivare il debug in foreground arrestando il demone:

/etc/init.d/freeradius stop

oppure

/etc/init.d/radiusd stop

ed avviando la modalità debug:

freeradius -XXX

oppure

radiusd -XXX

oppure potete consultare i log che si trovano in:

/var/log/freeradius

oppure

/var/log/radius/

Happy Hacking!

Come creare un installer Debian personalizzato: simple-ccd

Debian LogoPiccolo tutorial che spiega come utilizzare simple-ccd, un tool che consente la creazione di un DVD/CD di installazione personalizzato.

Ultimamente ho dovuto creare un CD di installazione automatico da poter distribuire agli utenti e contentente dei programmi proprietari con licenza shareware.
Ho quindi scelto Debian come distribuzione, sopratutto perché ha a disposizione un tool molto potente e personalizzabile: simple-cdd.

Simple-cdd è un set di script che permette la creazione di CD/DVD di installazione personalizzati ed automatici. Vediamo un po’ come funziona.

Per prima cosa installiamo il programma:

apt-get install build-simple-cdd

dopodiché creiamo una nuova directory nella nostra home:

mkdir $HOME/ccd

ci entriamo:

cd $HOME/ccd

e lanciamo subito il nostro nuovo tool:

build-simple-ccd

lanciato così senza paramentri, lo script creerà un installer di base, che installerà un sistema operativo privo di qualsivoglia pacchetto. Durante l’esecuzione, build-simple-cdd creerà un mirror parziale nella directory tmp/ e, se tutto è andato bene, troverete la nuova immagine nella directory images/

Le opzioni principali di Simple-cdd

Proviamo ora ad utilizzare qualche opzione:

in caso vogliate utilizzare un mirror specifico per il download dei pacchetti, potete speficarlo con l’opzione –debian-mirror:

build-simple-cdd --debian-mirror http://debian.fastweb.it/debian

di default, lo script creerà un installer della stessa release della macchina host, in caso vogliate utilizzare un’altra release (ad esempio Lenny) potete utilizzare l’opzione –dist:

build-simple-cdd --debian-mirror http://debian.fastweb.it/debian --dist lenny

Utilizzare i profili con Simple-cdd

Il grande pregio di simple-cdd è la possibilità di creare delle installazioni altamente personalizzabili grazie all’utilizzo di profili caricabili in fase di setup. Vediamo un po’ come funzionano:

creiamo una directory chiamata “profiles” e ci entriamo:

mkdir ./profiles
cd ./profiles

creiamo poi un file chiamato default.packages e lo editiamo inserendoci tutti i pacchetti che vogliamo installare automaticamente:

vi default.packages
# inserisco i pacchetti che mi servono, ma non le dipendenze!

openssh
less
openssl
apache2
mysql-server
freeradius

ricreiamo poi l’immagine con il profilo selezionato:

build-simple-cdd --profiles default --debian-mirror http://debian.fastweb.it/debian --dist lenny

Questo comando ricostruirà la vostra immagine includendo il profilo che avete appena creato.

in caso vogliate provare l’immagine con qemu, c’è l’opzione –qemu apposita per costruire un immagine già pronta per l’emulatore:

build-simple-cdd --profiles default --debian-mirror http://debian.fastweb.it/debian --dist lenny --qemu

L’utilizzo di Preseed

Con simple-cdd è possibile utilizzare i file di preseed.
I file di preseed sono dei file di testo contenenti le risposte alle domande che vengono poste in fase di installazione. Grazie a questi sarà possibile non inserire i dati manualmente mentre l’installazione è in esecuzione.

Vediamo un po’ come implementarle nella nostra immagine personalizzata:

creiamo un file chiamato “default.preseed” e lo editiamo:

vim default.preseed

dentro ci inseriremo alcune info utili alla nostra installazione:

# informazioni sulla rete

# la rete viene configurata secondo i parametri qui esposti e viene disabilitato il DHCP
d-i netcfg/disable_dhcp boolean true
d-i netcfg/get_nameservers string 10.0.69.254
d-i netcfg/get_ipaddress string 10.0.69.234
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 10.0.69.254
d-i netcfg/confirm_static boolean true
d-i netcfg/get_hostname string astTron
d-i netcfg/get_domain string localdomain
d-i netcfg/wireless_wep string

# timezone, package mirror e locale

d-i mirror/country string manual
d-i mirror/http/hostname string http.debian.fastweb.it
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

d-i clock-setup/utc boolean true
d-i time/zone string Europe/Rome
tzsetup-udeb    time/zone       select  Europe/Rome

d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string time.ien.it

# informazioni sulla partizione

d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true

# password di root

d-i passwd/root-password password test
d-i passwd/root-password-again password test

user-setup-udeb passwd/root-password password test
user-setup-udeb passwd/root-password-again password test

# configurazione di un nuovo utente

d-i passwd/user-fullname string Utente di Amministrazione
d-i passwd/username string adminuser
d-i passwd/user-password password test
d-i passwd/user-password-again password test

user-setup-udeb passwd/user-fullname string Utente di Amministrazione
user-setup-udeb passwd/username string adminuser
user-setup-udeb passwd/user-password password test
user-setup-udeb passwd/user-password-again password test

# configurazione di apt

d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

d-i apt-setup/services-select multiselect security, volatile
d-i apt-setup/security_host string security.debian.org

d-i apt-setup/volatile_host string volatile.debian.org

# configurazione mysql

mysql-server-5.0 mysql-server/root_password string
mysql-server-5.0 mysql-server/root_password seen true
mysql-server-5.0 mysql-server/root_password_again string
mysql-server-5.0 mysql-server/root_password_again seen true
mysql-server-5.0 mysql-server/root_password password test
mysql-server-5.0 mysql-server/root_password_again password test

# popularity contest
popularity-contest popularity-contest/participate boolean false

# installazione del boot loader

d-i grub-installer/only_debian boolean true
d-i finish-install/reboot_in_progress note

ricostruiamo infine l’immagine con:

build-simple-cdd --profiles default --debian-mirror http://debian.fastweb.it/debian --dist lenny

In questa maniera, gran parte delle informazioni richieste in fase di installazione saranno già incluse nella vostra ISO.

In caso abbiate dei pacchetti costruiti da voi e vogliate includerli nella vostra ISO, dovete creare la directory package in $HOME/cdd

mkdir $HOME/cdd/packages

dove dentro metterete i vostri pacchetti. Aggiungerete poi i il nome dei pacchetti anche nel file default.packages. Infine ricostruirete la vistra ISO con l’opzione –local-packages $HOME/cdd/packages:

build-simple-cdd –profiles default –debian-mirror http://debian.fastweb.it/debian –dist lenny –local-packages $HOME/cdd/packages

Un po’ di info

Potete trovare molte altre informazioni sull’utilizzo di simple-cdd nel sito debian:

http://wiki.debian.org/Simple-CDD/Howto
http://wiki.debian.org/DebianInstaller/Preseed

e nelle directory

/usr/share/doc/simple-cdd/

/usr/share/simple-cdd/

Creazione di Un Hotspot Wifi con Coova-chilli e scheda Atheros

Avete a disposizione un PC con una scheda Wifi Atheros e volete installare un hotspot con autenticazione username/password? Fatelo con Ubuntu Linux!

Sono stato contattato per un progetto dedicato all’installazione di un sistema di hotspot Wifi scalabile basato su autenticazione username/password, con sistema di registrazione online.

Per iniziare a sviluppare la rete, ho dovuto crearmi una situazione simile a casa. Ho utilizzato il mio hardware a disposizione, e la mia connessione casalinga. Vale a dire, un Netbook Samsung N130 – con scheda Wifi Atheros AR9285 – e la mia ADSL. Per quanto riguarda il software, invece, mi sono servito dei seguenti programmi e tools:

  • Ubuntu come distribuzione Linux
  • Hostapd come programma di gestione dell’access point
  • Coova-chilli come sistema di accesso alla rete
  • Freeradius come sistema di autenticazione
  • MySQL come sistema di account
  • Apache come web server

Eccovi qui un how-to su come configuare correttamente i seguenti programmi per avere un sistema di hotspot funzionante.

Software necessario
Per prima cosa, naturalmente, dobbiamo avere un server Linux funzionante e connesso ad Internet. ho optato per Ubuntu (e non per la abituale Debian) perché Coova-Chilli ha già il pacchetto precompilato per Ubuntu 10.10. Non dovendo utilizzare una Linux Box come sistema finale (ma degli Open-WRT su router Linksys), ho optato per la comodità.

Aggiorniamo il sistema con:

apt-get update
apt-get upgrade

Installiamo il software:

apt-get install apache2 mysql-server php5 libapache2-mod-php5 freeradius freeradius-mysql dhcp3-server hostapd hostapd-utils libapache2-mod-auth-mysql ssl-cert

cd /tmp
wget http://ap.coova.org/chilli/coova-chilli_1.2.6_i386.deb
dpkg -i coova-chilli_1.2.6_i386.deb

Oltre a questo, abbiamo bisogno di un pacchetto chiamato haserl. Lo possiamo trovare qui. Una volta scaricato dobbiamo installare il compilatore GCC – se ancora non lo abbiamo nella macchina – e compilare il programma:

apt-get install gcc
tar xvf haserl-*.tar.gz
cd haserl-*/
./configure
make
make install

Configurazioni Preliminari
Una volta installato tutto il software necessario, passiamo alla configurazione dei servizi. La prima cosa da fare è la configurazione della rete e dell’access point. Assumiamo che l’accesso ad Internet sia fornito su interfaccia eth0 e l’IP dal DHCP. Andiamo quindi a modificare il file /etc/network/interfaces come segue:

vim /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto wlan0

Abilitiamo il port-forwarding:

echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

Configurazione di Hostapd e Dhcp-server
Configuriamo hostapd:

vim /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=HotSpot
channel=6
ieee8021x=0

Dopodiché configuriamo il server dhcpd:

vim /etc/dhcp3/dhcpd.conf

e aggiungiamo:

subnet 10.0.1.0 netmask 255.255.255.0
{
range 10.0.1.100 10.0.1.200;
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.1.255;
option domain-name-servers 8.8.8.8,8.8.4.4;
option routers 10.0.1.1;
}

infine abilitiamo il server dhcpd per l’interfaccia virtuale tun0, che è quella che Coova-Chilli abiliterà e utilizzerà automaticamente.

vim /etc/default/dhcp3-server
INTERFACES="tun0"

Riavviamo il server dhcp:

/etc/init.d/dhcp-server restart

e testiamo la configurazione avviando il demone in foreground:

hostapd /etc/hostapd/hostapd.conf

Se siamo in grado di collegarci correttamente punto di accesso appena creato e riceviamo l’IP dal dhcp, chioudiamo il programma con Ctrl+C e avviamolo in background con:

/etc/init.d/hostapd start

Configurazione del server radius
Configuriamo ora il server radius per essere usato con un database mysql.
Creiamo il database:

mysql -u root
CREATE DATABASE radius;
quit

Lo popoliamo:

mysql -u root -p radius < /etc/freeradius/sql/mysql/schema.sql
mysql -u root -p radius < /etc/freeradius/sql/mysql/schema.sql
mysql -u root
GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
quit

Diciamo a freeradius come utilizzare il database:

vim /etc/freeradius/sql.conf
server = "localhost"
login  = "radius"
password = "password"

Settiamo la password per il client di freeradius:

vim /etc/freeradius/clients.conf
client localhost {
ipaddr = 127.0.0.1
secret = radiuspassword
}

Testiamo adesso la corretta configurazione dell’ACL appena creata:

vim /etc/freeradius/users

decommentare le seguenti righe:

"John Doe"     Auth-Type := Local, User-Password == "hello"
Reply-Message = "Hello, %u"

A questo punto comproviamo la corretta inclusione dei file di configurazione avviando freeradius in foregrund:

/etc/init.d/freeradius stop
freeradius -XXX

Se tutto è andato bene, l’ultima linea stampata dovrà terminare con:

Debug: Ready to process requests.

Usciamo di nuovo da freeradius con Ctrl+C e lo avviamo di nuovo in background:

/etc/init.d/freeradius start

Eseguiamo allora una chiamata al radius per l’utente di test “John Doe”

radtest "John Doe" hello 127.0.0.1 0 radiuspassword

Se tutto è andato bene come risposta dovremmo ricevere:

Sending Access-Request of id 136 to 127.0.0.1 port 1812
User-Name = "John Doe"
User-Password = "hello"
NAS-IP-Address = 255.255.255.255
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=136, length=37
Reply-Message = "Hello, John Doe"

Se il test sopra ha funzionato, possiamo cambiare il backend di autorizzazione, da “files” a “sql”

vim /etc/freeradius/sites-available/default

e Cambiamo:

files con #files
#sql con sql

Aggiungiamo ora un utente di test al nostro database mysql:

echo "INSERT INTO radcheck (UserName, Attribute, Value) VALUES ('mysqltest', 'Password', 'test');" | mysql -u radius radius

Coova-chilli di default utilizza l’username ‘chillispot’ con password ‘chillispot’ per loggarsi al server radius. Dobbiamo quindi aggiungere anche questo utente nel database mysql:

echo "INSERT INTO radcheck (UserName, Attribute, Value) VALUES ('chillispot', 'Password', 'chillispot');" | mysql -u radius radius

Questa impostazione di trova nel file /etc/chilli/config

HS_ADMUSR=chillispot
HS_ADMPWD=chillispot

Riavviamo freeradius:

/etc/init.d/freeradius restart

Testiamo infine il corretto funzionamento di freeradius con backend mysql:

radtest mysqltest testsecret 127.0.0.1 0 radiuspassword
radtest chillispot chillispot 127.0.0.1 0 radiuspassword

Se tutto è andato bene, dovresti ricevere un output del genere:

Sending Access-Request of id 180 to 127.0.0.1 port 1812
User-Name = "mysqltest"
User-Password = "test"
NAS-IP-Address = 255.255.255.255
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=180, length=20

Configurazione di Coova-Chilli
Prima di tutto copiamo la configurazione di default di Coova-Chilli e Apache2:

cp /etc/chilli/defaults /etc/chilli/config
mkdir /var/www/hotspot
cd /var/www/hotspot
cp /etc/chilli/www/* /var/www/hotspot
mkdir /var/www/hotspot/images
cp /var/www/hotspot/coova.jpg /var/www/hotspot/images/
mkdir /var/www/hotspot/uam
cd /var/www/hotspot/uam
wget http://ap.coova.org/uam/
wget http://ap.coova.org/js/chilli.js

Modifichiamo il file index.html per dirgli di utilizzare chilli.js localmente (Coova-Chilli utilizza 10.1.0.1 come IP di esempio, e noi pure):

sed -i 's/ap.coova.org\/js\/chilli.js/10.1.0.1\/uam\/chilli.js/g' /var/www/hotspot/uam/index.html

Modifichiamo il file ChilliLibrary.js per dirgli di utilizzare l’IP corretto:

sed -i 's/192.168.182.1/10.1.0.1/g' /etc/chilli/www/ChilliLibrary.js
sed -i 's/192.168.182.1/10.1.0.1/g' /var/www/hotspot/ChilliLibrary.js

Abilitiamo Coova-Chilli all’avvio del sistema, che è disabilitato di default:

vim /etc/default/chilli
START_CHILLI=1
CONFFILE="/etc/chilli.conf"

e avviamo Coova-Chilli:

/etc/init.d/chilli start

A questo punto, se non si sono presentati errori, dobbiamo modificare la configurazione di Coova-Chilli. Il file di configurazione è /etc/chilli/config. per una configurazione basica basterà cambiare poche variabili:

vim /etc/chilli/config

e modifichiamo:

HS_WANIF=eth0
HS_LANIF=wlan0
HS_UAMSERVER=10.1.0.1

Dobbiamo anche modificare il file /etc/chilli/up.sh, in quanto è presente un bug che non configura correttamente iptables:

vim /etc/chilli/up.sh

E aggiungiamo alla fine del file:

[ -e "/var/run/chilli.iptables" ] && sh /var/run/chilli.iptables 2>/dev/null
iptables -I POSTROUTING -t nat -o $HS_WANIF -j MASQUERADE

Infine, riavviamo Coova-Chilli:

/etc/init.d/chilli restart

Configurazione di Apache2 e SSL
Dobbiamo ora creare una pagina di login. Coova-Chilli ne ha una di default che possiamo utilizzare:

mkdir -p /var/www/hotspot/cgi-bin
zcat -c /usr/share/doc/coova-chilli/hotspotlogin.cgi.gz | sudo tee /var/www/hotspot/cgi-bin/hotspotlogin.cgi
sudo chmod a+x /var/www/hotspot/cgi-bin/hotspotlogin.cgi

Modifichiamo ora lo script di login:

/var/www/hotspot/cgi-bin/hotspotlogin.cgi

e decommentiamo:

$uamsecret = "uamsecret";
$userpassword=1;

Passiamo ora alla configurazione di SSL:
Creiamo i certificati:

mkdir /etc/apache2/ssl
make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem

Attiviamo SSL:

a2enmod ssl
/etc/init.d/apache2 restart

Creiamo ora un VirtualHost per il nostro hotspot:

vim /etc/apache2/sites-available/hotspot
NameVirtualHost 10.1.0.1:443

ServerAdmin [email protected]
DocumentRoot "/var/www/hotspot"
ServerName "10.1.0.1"

Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all

Alias "/dialupadmin/" "/usr/share/freeradius-dialupadmin/htdocs/"

Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all

ScriptAlias /cgi-bin/ /var/www/hotspot/cgi-bin/

AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all

ErrorLog /var/log/apache2/hotspot-error.log

LogLevel warn

CustomLog /var/log/apache2/hotspot-access.log combined

ServerSignature On
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.pem

Abilitiamo il nuovo virtualhost:

a2ensite hotspot
/etc/init.d/apache2 reload

A questo punto il vostro hotspot dovrebbe essere funzionante!
Provate ad agganciarvi alla vostra rete Wifi ed aprire qualunque pagina. Dovrebbe apparirvi la pagina di accesso di Coova-Chilli e poi la pagina di login.

Riferimenti

Installazione di OpenVPN su sistemi operativi Linux

openvpn logoIn quest’articolo vedremo come installare OpenVPN per mettere in comunicazione sicura una rete di PC attraverso internet.

OpenVPN è una soluzione Open Source che opera in user space, creando un tunnel point-to-point TCP over UDP che permette, come si vedrà nel corso di questo articolo, la creazione di VPN.

L’installazione su server Linux è abbastanza semplice, basta seguire alcuni passi qui descritti:

Azioni preliminari

Prima di tutto dobbiamo installare l’applicazione OpenVPN. Possiamo usare un gestore pacchetti oppure compilarlo dai sorgenti. In debian, per installarlo tramite APT possiamo dare il comando:

apt-get install openvpn

Dopodiché, il nostro server sarà già pronto per essere configurato.

Il primo step da eseguire è la creazone di una CA e delle chiavi necessarie per l’autenticazione. Per questo passo ci viene in aiuto un set di scripts che sono contenuti sia nel sorgente, sia nel pacchetto debian installato con APT: easy-rsa.

Per controllare se e dove abbiamo questi tools possiamo usare locate:

updatedb
locate easy-rsa

Normalmente li possiamo trovare in /usr/share/doc/openvpn

Una volta entrati sulla cartella easy-rsa/2.0, dobbiamo definire le variabili che gli scripts utilizzeranno per creare il nostro set di chiavi. Andremo quindi a modificare il file “vars” con le informazioni corrette. Se abbiamo tutte le dipendenze installate e correttamente funzionanti, dovremo solo modificare l’ultima parte dello script, che di default si predenta così:

export KEY_SIZE=1024
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="[email protected]"

Io personalmente preferisco usare una chiave a 2048, perché è più sicura, mentre per le altre variabili dovremo inserire i nostri dati.

Configurazione del server OpenVPN

Ora dobbiamo creare le chiavi che utilizzerà il server OpenVPN.

Sempre nella cartella easy-rsa/2.0,  inizializziamo le variabili con necessarie con:

. ./vars

e generiamo la CA e le chiavi con i seguenti comandi:

./build-ca
./build-key-server server #dove server è il nome del server openvpn
./build-dh

A questo punto le nostre chiavi e la nostra CA sono pronte e le possiamo copiare nella nostra directory di configurazione globale: /etc/openvpn

cp -Rp keys/ /etc/openvpn

E settare i permessi corretti:

chmod 700 /etc/openvpn/keys
chmod 600 /etc/openvpn/keys/server.key #giusto per eccesso di zelo

Infine dobbiamo creare il file di configurazione, eccone uno standard di esempio (vi consiglio una sbirciatina al manuale per capire a fondo il significato delle opzioni qui riportate e le altre):

port 1194 # Porta di OpenVPN
proto udp # Protocollo da usare: UDP è più veloce, ma TCP è più stabile in caso di connessioni degradate
dev tun # Adattatore virtuale da utilizzare
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key server.key  # Questo file dovrebbe rimanere segreto
dh /etc/openvpn/keys/dh1024.pem
server 192.168.34.0 255.255.255.0 # Network che OpenVPN utilizzerà per la sua rete
ifconfig-pool-persist ipp.txt # File dove vengono memorizzati gli IP dei client
push "route 192.168.34.0 255.255.255.0" # Regola di routing per la rete OpenVPN
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3

Per una maggiore compatibilità con gli script di avvio/arresto di OpenVPN, vi consiglio di posizionare il file in /etc/openvpn  e dargli come estensione .conf.

Se tutto è andato OK, potete avviare il vostro server OpenVPN:

/etc/init.d/openvpn restart

Configurazione del client OpenVPN

Per creare le chiavi ed il file di configurazione del client la procedura è abbastanza simile. Entreremo sempre in easy-rsa/2.0 (la stessa directory del server mi raccomando) e creiamo le chiavi:

. ./vars

./build-key username #dove username è il nome o l'host del vostro client

In questo modo, dentro keys troveremo le chiavi per il client appena creato. Quello che manca ora è creare il file di configurazione del client. Eccone un esempio:

client
dev tun
proto udp
remote host.del.server.openvpn 1194 # Dovrete inserire l'host del vostro server VPN
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt # File della CA
cert client.crt # Certificato del vostro client
key client.key # Chiave del vostro client
ns-cert-type server
comp-lzo
verb 3

A questo punto non dovrete far altro che recapitare le chiavi ed il file di configurazione al vostro client, perché possa provare ad utilizzare la vostra nuova rete privata virtuale.

Vi ricordo che per ogni utente che voi vogliate creare, la procedura descritta sopra è sempre valida.