Differenze tra le versioni di "RoadWarrior"
Riga 430: | Riga 430: | ||
Di solito i router hanno 1-2 led. Farebbe comodo sapere dai led se la wan e la vpn sono collegate (lampeggio o accensione continua) | Di solito i router hanno 1-2 led. Farebbe comodo sapere dai led se la wan e la vpn sono collegate (lampeggio o accensione continua) | ||
+ | |||
+ | [[Category:Progetti]] |
Versione delle 13:32, 4 nov 2015
Scopo
Questo progetto nasce dall'esigenza di portarsi sempre con se la propria rete anche quando si è in viaggio dispositivi che rendono tutto questo possibile si chiamano Road Warrior [1]
Avere sempre con se una rete wifi sicura e che i nostri dispositivi conoscono ci evita ogni volta di riconfigurarli.
In presenza di captive portal basta collegarsi da un solo dispositivo per dare connettività a tutti gli altri.
E' presente anche una wireless sicura che dirotta tutto il traffico attraverso una VPN, per avere un'uscita verso internet criptata.
Il sistema inoltre può essere reso modulare aggiungendo moduli che si connettono ad esempio in wifi, 3G o quello che preferiamo.
Tutto questo puo' essere realizzato con un access point router di dimensioni compatte, facile da aggiungere al bagaglio, tipicamente il Road Warrior ha piu' di una interfaccia di rete e magari una porta usb.
Gli esperimenti descritti di seguito sono stati condotti su due modelli:
* HooToo Trip Mate Nano [2] molto compatto con porta Ethernet, wifi, USB * AUKEY PB-W1, che è un router portatile con powerbank integrato, wifi, ethernet e usb.
Il modello del router non e' fondamentale, e' importante che il router sia compatibile con OpenWRT e che abbia almeno 8MB di flash (necessaria per installare OpenVPN).
Aggiornamento firmware sul router HooToo
In questo caso utilizziamo un piccolo access point portatile su cui installiamo il firmware openwrt, il modello non è importante, quello che conta è che il dispositivo sia compatibile con questo firmware.
Di seguito la procedura per installare openwrt su HooToo, un access point a basso costo, con wifi interno, presa per la rete cablata, alimentato con usb, switch hardware.
L'installazione del firmware è riportata sul wiki di openwrt: http://wiki.openwrt.org/toh/hootoo/tripmate-nano.
Il dispositivo ha bisogno di una memoria usb esterna, ad esempio una chiavetta su cui appoggiare il file con il nuovo firmware.
Per caricare openwrt, spostare lo switch sul router nella posizione "mondo", inserire una chiavetta di memoria usb nello slot.
Collegarsi al router tramite wifi e sull'interfaccia web caricare il firmware openwrt.
Attendere 5 minuti di orologio scollegare l'alimentazione e ricollegarla.
A questo punto ci si può collegare al router con il cavo ethernet.
D'ora in poi sara' possibile utilizzare i files con il firmware ufficiale openwrt.
Riportiamo per comodita' il link dell'ultimo firmware per hootoo (al momento in cui viene editata la pagina): openwrt-15.05-ramips-rt305x-ht-tm02-squashfs-sysupgrade.bin
Configurazione
- Inserire la parte di installazione di openwrt -
Configurazione WiFi client
Collegarsi al router all'indirizzo 192.168.1.1.
Cambiare indirizzo ip della lan e applicare le modifiche, io ho usato 192.168.250.1. Fatto questo bisogna ricollegarsi al router al nuovo indirizzo.
Accedere ad internet andando su Network - Wifi.
Cercare una wifi conosciuta facendo scan sulla scheda di rete interna.
Impostare la password di rete e salvare applicando le modifiche.
Aggiornamento software e installazione pacchetti
Collegarsi al router in ssh (ad esempio con il programma Putty).
Installare i pacchetti dando i seguenti comandi:
opkg update
opkg install nano
opkg install luci-ssl
Voglio usare sue schede wifi, quella integrata per esporre le mie reti, una esterna per collegarsi all'hotspot che fornisce connettività.
Per il supporto periferiche usb ho dovuto installare i seguenti pacchetti:
opkg install kmod-usb-core kmod-usb-ohci kmod-usb2
Per fargli riconoscere la mia scheda wifi "blueway"
opkg install kmod-rt2800-lib kmod-rt2800-usb kmod-rt2x00-lib kmod-rt2x00-usb
Riavviare per permettere al router di individuare la scheda. Rientrando su Luci, andare su network - wifi e controllare se è apparsa la seconda interfaccia radio
Cancellare le reti, utilizzare la seconda scheda di rete per collegarsi ad internet
Andare su System - system e configurare il nome del dispositivo (che apparirà anche nel nome file quando si salva la configurazione)
Volendo cambiare i server ntp (ntp1.inrim.it,ntp2.inrim.it)
Installare openvpn
opkg install openvpn-openssl
Creare un'interfaccia slan, con ip statico diverso dalla lan (es 192.168.251.1), interfaccia fisica slan, e con dhcp
Creare un'interfaccia swan, unmanaged, con interfaccia fisica tun0
Per farlo vanno aggiunte queste righe su etc/config/network
config interface 'swan'
option ifname 'tun0'
option proto 'none'
config interface 'slan'
option proto 'static'
option ipaddr '192.168.251.1'
option netmask '255.255.255.0'
option _orig_ifname 'lan0'
option _orig_bridge 'false'
option type 'bridge'
option ifname 'slan'
Controllare che il dhcp sia attivo sull'interfaccia slan
Applicare le regole firewall [...]
Inserire queste righe su /etc/config/network
config zone
option input 'ACCEPT'
option output 'ACCEPT'
option name 'slan'
option network 'slan'
option forward 'REJECT'
config zone
option forward 'REJECT'
option output 'ACCEPT'
option input 'REJECT'
option masq '1'
option mtu_fix '1'
option network 'swan'
option name 'swan'
config rule
option target 'ACCEPT'
option family 'ipv4'
option proto 'udp'
option src 'slan'
option name 'Secure DHCP'
option dest_port '67-68'
config rule
option target 'ACCEPT'
option src 'slan'
option name 'Secure DNS'
option dest_port '53'
option family 'ipv4'
config forwarding
option dest 'swan'
option src 'slan'
Creare dentro a /etc/openvpn il file client.conf e aggiungere i certificati nella stessa cartella.
Il mio è così:
client
dev tun
proto tcp
remote [indirizzo] 443
resolv-retry infinite
#redirect-gateway def1
route-nopull
nobind
persist-tun
persist-key
ca ca.crt
cert roadwarrior.crt
key roadwarrior.key
remote-cert-tls server
verb 1
script-security 3
route-delay 5
route-up "/etc/openvpn/route-up.sh"
keepalive 10 60
E' importante la riga route-nopull perchè non deve ereditare la tabella di routing dal server
Nella stessa cartella aggiungere anche il file route-up.sh, dargli le autorizzazioni e inserire all'interno il seguente script:
#!/bin/sh
# Checks to see if there is an IP routing table named 'vpn', create if missing
if [ $(cat /etc/iproute2/rt_tables | grep vpn | wc -l) -eq 0 ]; then
echo "100 vpn" >> /etc/iproute2/rt_tables
fi
echo "------------------------------------------------------------------"
ip route show
echo "------------------------------------------------------------------"
# Remove any previous routes in the 'vpn' routing table
ip rule | sed -n 's/.*\(from[ \t]*[0-9\.]*\).*vpn/\1/p' | while read RULE
do
echo "remove old rule: /bin/ip rule del ${RULE}"
/bin/ip rule del ${RULE}
done
#echo ifconfig_remote: ${ifconfig_remote} dev: ${dev} > /tmp/antani
# Add routes to the vpn routing table
echo ip rule add from 192.168.251.0/24 lookup vpn prio 1000
ip rule add from 192.168.251.0/24 lookup vpn prio 1000
# Add the route to direct all traffic using the the vpn routing table to the tunX interface
echo ip route add default via ${ifconfig_remote} dev ${dev} table vpn
ip route add default via ${ifconfig_remote} dev ${dev} table vpn
#add a route for the lan itself
echo ip route add 192.168.251.0/24 dev br-slan table vpn
ip route add 192.168.251.0/24 dev br-slan table vpn
ip route flush cache
exit 0
In questo modo openvpn parte all'avvio e cerca di connettersi al server, una volta connessa crea una tabella di routing specifica per la slan (source routing)
Creare 2 wlan sulla wifi integrata (radio0) bridgiate con lan e slan. Le ho chiamate rispettivamente unsecure e secure
Teoricamente se tutto è configurato bene quando si è collegati alla lan (o la wifi unsecure) è possibile navigare in internet in maniera non sicura.
Aprendo il sito http://whatismyipaddress.com/ o simili la connessione proviene dal provider dell'hotspot
Quando si è collegati alla slan (quindi la wifi secure) è possibile collegarsi alla lan che ospita la vpn (la lan di casa mia), e l'indirizzo ip che appare è quello della lan remota.
Per fare in modo che il router si colleghi ad una lista di wifi conosciute ho usato queste istruzioni
https://forum.openwrt.org/viewtopic.php?id=43352
Ho modificato il file wifiMgr.sh cambiando i nomi delle interfacce e aggiungendo alcune funzioni come segue:
#!/bin/sh
. /etc/wifiMgr/config
randMacAddr()
{
macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/00:\2:\3:\4:\5:01/')
uci set wireless.@wifi-iface[2].macaddr="$macaddr"
uci commit wireless
/etc/init.d/network restart
}
NetStatus()
{
logger WifiMgr: Checking network...
net=$(ping 8.8.8.8 -c5 |grep "time=")
if [ "$net" ]; then
logger WifiMgr: Network OK
#got ping response!
return
else
logger WifiMgr: Network failed. Starting network change...
NetChange
fi
}
NetChange()
{
logger WifiMgr: Performing network scan...
source /etc/wifiMgr/config
scanres=
ifconfig wlan1 down
iw phy phy0 interface add scan0 type station
ifconfig scan0 up
while [ "$scanres" = "" ]; do
#Sometimes it shows nothing, so better to ensure we did a correct scan
scanres=$(iw scan0 scan|grep SSID)
done
iw dev scan0 del
ifconfig wlan1 up
killall -HUP hostapd
logger WifiMgr: WifiMgr: Searching available networks...
if [ "$1" ]; then
ssid=net"$1"_ssid
eval ssid=\$$ssid
echo Trying to connect to network "$1"": $ssid"
n=$(expr "$1" - "1")
else
n=0
fi
while [ "1" ]; do
n=$(expr "$n" + "1")
if [ "$n" = "99" ]; then
#too much counts. Crazy wireless count, breaking loop!
break
fi
ssid=net"$n"_ssid
encrypt=net"$n"_encrypt
key=net"$n"_key
eval ssid=\$$ssid
eval encrypt=\$$encrypt
eval key=\$$key
if [ "$ssid" = "" ]; then
#ssid not existing or empty. Assume it's the end of the wlist file
break
fi
echo SSID: $ssid
#echo KEY: $key
#echo SEGURIDAD: $encrypt
active=$(echo $scanres | grep " $ssid ">&1 )
if [ "$active" ]; then
if [ "$1" ]; then
echo Network found. Connecting...
fi
logger WifiMgr: "$ssid" network found. Applying settings..
uci set wireless.@wifi-iface[2].ssid="$ssid"
uci set wireless.@wifi-iface[2].encryption="$encrypt"
uci set wireless.@wifi-iface[2].key="$key"
uci set wireless.@wifi-iface[2].bssid=""
uci commit wireless
/etc/init.d/network restart
#wait some seconds for everything to connect and configure
sleep $NewConnCheckTimer
logger WifiMgr: Checking connectivity...
#check for internet connection, 5 ping sends
net=$(ping google.es -c5 |grep "time=")
if [ "$net" ]; then
#got ping response!
logger WifiMgr: Internet working! Searching ended
if [ "$1" ]; then
echo Sucess!
fi
break
fi
if [ "$1" ]; then
echo Connection failed!
break
fi
logger WifiMgr: Failed! Searching next available network...
fi
done
}
if [ "$1" = "" ]; then
echo "No arguments supplied"
elif [ "$1" = "--force" ]; then
NetChange $2
elif [ "$1" = "--daemon" ]; then
if [ "$randMac" = "1" ]; then
randMacAddr
fi
NetChange
while [ "1" ]; do
sleep $ConnCheckTimer
NetStatus
done
else
echo "Wrong arguments"
fi
L'avvio con /etc/init.d ha qualche problema, e a volte scollega tutte le wifi ricollegandosi, ma tutto sommato funziona.
Idee e cose da provare
Non ne so molto di reti routing e firewall, arrivare a questo risultato è stato molto faticoso e frutto di notte insonni e continui insuccessi.
Lo so, è fatto male e si poteva fare meglio ma non so come.
Se qualcuno vuole contribuire e migliorare il progetto è benvenuto.
Un problema è che le query DNS escono sempre dalla wan che non è sicura, bisognerebbe farle girare attraverso la vpn
E' possibile accendere e spegnere il wifi con questo script (che avevo fatto partire con il connect della vpn), da testare
#!/bin/sh
#secure
uci set wireless.@wifi-iface[1].disabled='0'
wifi
#unsecure
uci set wireless.@wifi-iface[0].disabled='1'
wifi
exit 0
Sarebbe bello utilizzare la porta ethernet come wan per collegarsi via cavo. Impostando un indirizzo ip statico di management in caso di emergenza
Di solito i router hanno 1-2 led. Farebbe comodo sapere dai led se la wan e la vpn sono collegate (lampeggio o accensione continua)