Myślę że szał na Raspberry Pi szybko nie minie a to z powodu niewielkiej ceny za mini komputer a po drugie rzeszy fanów i dużego wsparcia. Raspberry Pi OpenVPN Android w jednej całości to jest to czego sam używam i dlatego postanowiłem napisać poradnik jak skonfigurować OpenVPN na Raspberry Pi i podłączać się do niego smartfonem z Androidem.
Poniżej przestawię jak skonfigurować na Raspberry Pi serwer OpenVPN. Logowanie będzie odbywać się przy pomocy certyfikatu ca i loginu/hasła z systemu a nie z pliku lub jakiejś dodatkowej bazy. Postaram się to zrobić w miarę szczegółowo i pokazać co będzie działo się w konsoli po wpisaniu niektórych komend aby ułatwić i dobrze zobrazować proces instalacji.
Moim celem jest połączyć się z telefonu do Raspberry Pi który jest w sieci 172.18.10.0/24 i otworzyć stronkę mojego projektu nettemp.pl. W tym celu muszę wypchać routing do klienta dla sieci 172.18.10.0/24 ponieważ OpenVPN zestawi tunel na zupełnie innej adresacji 10.8.0.0/24. Raspberry Pi ma IP 172.18.10.7 i jak poniżej zobaczycie do takiego IP też się łącze ponieważ robię to lokalnie po wifi. Aby łączyć się z zewnątrz mam przekierowany na routerze port UDP 1194 na 172.18.10.7. Trzeba pamiętać aby zmienić IP na zewnętrzne aby łączyć się po włączeniu transmisji danych w telefonie. Ja tego nie zrobiłem od razu ponieważ mam obecnie awarie internetu w domu, ale czy IP lokalny czy zewnętrzny nie ma to żadnego znaczenia.
Raspberry Pi OpenVPN Android
Moje Raspberry Pi posiada system z oficjalnego obrazu który można pobrać na stronie raspberrypi.org
Logowanie i przejście na root
Hasło i login: pi/raspberry
ssh pi@172.18.10.7 sudo su -
root@raspberrypi:~#
Instalacja OpenVPN
aptitude install openvpn
root@raspberrypi:~# aptitude install openvpn The following NEW packages will be installed: openvpn 0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B/480 kB of archives. After unpacking 1,024 kB will be used. Preconfiguring packages ... Selecting previously unselected package openvpn. (Reading database ... 63340 files and directories currently installed.) Unpacking openvpn (from .../openvpn_2.2.1-8_armhf.deb) ... Processing triggers for man-db ... Setting up openvpn (2.2.1-8) ... [ ok ] Restarting virtual private network daemon.:.
Certyfikaty
Teraz generuje certyfikaty potrzebne dla serwera OpenVPN w tym ca.crt. Poniżej trzeba będzie podać dane takie jak Common Name lub Name ale nie musimy przywiązywać tu dużej uwagi te dane nam się nie przydadzą później. Moje wpisy zostały pogrubione można wziąć to na wzór.
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/ . ./vars ./clean-all ./build-ca ./build-dh ./build-key-server server
root@raspberrypi:~# cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/ root@raspberrypi:/usr/share/doc/openvpn/examples/easy-rsa/2.0#
. ./vars
root@raspberrypi:/usr/share/doc/openvpn/examples/easy-rsa/2.0# . ./vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys
./clean-all
root@raspberrypi:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./clean-all root@raspberrypi:/usr/share/doc/openvpn/examples/easy-rsa/2.0#
./build-ca
root@raspberrypi:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-ca Generating a 1024 bit RSA private key ...............................................................................................++++++ .......++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]:PL State or Province Name (full name) [CA]:Pomorskie Locality Name (eg, city) [SanFrancisco]:Gdansk Organization Name (eg, company) [Fort-Funston]:techfreak.pl Organizational Unit Name (eg, section) [changeme]:IT Common Name (eg, your name or your server's hostname) [changeme]:ca_techfreak.pl Name [changeme]:ca_techfreak.pl Email Address [mail@host.domain]:mail@gmail.com
./build-dh
root@raspberrypi:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-dh Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time .................................+..................................+........+...................................................................................................................+................+............+..........................................+..............................................+.....................+....................................................+....+..........+.....+...+.................................................+................................+........+................................................................+.+........................+.................................................+...............................+........+................................................................................................................................................................+............................................................+..............................................+.........+.......+...................................................++*++*++*
./build-key-server server
root@raspberrypi:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-key-server server Generating a 1024 bit RSA private key ..++++++ .++++++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]:PL State or Province Name (full name) [CA]:Pomorskie Locality Name (eg, city) [SanFrancisco]:Gdansk Organization Name (eg, company) [Fort-Funston]:techfreak.pl Organizational Unit Name (eg, section) [changeme]:IT Common Name (eg, your name or your server's hostname) [server]: Name [changeme]:techfreak_server Email Address [mail@host.domain]:mail@gmail.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'PL' stateOrProvinceName :PRINTABLE:'Pomorskie' localityName :PRINTABLE:'Gdansk' organizationName :PRINTABLE:'techfreak.pl' organizationalUnitName:PRINTABLE:'IT' commonName :PRINTABLE:'server' name :T61STRING:'techfreak_server' emailAddress :IA5STRING:'techfreak.pl@gmail.com' Certificate is to be certified until Jun 16 16:48:08 2023 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n] y Write out database with 1 new entries Data Base Updated
Kopiowanie certyfikatów do katalogu /etc/openvpn/
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/ cp ca.crt server.crt server.key dh1024.pem /etc/openvpn/
Plik ca.crt będzie potrzebny w dalszej części więc trzeba sobie już go zgrać na komputer lub telefon
root@raspberrypi:/etc/openvpn# scp ca.crt sosprz@172.18.10.103:~
sosprz@172.18.10.103's password:
Konfiguracja OpenVPN
Najlepiej skopiować oryginalny, przykładowy plik server.conf i umieścić go w katalogu /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ cd /etc/openvpn/ sudo gunzip server.conf.gz
Wpisy jakie dodałem do pliku aby uwiarygodnić klienta na podstawie certyfikatu i loginu/hasła to:
plugin /usr/lib/openvpn/openvpn-auth-pam.so login client-cert-not-required username-as-common-name log-append /var/log/openvpn
Poniżej zawartość pliku server.conf bez komentarzy i wyłączonej konfiguracji
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 172.18.10.0 255.255.255.0" keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log log-append /var/log/openvpn.log verb 3 plugin /usr/lib/openvpn/openvpn-auth-pam.so login client-cert-not-required username-as-common-name
Włączenie usługi OpenVPN i dodanie jej do autostartu
update-rc.d openvpn enable service openvpn start
root@raspberrypi:/etc/openvpn# update-rc.d openvpn enable update-rc.d: using dependency based boot sequencing root@raspberrypi:/etc/openvpn# service openvpn start [ ok ] Starting virtual private network daemon: server.
Przekazywanie pakietów
Aby Raspberry Pi przepuszczał pakiety z jednej sieci do drugiej np. z telefonu do naszego LAN’u trzeba na to zezwolić.
nano /etc/sysctl.conf # Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
NAT
Przekazywanie pakietów włączone to teraz musimy ukryć nasze IP klienta pod IP Raspberry Pi aby mieć dostęp do sieci 172.18.10.0/24. Można było by dodawać routing powrotny do urządzeń do których chcemy się łączyć ale NAT jest lepszym rozwiązaniem w tym przypadku.
root@raspberrypi:~# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE root@raspberrypi:~# iptables-save && iptables-save > /etc/network/iptables # Generated by iptables-save v1.4.14 on Thu Jun 20 17:34:41 2013 *nat :PREROUTING ACCEPT [1:84] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [3:273] :POSTROUTING ACCEPT [3:273] -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE COMMIT
Dodajemy linie pre-up iptables-restore < /etc/network/iptables do pliku /etc/network/interfaces
nano /etc/network/interfaces auto lo iface lo inet loopback iface eth0 inet dhcp pre-up iptables-restore < /etc/network/iptables allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp
I teraz mamy pewność że reguły iptables zostaną załadowane przy starcie.
Podgląd logów
Kazaliśmy demonowi OpenVPN logować wszystko do pliku /var/log/openvpn.log więc trzeba skorzystać z tego. Poniżej można zobaczyć jakie logwanie powinno się zobaczyć przy poprawnej konfiguracji i podłączeniu.
root@raspberrypi:/etc/openvpn# tail -f /var/log/openvpn
Tue Jun 18 17:02:51 2013 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ] Tue Jun 18 17:02:51 2013 UDPv4 link local (bound): [undef] Tue Jun 18 17:02:51 2013 UDPv4 link remote: [undef] Tue Jun 18 17:02:51 2013 MULTI: multi_init called, r=256 v=256 Tue Jun 18 17:02:51 2013 IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0 Tue Jun 18 17:02:51 2013 ifconfig_pool_read(), in='pi,10.8.0.4', TODO: IPv6 Tue Jun 18 17:02:51 2013 succeeded -> ifconfig_pool_set() Tue Jun 18 17:02:51 2013 IFCONFIG POOL LIST Tue Jun 18 17:02:51 2013 pi,10.8.0.4 Tue Jun 18 17:02:51 2013 Initialization Sequence Completed Tue Jun 18 17:03:04 2013 MULTI: multi_create_instance called Tue Jun 18 17:03:04 2013 172.18.10.101:43347 Re-using SSL/TLS context Tue Jun 18 17:03:04 2013 172.18.10.101:43347 LZO compression initialized Tue Jun 18 17:03:04 2013 172.18.10.101:43347 Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ] Tue Jun 18 17:03:04 2013 172.18.10.101:43347 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ] Tue Jun 18 17:03:04 2013 172.18.10.101:43347 Local Options hash (VER=V4): '530fdded' Tue Jun 18 17:03:04 2013 172.18.10.101:43347 Expected Remote Options hash (VER=V4): '41690919' Tue Jun 18 17:03:04 2013 172.18.10.101:43347 TLS: Initial packet from [AF_INET]172.18.10.101:43347, sid=c79bd658 05362fcd Tue Jun 18 17:03:05 2013 172.18.10.101:43347 PLUGIN_CALL: POST /usr/lib/openvpn/openvpn-auth-pam.so/PLUGIN_AUTH_USER_PASS_VERIFY status=0 Tue Jun 18 17:03:05 2013 172.18.10.101:43347 TLS: Username/Password authentication succeeded for username 'pi' [CN SET] Tue Jun 18 17:03:05 2013 172.18.10.101:43347 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key Tue Jun 18 17:03:05 2013 172.18.10.101:43347 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Jun 18 17:03:05 2013 172.18.10.101:43347 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key Tue Jun 18 17:03:05 2013 172.18.10.101:43347 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Jun 18 17:03:05 2013 172.18.10.101:43347 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA Tue Jun 18 17:03:05 2013 172.18.10.101:43347 [pi] Peer Connection Initiated with [AF_INET]172.18.10.101:43347 Tue Jun 18 17:03:05 2013 pi/172.18.10.101:43347 MULTI_sva: pool returned IPv4=10.8.0.6, IPv6=58b7:d0be:78de:f9b6:440b:ffb6:9cd5:46b7 Tue Jun 18 17:03:05 2013 pi/172.18.10.101:43347 MULTI: Learn: 10.8.0.6 -> pi/172.18.10.101:43347 Tue Jun 18 17:03:05 2013 pi/172.18.10.101:43347 MULTI: primary virtual IP for pi/172.18.10.101:43347: 10.8.0.6 Tue Jun 18 17:03:07 2013 pi/172.18.10.101:43347 PUSH: Received control message: 'PUSH_REQUEST' Tue Jun 18 17:03:07 2013 pi/172.18.10.101:43347 send_push_reply(): safe_cap=960 Tue Jun 18 17:05:46 2013 pi/172.18.10.101:58359 SENT CONTROL [pi]: 'PUSH_REPLY,route 172.18.10.0 255.255.255.0,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5' (status=1)
Konfiguracja Androida
Osobiście do OpenVPN na androida używam dwóch aplikacji pierwsza OpenVPN z forum Xda-developers a druga OpenVPN for Android ze sklepu PLAY i obie nie wymagają roota na smartfonie.
- Upewniamy się że mamy na telefonie już wgrany ca.crt ponieważ jest on wymagany i trzeba go wskazać w programie.
- Ja w poniższej konfiguracji loguje się na domyślnego użytkownika w systemie Raspberry PI czyli „pi„
- Aby przetestować połączenie do innej sieci wchodzę na adres 172.18.10.7
OpenVPN
OpenVPN for Android
Wszystko działa ołłłł jee
Mam nadzieje że wam wszystko działa tak jak mi i konfiguracja nie sprawiła problemu.
To jeszcze nie koniec
Tematy jakie pozostają do zrobienia to zapora iptables i user/pass z np. pliku a nie systemu.