Το προφίλ μας στο Google Plus
3

Το Raspberry Pi ως OpenVPN server

Πρόσφατα μετατρέψαμε το λατρεμένο Raspberry Pi σε Tor relay, ώστε να το χρησιμοποιεί ο κόσμος όλος — κι ας μην το συνειδητοποιεί. Σ’ αυτό το άρθρο βάζουμε στο Pi και VPN server: Θα τον χρησιμοποιούμε εμείς μόνο, όποτε χρειαζόμαστε ασφαλή πρόσβαση στο οικιακό μας δίκτυο ή απλά ασφαλές web surfing.

Θεωρούμε ότι το λειτουργικό σύστημα που τρέχει το Raspberry Pi είναι το Raspbian, μια εκδοχή του Debian Linux που είναι κατάλληλα τροποποιημένη για την αρχιτεκτονική του Pi. Αν δεν έχετε ήδη εγκαταστήσει το Raspbian στη συσκευή σας, διαβάστε τα βήματα 1 και 2 αυτού του άρθρου. Επίσης, να σημειώσουμε ότι η παρούσα δημοσίευση βασίζεται εν πολλοίς σε σχετικό άρθρο που είχαμε δημοσιεύσει στο deltaHacker 007. Για την καλύτερη παρουσίαση όλων όσων ακολουθούν, την όλη διαδικασία έχουμε χωρίσει σε επιμέρους βήματα.

Βήμα 1 — Αρχικές προετοιμασίες κι εγκαταστάσεις
Συνδεόμαστε στο Raspbian μέσω SSH και κάνουμε ένα φρεσκάρισμα στο λειτουργικό:

<br />
pi@icepi ~ $ sudo apt-get update<br />
pi@icepi ~ $ sudo apt-get dist-upgrade<br />

Μετά την ολοκλήρωση του dist-upgrade, είναι πιθανό να ‘χει αναβαθμιστεί κι ο πυρήνας. Σ’ αυτή την περίπτωση, πριν συνεχίσουμε χρωστάμε μια επανεκκίνηση.

Συνεχίζουμε με την εγκατάσταση του OpenVPN:

<br />
pi@icepi ~ $ sudo apt-get -y install openvpn<br />

Για την εγκαθίδρυση κρυπτογραφημένων τούνελ μεταξύ clients και OpenVPN server, δημιουργούνται ορισμένα απαραίτητα πιστοποιητικά (certificates) καθώς και κάποια σετ ιδιωτικών/δημοσίων κλειδιών (private και public keys). Λεπτομέρειες στη συνέχεια.

(επιστροφή στην αρχή)

Βήμα 2 — Δημιουργία Αρχής Πιστοποίησης
Το στήσιμο της υποδομής κρυπτογράφησης για το OpenVPN γίνεται με τη βοήθεια συγκεκριμένων scripts, τα οποία μετά την εγκατάσταση του πακέτου openvpn βρίσκονται στον κατάλογο

<br />
/usr/share/doc/openvpn/examples/easy-rsa/2.0<br />

Όλος ο κατάλογος 2.0 πρέπει να βρίσκεται κάτω από τον

<br />
/etc/openvpn/easy-rsa<br />

Με τις ακόλουθες εντολές φροντίζουμε γι’ αυτό:

<br />
pi@icepi ~ $ sudo mkdir /etc/openvpn/easy-rsa<br />
pi@icepi ~ $ cd /etc/openvpn/easy-rsa<br />
pi@icepi /etc/openvpn/easy-rsa $ sudo cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0 .<br />

Θα τροποποιήσουμε τώρα τις τιμές ορισμένων μεταβλητών στο αρχείο vars, μέσα στον κατάλογο 2.0. Ένας εύχρηστος text editor γι’ αυτόν το σκοπό είναι το nano:

<br />
pi@icepi /etc/openvpn/easy-rsa $ cd 2.0<br />
pi@icepi /etc/openvpn/easy-rsa/2.0 $ sudo nano vars<br />

Δείτε από το δικό μας παράδειγμα ποιες μεταβλητές πρέπει ν’ αλλάξουν και πράξτε αναλόγως για το δικό σας αρχείο vars (πηγαίνετε προς το τέλος του):

<br />
export KEY_COUNTRY=&quot;GR&quot;<br />
export KEY_PROVINCE=&quot;CentralMacedonia&quot;<br />
export KEY_CITY=&quot;Thessaloniki&quot;<br />
export KEY_ORG=&quot;ParabingCreations&quot;<br />
export KEY_EMAIL=&quot;nobody@icepi.parabing.net&quot;<br />
export KEY_EMAIL=nobody@icepi.parabing.net<br />
export KEY_CN=IcePi<br />
export KEY_NAME=Parabing<br />
export KEY_OU=deltaHacker<br />

Αποθηκεύστε τις αλλαγές με [CTRL+O] & [Enter] κι εγκαταλείψτε το nano με [CTRL+X]. Παραμένοντας μέσα στον κατάλογο /etc/openvpn/easy-rsa/2.0 δίνουμε, διαδοχικά:

<br />
pi@icepi /etc/openvpn/easy-rsa/2.0 $ sudo su<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# source ./vars<br />
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# sh ./clean-all<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# sh ./build-ca<br />
Generating a 1024 bit RSA private key<br />
.......++++++<br />
................++++++<br />
writing new private key to 'ca.key'<br />
-----<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request. What you are about to enter is what is called<br />
a Distinguished Name or a DN. There are quite a few fields but you can leave<br />
some blank For some fields there will be a default value, If you enter '.',<br />
the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [GR]:<br />
State or Province Name (full name) [CentralMacedonia]:<br />
Locality Name (eg, city) [Thessaloniki]:<br />
Organization Name (eg, company) [ParabingCreations]:<br />
Organizational Unit Name (eg, section) [deltaHacker]:<br />
Common Name (eg, your name or your server's hostname) [IcePi]:<br />
Name [Parabing]:<br />
Email Address [nobody@icepi.parabing.net]:<br />

Επειδή πριν λίγο τροποποιήσαμε το αρχείο vars, σε όλες τις ερωτήσεις του build-ca αφήσαμε τις προεπιλογές πατώντας, απλά, το [Enter]. Μόλις δημιουργήσαμε αυτό που ονομάζεται Αρχή Πιστοποίησης (Certificate Authority, CA). Αναλυτικότερα:

  • δίνοντας sudo su αποκτήσαμε πρόσβαση στο λογαριασμό του root
  • με την εντολή source ./vars αρχικοποιήσαμε όλες τις μεταβλητές περιβάλλοντος που χρησιμοποιούν τα σκριπτάκια clean-all και build-ca
  • με την sh ./clean-all φροντίσαμε για την ύπαρξη του υποκαταλόγου keys, ο οποίος θα πρέπει να ‘ναι προσπελάσιμος *μόνον* από το χρήστη root
  • με την sh ./build-ca φτιάξαμε το ιδιωτικό κλειδί (private key) της CA (αρχείο keys/ca.key), καθώς και το πιστοποιητικό της (certificate, αρχείο keys/ca.crt)

Το ιδιωτικό κλειδί οφείλουμε να το προστατεύουμε ως κόρη οφθαλμού και περιττό να πούμε ότι δεν πρέπει να διαρρεύσει.

(επιστροφή στην αρχή)

Βήμα 3 — Ιδιωτικό κλειδί και πιστοποιητικό για τον server
Είναι ώρα να φτιάξουμε το ιδιωτικό κλειδί και το πιστοποιητικό του OpenVPN server. Παραμένοντας στο λογαριασμό του root, πληκτρολογούμε την ακόλουθη εντολή (στη θέση του “icepi”, που είναι το hostname του δικού μας Raspberry, μπορείτε να βάλετε κάποιο άλλο όνομα):

<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# sh ./build-key-server icepi<br />
Generating a 1024 bit RSA private key<br />
..........++++++<br />
..........................................++++++<br />
writing new private key to 'icepi.key'<br />
-----<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [GR]:<br />
State or Province Name (full name) [CentralMacedonia]:<br />
Locality Name (eg, city) [Thessaloniki]:<br />
Organization Name (eg, company) [ParabingCreations]:<br />
Organizational Unit Name (eg, section) [deltaHacker]:<br />
Common Name (eg, your name or your server's hostname) [icepi]:<br />
Name [Parabing]:<br />
Email Address [nobody@icepi.parabing.net]:</p>
<p>Please enter the following 'extra' attributes<br />
to be sent with your certificate request<br />
A challenge password []:<br />
An optional company name []:<br />
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf<br />
Check that the request matches the signature<br />
Signature ok<br />
The Subject's Distinguished Name is as follows<br />
countryName           :PRINTABLE:'GR'<br />
stateOrProvinceName   :PRINTABLE:'CentralMacedonia'<br />
localityName          :PRINTABLE:'Thessaloniki'<br />
organizationName      :PRINTABLE:'ParabingCreations'<br />
organizationalUnitName:PRINTABLE:'deltaHacker'<br />
commonName            :PRINTABLE:'icepi'<br />
name                  :PRINTABLE:'Parabing'<br />
emailAddress          :IA5STRING:'nobody@icepi.parabing.net'<br />
Certificate is to be certified until Sep  5 13:46:12 2023 GMT (3650 days)<br />
Sign the certificate? [y/n]:y<br />
1 out of 1 certificate requests certified, commit? [y/n]y<br />
Write out database with 1 new entries<br />
Data Base Updated<br />

Σε όλες τις ερωτήσεις μπορείτε ν’ αφήσετε τις προεπιλογές.

(επιστροφή στην αρχή)

Βήμα 4 — Παράμετροι Diffie-Hellman
Η ανταλλαγή κλειδιών μεταξύ client και server, όπως επίσης και η διαδικασία της ταυτοποίησης (authentication), ρυθμίζονται από τις λεγόμενες παραμέτρους Diffie-Hellman. Η δημιουργία των παραμέτρων επιτυγχάνεται πληκτρολογώντας:

<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# ./build-dh<br />
Generating DH parameters, 1024 bit long safe prime, generator 2<br />
This is going to take a long time<br />
[...]<br />

Γενικά, η διαδικασία δεν ολοκληρώνεται ακαριαία και στη χειρότερη περίπτωση ενδέχεται να διαρκέσει αρκετά λεπτά. Ειδικά στην περίπτωση του Raspberry θα χρειαστεί να κάνετε λίγη υπομονή.

(επιστροφή στην αρχή)

Βήμα 5 — Τακτοποίηση πιστοποιητικών και κλειδιών
Τα πιστοποιητικά, τα κλειδιά και το αρχείο με τις παραμέτρους Diffie-Hellman που φτιάξαμε στα προηγούμενα βήματα, βρίσκονται όλα τους μέσα στον κατάλογο /etc/openvpn/easy-rsa/2.0/keys. Πρόκειται για πέντε στο πλήθος αρχεία και για τη δική μας περίπτωση ήταν τα ακόλουθα:

1. ca.crt: το πιστοποιητικό της Αρχής Πιστοποίησης
2. ca.key: το ιδιωτικό κλειδί της Αρχής Πιστοποίησης
3. icepi.crt: το πιστοποιητικό του OpenVPN server
4. icepi.key: το ιδιωτικό κλειδί του OpenVPN server
5. dh1024.pem: το αρχείο παραμέτρων Diffie-Hellman

Τα 3 και 4 πιθανώς θα έχουν διαφορετικό όνομα στη δική σας περίπτωση — για την ακρίβεια αυτό που δώσατε τρέχοντας το σκριπτάκι build-key-server. Τα τέσσερα από τα πέντε πρέπει να τα αντιγράψουμε στον κατάλογο /etc/openvpn:

<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# cd keys/<br />
root@icepi:/etc/openvpn/easy-rsa/2.0/keys# cp ca.crt icepi.crt icepi.key dh1024.pem /etc/openvpn<br />
root@icepi:/etc/openvpn/easy-rsa/2.0/keys# exit<br />
exit<br />
pi@icepi /etc/openvpn/easy-rsa/2.0 $<br />

(επιστροφή στην αρχή)

Βήμα 6 — Το αρχείο ρυθμίσεων κι ενεργοποίηση
Σε πολύ λίγο θα έχουμε τελειώσει με το στήσιμο του OpenVPN server. Μένει μόνο να φτιάξουμε ένα βασικό αρχείο ρυθμίσεων, το οποίο θα βάλουμε στον κατάλογο /etc/openvpn. Το αρχείο αυτό επιτρέπεται να ‘χει όποιο όνομα θέλουμε, η κατάληξή του όμως πρέπει να ‘ναι .conf. Υπάρχει ένα υπόδειγμα αρχείου ρυθμίσεων, συμπιεσμένο μέσα στον κατάλογο /usr/share/doc/openvpn/examples/sample-config-files. Είναι ακριβώς ό,τι χρειαζόμαστε:

<br />
pi@icepi /etc/openvpn/easy-rsa/2.0 $ cd /etc/openvpn<br />
pi@icepi /etc/openvpn $ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .<br />
pi@icepi /etc/openvpn $ sudo gunzip -d server.conf.gz<br />

Όπως είναι το αρχείο server.conf δεν χρειάζεται κάποια αλλαγή, εκτός ίσως από τις δύο ακόλουθες γραμμές:

<br />
cert server.crt<br />
key server.key<br />

Αναλόγως του ονόματος που έχετε δώσει στο πιστοποιητικό και στο ιδιωτικό κλειδί του OpenVPN server, τροποποιήστε καταλλήλως. Εμείς, π.χ., τις κάναμε έτσι:

<br />
cert icepi.crt<br />
key icepi.key<br />

Τώρα, η ενεργοποίηση του OpenVPN server επιτυγχάνεται πληκτρολογώντας

<br />
pi@icepi /etc/openvpn $ sudo service openvpn start<br />
[ ok ] Starting virtual private network daemon: server.<br />

Όλα τέλεια.

(επιστροφή στην αρχή)

Βήμα 7 — Ρύθμιση OpenVPN client
Ας πούμε ότι θέλουμε να συνδεόμαστε στον OpenVPN server από το laptop μας — πρόκειται εξάλλου για ένα πολύ συνηθισμένο σενάριο. Οφείλουμε να δημιουργήσουμε ένα ιδιωτικό κλειδί κι ένα πιστοποιητικό για το laptop. Το script που χρειαζόμαστε ονομάζεται build-key και βρίσκεται μέσα στον κατάλογο /etc/openvpn/easy-rsa/2.0:

<br />
pi@icepi /etc/openvpn $ cd easy-rsa/2.0<br />
pi@icepi /etc/openvpn/easy-rsa/2.0 $ sudo su<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# source ./vars<br />
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# sh ./build-key laptop<br />
Generating a 1024 bit RSA private key<br />
..............................................++++++<br />
........................................++++++<br />
writing new private key to 'laptop.key'<br />
-----<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request. What you are about to enter is what is called<br />
a Distinguished Name or a DN. There are quite a few fields but you can leave<br />
some blank. For some fields there will be a default value. If you enter '.',<br />
the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [GR]:<br />
State or Province Name (full name) [CentralMacedonia]:<br />
Locality Name (eg, city) [Thessaloniki]:<br />
Organization Name (eg, company) [ParabingCreations]:<br />
Organizational Unit Name (eg, section) [deltaHacker]:<br />
Common Name (eg, your name or your server's hostname) [laptop]:<br />
Name [Parabing]:<br />
Email Address [nobody@icepi.parabing.net]:</p>
<p>Please enter the following 'extra' attributes<br />
to be sent with your certificate request<br />
A challenge password []:<br />
An optional company name []:<br />
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf<br />
Check that the request matches the signature<br />
Signature ok<br />
The Subject's Distinguished Name is as follows<br />
countryName           :PRINTABLE:'GR'<br />
stateOrProvinceName   :PRINTABLE:'CentralMacedonia'<br />
localityName          :PRINTABLE:'Thessaloniki'<br />
organizationName      :PRINTABLE:'ParabingCreations'<br />
organizationalUnitName:PRINTABLE:'deltaHacker'<br />
commonName            :PRINTABLE:'laptop'<br />
name                  :PRINTABLE:'Parabing'<br />
emailAddress          :IA5STRING:'nobody@icepi.parabing.net'<br />
Certificate is to be certified until Sep  5 17:25:57 2023 GMT (3650 days)<br />
Sign the certificate? [y/n]:y</p>
<p>1 out of 1 certificate requests certified, commit? [y/n]y<br />
Write out database with 1 new entries<br />
Data Base Updated<br />
root@icepi:/etc/openvpn/easy-rsa/2.0#<br />

Όπως βλέπετε στο παράδειγμά μας, για το κλειδί και το πιστοποιητικό επιλέξαμε το όνομα “laptop” — εννοείται ότι εσείς μπορείτε να επιλέξετε ό,τι θέλετε. Στις δε ερωτήσεις του build-key, αφήσαμε τις προεπιλογές. Το script έφτιαξε ένα πιστοποιητικό (laptop.crt) κι ένα ιδιωτικό κλειδί (laptop.key) για τον client, τα οποία κι άφησε μέσα στον κατάλογο keys.

Τώρα, αντιγράφουμε…

  • το πιστοποιητικό του CA (ca.crt)
  • το πιστοποιητικό του client (laptop.crt)
  • το ιδιωτικό κλειδί του client (laptop.key)

σ’ έναν βολικό κατάλογο, τον οποίο αργότερα θα μπορέσουμε να μεταφέρουμε εύκολα και με ασφάλεια στο μηχάνημα-πελάτη (π.χ., στο laptop). Ας υποθέσουμε ότι τα τρία αυτά αρχεία τα αντιγράφουμε στον κατάλογο ovpn-client, μέσα στο home directory του χρήστη pi:

<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# mkdir /home/pi/ovpn-client<br />
root@icepi:/etc/openvpn/easy-rsa/2.0# cd keys<br />
root@icepi:/etc/openvpn/easy-rsa/2.0/keys# cp ca.crt laptop.crt laptop.key /home/pi/ovpn-client<br />

Στον ίδιο κατάλογο μένει να μεταφέρουμε κι ένα κατάλληλα διαμορφωμένο αρχείο ρυθμίσεων. Ένα υπόδειγμα υπάρχει στο /usr/share/doc/openvpn/examples/sample-config-files:

<br />
root@icepi:/etc/openvpn/easy-rsa/2.0/keys# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /home/pi/ovpn-client<br />
root@icepi:/etc/openvpn/easy-rsa/2.0/keys# cd /home/pi/ovpn-client<br />
root@icepi:/home/pi/ovpn-client#<br />

Στο αρχειάκι client.conf πρέπει να κάνουμε δυο-τρεις αλλαγές. Το ανοίγουμε με το nano κι εντοπίζουμε τη γραμμή

<br />
remote my-server-1 1194<br />

Στη θέση του my-server-1 θα βάλουμε το δημόσιο IP που έχει ο router μπροστά από το Raspberry Pi. Για να το βρούμε, αρκεί να είμαστε εντός LAN και να επισκεφτούμε ένα site σαν το http://whatip.com. Βεβαίως, επειδή το IP αυτό κατά πάσα πιθανότητα είναι δυναμικό κι ενδέχεται ν’ αλλάξει ανά πάσα στιγμή, είναι προτιμότερο να καταφύγουμε σε μια δωρεάν υπηρεσία σαν αυτή στο http://no-ip.com, ώστε ν’ αντιστοιχίσουμε ένα domain name στο IP που παίρνουμε από τον ISP μας. Έτσι, αντί να βάλουμε το δημόσιο IP του router στη θέση του my-server-1, μπορούμε να βάλουμε ένα πλήρες domain σαν το homelan.dnsalias.net και η παραπάνω γραμμή να γίνει σαν αυτή:

<br />
remote homelan.dnsalias.net 1194<br />

Αυτό το 1194, στα δεξιά, είναι το προκαθορισμένο port που χρησιμοποιεί ο OpenVPN server. Μόνος λόγος για να τ’ αλλάξουμε είναι αν έχουμε ήδη ορίσει κάποιο άλλο port στο configuration file του server. Όπως και να ‘χει, στον router μας πρέπει να φροντίσουμε για τον κατάλληλο κανόνα port forwarding, ώστε τα εισερχόμενα πακέτα UDP προς το port 1194 του router ν’ ανακατευθύνονται προς το port 1194 του Raspberry, στο οποίο τρέχει ο OpenVPN server. Δύο άλλες γραμμές του client.conf που ίσως χρειαστεί να πειράξουμε, είναι οι ακόλουθες:

<br />
cert client.crt<br />
key client.key<br />

Στο παράδειγμά μας, το πιστοποιητικό και το ιδιωτικό κλειδί του client είναι τα αρχεία laptop.crt και laptop.key αντίστοιχα. Έτσι, οι δύο παραπάνω γραμμές γίνονται

<br />
cert laptop.crt<br />
key laptop.key<br />

Αποθηκεύουμε τις αλλαγές, εγκαταλείπουμε το nano, αλλάζουμε την ιδιοκτησία όλων των αρχείων του OpenVPN client και βγαίνουμε από τον λογαριασμό του root:

<br />
root@icepi:/home/pi/ovpn-client# cd ..<br />
root@icepi:/home/pi# chown -R pi:pi ovpn-client<br />
root@icepi:/home/pi# exit<br />
exit<br />

Επαναλαμβάνουμε ότι όλον τον κατάλογο ovpn-client πρέπει να μεταφέρουμε στον client (π.χ., στο laptop).

(επιστροφή στην αρχή)

Βήμα 8 — Σύνδεση στον OpenVPN server
Έφτασε η ώρα να δούμε πώς συνδεόμαστε στον OpenVPN server του Raspberry. Παίρνουμε τρεις περιπτώσεις λειτουργικών συστημάτων: Linux, Windows, OS X. Για όλες, προκειμένου να επιτευχθεί η σύνδεση πρέπει να είμαστε εκτός του LAN στο οποίο βρίσκεται το Raspberry.

Περίπτωση Linux. Αν στη διανομή είναι εγκατεστημένο το OpenVPN, δεν χρειάζεται τίποτε άλλο. Ανοίγουμε ένα τερματικό, μεταβαίνουμε στον κατάλογο όπου είναι αποθηκευμένα τα αρχεία client.conf, ca.crt, laptop.crt και laptop.key (π.χ., στον ovpn-client), κι από τον λογαριασμό του root ή μέσω του sudo δίνουμε κάτι σαν

<br />
$ sudo /usr/sbin/openvpn --config client.conf<br />

Για να διακόψουμε τη σύνδεση προς τον OpenVPN server, στο παράθυρο/καρτέλα τερματικού όπου έχουμε τρέξει το openvpn πατάμε τον συνδυασμό πλήκτρων [CTRL+C].

Περίπτωση Windows. Ένα δωρεάν εργαλείο που μπορούμε να χρησιμοποιούμε για τις συνδέσεις μας, είναι το λεγόμενο OpenVPN GUI for Windows. Τα αρχεία ca.crt, laptop.crt, laptop.key και client.conf, πρέπει να τα μεταφέρουμε στον φάκελο c:\program files\openvpn\config του προγράμματος. Το client.conf είναι απαραίτητο να το μετονομάσουμε σε client.ovpn (είναι καλή ιδέα να ρυθμίσετε τα Windows ώστε να δείχνουν τις επεκτάσεις *όλων* των αρχείων). Εκτελώντας το OpenVPN GUI for Windows, στο system tray εμφανίζεται σχετικό εικονίδιο. Με δεξί κλικ πάνω του –και με την προϋπόθεση ότι τα απαραίτητα αρχεία είναι στον φάκελο c:\program files\openvpn\config– θα δούμε το όνομα της σύνδεσης VPN. Το επιλέγουμε και σε ελάχιστα δευτερόλεπτα έχουμε συνδεθεί. Σημειώστε εδώ ότι αν έχετε 64μπιτη εκδοχή των Windows, πράγμα που είναι αρκετά πιθανό σήμερα, τότε πρέπει να πάρετε την development release του προγράμματος. Εναλλακτικά, στραφείτε στο Viscosity για Windows (βλ. περίπτωση OS X).

Περίπτωση OS X. Ένας δωρεάν client για το OpenVPN είναι το tunnelblick. Παλαιότερα είχαμε βρει κάποια ενοχλητικά bugs στο πρόγραμμα, οπότε έκτοτε χρησιμοποιούμε το επί πληρωμή Viscosity (κοστίζει 9 δολάρια). Στο πρόγραμμα αρκεί να δώσουμε το αρχείο client.conf (πρέπει να βρίσκεται μέσα στον φάκελο με τα ca.crt, laptop.crt, laptop.key) και το προγραμματάκι αμέσως θα προσθέσει ένα νέο entry στο μενού των διαθέσιμων συνδέσεων. Επιλέγοντάς το συνδεόμαστε απευθείας στον αντίστοιχο OpenVPN server.

(επιστροφή στην αρχή)

Αναδρομολόγηση *όλου* του traffic μέσα από το VPN
Με τις συνδέσεις που πετυχαίνουμε εφαρμόζοντας τα προηγούμενα, είναι σαν να υλοποιούμε ένα ασφαλές, κρυπτογραφημένο κανάλι επικοινωνίας μεταξύ client (π.χ., το laptop μας) κι απομακρυσμένου OpenVPN server. Κατ’ αυτόν τον τρόπο ο client γίνεται μέλος του LAN στο οποίο βρίσκεται ο server, έτσι έχουμε πρόσβαση σε κοινόχρηστους φακέλους, εκτυπωτές και γενικά σε υπηρεσίες εντός LAN. Όλα αυτά είναι εφικτά χάρη σ’ ένα ψευδοδικτυακό ενδιάμεσο (pseudo network interface) που στήνει το OpenVPN κι ονομάζεται tun device. Μπορούμε έτσι να φανταζόμαστε ότι υπάρχει ένα ασφαλές τούνελ που ξεκινά από τον client και τερματίζει στον server.

Όμως το traffic όλων των άλλων δημόσιων interfaces *δεν* διακινείται μέσω του ασφαλούς αυτού τούνελ. Για παράδειγμα, στην ασύρματη κάρτα δικτύωσης με την οποία έχουμε συνδεθεί στο ανοικτό hotspot της πλατείας, αντιστοιχεί ένα δημόσιο network interface κι όλα τα “ιντερνετικά πακέτα” διακινείται μέσω αυτού — όχι μέσω του ασφαλούς tun device. Ιδανικά, αυτό που θα θέλαμε είναι όλο –μα όλο– το network traffic να διέρχεται μέσω του tun, μ’ άλλα λόγια μέσω του ασφαλούς, κρυπτογραφημένου τούνελ μεταξύ laptop κι OpenVPN server. Ευτυχώς κάτι τέτοιο επιτυγχάνεται σχετικά εύκολα. Το μόνο που χρειάζεται είναι μια-δυο προσθήκες στο αρχείο server.conf (του OpenVPN), η ενεργοποίηση του λεγόμενου IP forwarding στον πυρήνα του Linux καθώς κι ο ορισμός μερικών κανόνων για το iptables, ώστε τα δικτυακά πακέτα να διακινούνται σωστά κι ανεμπόδιστα. Όλα τα προαναφερθέντα επιτυγχάνονται πολύ πιο εύκολα απ’ όσο ακούγονται. Ας στρέψουμε λοιπόν ξανά την προσοχή μας στον OpenVPN server, ώστε να δούμε όλες τις λεπτομέρειες.

(επιστροφή στην αρχή)

Βήμα 9 — Εγκατάσταση name server και ρύθμιση
Θέλουμε το Raspberry να εκτελεί *και* χρέη nameserver για τους OpenVPN clients. Ακριβώς γι’ αυτό θα χρειαστούμε τον DNS forwarder ονόματι dnsmasq:

<br />
pi@icepi ~ $ sudo apt-get -y install dnsmasq<br />

Αμέσως μετά την εγκατάστασή του οφείλουμε να βεβαιωθούμε ότι αφουγκράζεται για αιτήσεις πελατών από το loopback interface (127.0.0.1) αλλά κι από τη διεύθυνση 10.8.0.1, η οποία εξ ορισμού είν’ είναι εκείνη του tun gateway. Ανοίγουμε λοιπόν με το nano το αρχείο /etc/dnsmasq.conf

<br />
pi@icepi ~ $ sudo nano /etc/dnsmasq.conf<br />

κι αλλάζουμε τη γραμμή

<br />
#listen-address=<br />

σε

<br />
listen-address=127.0.0.1, 10.8.0.1<br />

Επίσης, από τ’ αριστερά της γραμμής

<br />
#bind-interfaces<br />

βγάζουμε το σύμβολο #, επομένως η γραμμή γίνεται

<br />
bind-interfaces<br />

Αποθηκεύουμε τις αλλαγές στο /etc/dnsmasq.conf κι επανεκκινούμε την υπηρεσία:

<br />
pi@icepi ~ $ sudo service dnsmasq restart<br />
[ ok ] Restarting DNS forwarder and DHCP server: dnsmasq.<br />

(επιστροφή στην αρχή)

Βήμα 10 — Περαιτέρω ρύθμιση OpenVPN server
Ανοίγουμε το αρχείο /etc/openvpn/server.conf με το nano

<br />
pi@icepi ~ $ sudo nano /etc/openvpn/server.conf<br />

και στο τέλος του προσθέτουμε τις ακόλουθες δύο γραμμές:

<br />
push &quot;redirect-gateway def1&quot;<br />
push &quot;dhcp-option DNS 10.8.0.1&quot;<br />

Αποθηκεύουμε τις αλλαγές, εγκαταλείπουμε το nano κι επανεκκινούμε τον OpenVPN server:

<br />
pi@icepi ~ $ sudo service openvpn restart<br />
[ ok ] Stopping virtual private network daemon: server.<br />
[ ok ] Starting virtual private network daemon: server.<br />

(επιστροφή στην αρχή)

Βήμα 11 — Λειτουργικότητα router
Για την ενεργοποίηση του IP forwarding αρκεί να πληκτρολογήσουμε

<br />
pi@icepi ~ $ sudo su<br />
root@icepi:/home/pi# echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward<br />
root@icepi:/home/pi# exit<br />
exit<br />
pi@icepi ~ $<br />

Φυσικά, το IP forwarding θέλουμε να ενεργοποιείται και κάθε φορά που φορτώνει το λειτουργικό. Ακριβώς γι’ αυτό ανοίγουμε το αρχείο /etc/sysctl.conf κι από τ’ αριστερά της γραμμής

<br />
#net.ipv4.ip_forward=1<br />

βγάζουμε τον χαρακτήρα #:

<br />
net.ipv4.ip_forward=1<br />

Για άλλη μια φορά, αποθηκεύουμε την αλλαγή κι εγκαταλείπουμε τον editor.

(επιστροφή στην αρχή)

Βήμα 12 — Ρυθμίσεις για το iptables
Έναν προς έναν, δίνουμε στο τερματικό τους ακόλουθους κανόνες για το iptables:

<br />
pi@icepi ~ $ sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
pi@icepi ~ $ sudo iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT<br />
pi@icepi ~ $ sudo iptables -A FORWARD -j REJECT<br />
pi@icepi ~ $ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE<br />

Βεβαίως, οι κανόνες θέλουμε να ενεργοποιούνται κάθε φορά που ξεκινά το λειτουργικό. Τους προσθέτουμε, λοιπόν, στο τέλος του αρχείου /etc/rc.local — αλλά πριν την τελευταία γραμμή (exit 0). Δείτε, π.χ., με τι μοιάζει το δικό μας rc.local:

<br />
#!/bin/sh -e<br />
#<br />
# rc.local<br />
#<br />
# This script is executed at the end of each multiuser runlevel.<br />
# Make sure that the script will &quot;exit 0&quot; on success or any other<br />
# value on error.<br />
#<br />
# In order to enable or disable this script just change the execution<br />
# bits.<br />
#<br />
# By default this script does nothing.</p>
<p># Print the IP address<br />
_IP=$(hostname -I) || true<br />
if [ &quot;$_IP&quot; ]; then<br />
  printf &quot;My IP address is %s\n&quot; &quot;$_IP&quot;<br />
fi</p>
<p>iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT<br />
iptables -A FORWARD -j REJECT<br />
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE</p>
<p>service dnsmasq restart</p>
<p>exit 0<br />

Παρατηρήστε τη γραμμή

<br />
service dnsmasq restart<br />

πριν από την τελευταία. Ο λόγος που την έχουμε βάλει είναι απλός: Κατά την εκκίνηση του Raspbian το dnsmasq επιχειρεί να ξεκινήσει *πριν* ακόμα δημιουργηθεί το tun device, με αποτέλεσμα να αποτυγχάνει. Στο τέλος της εκκίνησης του λειτουργικού, λοιπόν, τότε που διαβάζεται το αρχείο /etc/rc.local, είναι μια καλή ευκαιρία να επανεκκινούμε το dnsmasq!

Αυτό ήταν. Πλέον, κάθε φορά που χρησιμοποιούμε τον απομακρυσμένο OpenVPN server *όλη* η δικτυακή κίνηση διακινείται μέσω του tun device. Ένας τρόπος για να το επαληθεύσουμε είναι να κάνουμε δυο επισκέψεις σ’ ένα site σαν το http://www.whatip.com: Μία πριν συνδεθούμε στον OpenVPN server κι άλλη μία μετά, αφού συνδεθούμε.

(επιστροφή στην αρχή)

3 Responses to “Το Raspberry Pi ως OpenVPN server”

  1. ultrakiller | 17/08/2015 at 00:37

    συγνώμη για την ενδεχομένως βλακώδη ερώτηση:

    αν έχουμε τα εξής

    Δίκτυο server:
    192.168.1.1 – router
    192.168.1.2 – raspberry pi (openvpn server)

    Δίκτυο client:
    192.168.1.1 – router
    192.168.1.9 – client

    πώς μπορούμε να κάνουμε τον client να βλέπει τα μηχανήματα του τοπικού δικτύου του server; (πχ για να έχουμε πρόσβαση στο interface του router στο δίκτυο του server)

    • subZraw | 17/08/2015 at 09:23

      Γεια χαρά,
      Στο setup που περιγράφουμε ο client κι ο server πρέπει να βρίσκονται σε διαφορετικά δίκτυα. Στην πράξη, επειδή δεν έχουμε πάντα τον έλεγχο του δικτύου του client, καλό είναι να έχουμε φροντίσει ώστε ο server να βρίσκεται σε ένα *μη συνηθισμένο* subnet όπως, π.χ., το 10.20.30.0/24.

  2. ToPnt | 10/12/2017 at 00:14

    Μπράβο καταρχήν για την προσθήκη και αυτού του αναλυτικού οδηγού περί καθαρής εγκατάστασης του OpenVPN. Χάρης αυτούς τους οδηγούς γινόμαστε όλο και καλύτεροι. Ευχαριστούμε.

    Αυτό που έχω να προσθέσω εγώ είναι πως στην έκδοση
    «OpenVPN 2.4.0 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017
    library versions: OpenSSL 1.0.2l 25 May 2017, LZO 2.08», που μόλις δοκίμασα, τα πράγματα έχουν αλλάξει λίγο.

    Καταρχήν θα πρότεινα να τρέχετε (έστω για πρώτη φορά) τον openvpn server με την εντολή :
    «openvpn you_server_file.conf» έτσι ώστε αν υπάρξει κάποιο πρόβλημα να στο αναφέρει.

    Θα σας βγάλει λοιπόν το εξής μήνυμα :
    WARNING: cannot stat file ‘ta.key’: No such file or directory (errno=2)
    Options error: –tls-auth fails with ‘ta.key’: No such file or directory
    Options error: Please correct these errors.
    Use –help for more information.

    Αυτό γιατί όπως φαίνεται έχουν προσθέσει ένα ακόμη επίπεδο ασφάλειας και θα πρέπει να «generate an HMAC Key», αυτό επιτυγχάνεται με την εντολή :
    openvpn –genkey –secret /etc/openvpn/easy-rsa/keys/ta.key

    επίσης αυτό το αρχείο θα το στείλετε και στους clients! ( χωρίς αυτό δε δουλεύουν – ανεξαρτήτως συσκευής )

    Τέλος και με το αρχικό «source ./vars» είχα θέμα, διότι μου έβγαζε αυτό εδώ το πρόβλημα :
    «No /etc/openvpn/easy-rsa/openssl.cnf file could be found»
    το οποίο όμως λύνεται πολύ απλά αν επιλέξουμε να κάνουμε μια συντόμευση ενός εκ των πολλών διαφορετικών εκδόσεων openssl αρχείων που μας παρέχονται πλέον. Δηλαδή απλώς η παρακάτω εντολή αρκεί :

    root@raspberrypi:/etc/openvpn/easy-rsa# sudo ln -s openssl-1.0.0.cnf openssl.cnf

    και τέλος, επειδή και πάλι εμφάνιζε κάποιο προβληματάκι η εντολή «./build-ca» για να το προσπεράσω και αυτό, ήταν αρκετό να ανοίξω το αρχείο «vars» και να προσθέσω στο τέλος αυτή τη γραμμή :
    export KEY_ALTNAMES=”simething”

    Αυτά ήταν χοντρικά τα προβλήματα που αντιμετώπισα και το πως τα επίλυσα εγώ. ( Ελπίζω να μη ξέχασα κάποιο σημαντικό ).

    Οπότε ελπίζω να καταφέρνω πέρα από το να βοηθήσω τους νέους, να βοηθήσω και εσάς έστω λίγο στην νέα επικαιροποίηση του οδηγού που θα χρειαστεί.

    Ευχαριστώ πολύ.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων