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

OpenVPN στο FreeBSD: Εγκατάσταση και Ρύθμιση

Σε εκτενές άρθρο που δημοσιεύσαμε στο τεύχος 007 του deltaHacker δείξαμε, αναλυτικά και βήμα προς βήμα, πώς να εγκαταστήσουμε και να ρυθμίσουμε το OpenVPN στο Ubuntu Linux, ώστε αφενός να έχουμε ασφαλή απομακρυσμένη πρόσβαση στο τοπικό δίκτυο του μηχανήματος, αφετέρου να προστατεύουμε την ιδιωτικότητά μας κατά το web surfing ή κατά τη χρήση μιας οποιασδήποτε ιντερνετικής υπηρεσίας γενικότερα. Στο παρόν άρθρο δείχνουμε ακριβώς το ίδιο, αλλά τώρα δουλεύουμε στο περιβάλλον του FreeBSD.

Λίγο καιρό μετά τη δημοσίευση του εν λόγω άρθρου ο γράφων αγόρασε ένα VPS από το bsdvm.com. Το VPS αυτό βρίσκεται κάπου στην Καλιφόρνια κι ως λειτουργικό σύστημα τρέχει το FreeBSD 9.0-RELEASE. Γενικά –κι ανεξαρτήτως του λειτουργικού που τρέχει ένα VPS–, μετά την αρχική ρύθμιση του συστήματος και την εγκατάσταση ορισμένων βασικών εργαλείων, οι σκέψεις που κυριαρχούν στο μυαλό περιστρέφονται γύρω από το τι μπορείς να κάνεις με το ολοκαίνουργιο VPS σου…

Μια από τις χρήσεις που βρήκε το VPS του γράφοντα ήταν να έχει ρόλο OpenVPN server, για ασφαλέστατη πρόσβαση στο Internet ακόμη κι από επισφαλή σημεία πρόσβασης, αλλά και για την περιστασιακή χρήση ορισμένων υπηρεσιών οι οποίες είναι διαθέσιμες μόνο σε όσους βγαίνουν στο Internet από Αμερική.

Το Hulu είναι ένα παράδειγμα ιντερνετικής υπηρεσίας που διατίθεται με γεωγραφικούς περιορισμούς.

Στο παρόν άρθρο δείχνουμε πώς εγκαταστήσαμε και ρυθμίσαμε το OpenVPN στο FreeBSD μας. Όλα όσα παρουσιάζουμε και συζητάμε βασίζονται στο σχετικό άρθρο που δημοσιεύτηκε στο deltaHacker 007. Στην πραγματικότητα, ακολουθήθηκαν πιστά οι διαδικασίες του έντυπου άρθρου αλλά με διαφοροποιήσεις εδώ κι εκεί, ώστε να εφαρμοστούν επιτυχώς στο περιβάλλον του FreeBSD.

Για τη συνέχεια παίρνουμε ως δεδομένο ότι έχετε root access σε κάποιον υπολογιστή, VM ή VPS με FreeBSD. Όλη η εργασία θα γίνει από τον λογαριασμό του root και το περιβάλλον της γραμμής εντολών. Προς το τέλος του άρθρου θα συζητήσουμε και για το πώς συνδεόμαστε στον OpenVPN server από κάποιον άλλον υπολογιστή, ανεξαρτήτως αν τρέχει Windows, OS X ή Linux/*BSD.

Χάρη στο OpenVPN που έχουμε στημένο σε (FreeBSD based) VPS κάπου στην Αμερική, απολαμβάνουμε τις υπηρεσίες του Hulu. Όχι ότι καιγόμασταν γι' αυτές, δηλαδή, αλλά σημασία έχει ότι μπορούμε ;)

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

Εγκατάσταση του OpenVPN
Υποθέτουμε ότι το ports tree είναι ήδη εγκατεστημένο. Αν δεν είναι εγκαταστήστε το τώρα, π.χ., ακολουθώντας τις οδηγίες που δίνονται στο άρθρο του @sonic2000gr, το οποίο δημοσιεύεται εδώ. Θα δουλέψουμε επίσης μέσα από το κέλυφος του BASH. Αν δεν είναι (ούτε αυτό) εγκατεστημένο, πράξτε τα δέοντα διαβάζοντας το προαναφερθέν άρθρο. Φροντίζουμε λοιπόν ότι το BASH τρέχει, π.χ., με ένα

# bash

Εντοπίζουμε τη θέση του openvpn port:

# whereis openvpn
openvpn: /usr/ports/security/openvpn

Μεταβαίνουμε στον κατάλογό του…

# cd /usr/ports/security/openvpn

…κι εγκαθιστούμε δίνοντας

# make install clean

Στο text dialog box που εμφανίζεται αφήνουμε τις προεπιλογές (απλά πατάμε το [Enter]). Η διαδικασία της μεταγλώττισης ενδέχεται να διαρκέσει αρκετά λεπτά. Υπομονή.

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

Πιστοποιητικά και κλειδιά για server
Το αρχείο ρυθμίσεων του OpenVPN, καθώς κι ορισμένα απαραίτητα πιστοποιητικά και κλειδιά, θα αποθηκευτούν κάτω από τον κατάλογο /usr/local/etc/openvpn. Αυτός δεν υπάρχει ακόμα γι’ αυτό και τον δημιουργούμε — μαζί με τον υποκατάλογό του ονόματι easy-rsa:

# mkdir -p /usr/local/etc/openvpn/easy-rsa

Μεταβαίνουμε στον /usr/local/etc/openvpn/easy-rsa, αντιγράφουμε εκεί μέσα τον υποκατάλογο 2.0 του /usr/local/share/doc/openvpn/easy-rsa κι αλλάζουμε σ’ αυτόν:

# cd /usr/local/etc/openvpn/easy-rsa
# cp -R /usr/local/share/doc/openvpn/easy-rsa/2.0 .
# cd 2.0

Ανοίγουμε το αρχείο vars με κάποιον text editor (π.χ., με το nano):

# nano vars

Προς το τέλος του αρχείου τροποποιούμε κατάλληλα τις τιμές ορισμένων μεταβλητών, οι οποίες θα χρησιμοποιηθούν κατά τη δημιουργία του πιστοποιητικού (certificate) για τον OpenVPN server. Δείτε, π.χ., ένα παράδειγμα ανάθεσης νέων τιμών:

export KEY_COUNTRY="GR"
export KEY_PROVINCE="Central Macedonia"
export KEY_CITY="Thessaloniki"
export KEY_ORG="Parabing Creations"
export KEY_EMAIL="thevpn@parabing.com"
export KEY_EMAIL=thevpn@parabing.com
export KEY_CN=Parabing
export KEY_NAME=fbsdvpn
export KEY_OU=VPSesRUS

(Τις μεταβλητές PKCS11_MODULE_PATH και PKC11_PIN του vars, τις αφήνουμε ως έχουν.) Αποθηκεύουμε τις αλλαγές στο vars κι εγκαταλείπουμε τον editor. (Στο nano, π.χ., δίνουμε [CTRL+O], [Enter] και μετά [CTRL+X].) Κάνουμε όλα τα αρχεία του υποκαταλόγου 2.0 εκτελέσιμα, εκτός από τα Makefile, README και *.cnf:

# chmod 755 *
# chmod 644 Makefile README *.cnf

Τρέχουμε το vars:

# . ./vars 
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/etc/openvpn/easy-rsa/2.0/keys 

Ωραία. Μπορούμε τώρα να δημιουργήσουμε το ριζικό πιστοποιητικό (root certificate):

# ./clean-all
# ./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) [GR]:
State or Province Name (full name) [Central Macedonia]:
Locality Name (eg, city) [Thessaloniki]:
Organization Name (eg, company) [Parabing Creations]:
Organizational Unit Name (eg, section) [VPSesRUS]:
Common Name (eg, your name or your server's hostname) [Parabing]:
Name [fbsdvpn]:
Email Address [thevpn@parabing.com]:

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

# ./build-key-server fbsdvpn
Generating a 1024 bit RSA private key
...++++++
........++++++
writing new private key to 'fbsdvpn.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) [GR]:
State or Province Name (full name) [Central Macedonia]:
Locality Name (eg, city) [Thessaloniki]:
Organization Name (eg, company) [Parabing Creations]:
Organizational Unit Name (eg, section) [VPSesRUS]:
Common Name (eg, your name or your server's hostname) [fbsdvpn]:
Name [fbsdvpn]:
Email Address [thevpn@parabing.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/local/etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'GR'
stateOrProvinceName   :PRINTABLE:'Central Macedonia'
localityName          :PRINTABLE:'Thessaloniki'
organizationName      :PRINTABLE:'Parabing Creations'
organizationalUnitName:PRINTABLE:'VPSesRUS'
commonName            :PRINTABLE:'fbsdvpn'
name                  :PRINTABLE:'fbsdvpn'
emailAddress          :IA5STRING:'thevpn@parabing.com'
Certificate is to be certified until Aug 20 08:26:16 2022 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

Σε όλες τις ερωτήσεις πατήσαμε απλά το [Enter], αφού οι αναθέσεις τιμών στις μεταβλητές του vars που κάναμε λίγο πριν ήταν ακριβώς αυτές που θέλαμε. Παρατηρήστε επίσης ότι, προς το τέλος της διαδικασίας, δεχθήκαμε την υπογραφή του πιστοποιητικού.

Πριν συνεχίσουμε, δημιουργούμε τις λεγόμενες παραμέτρους Diffie-Hellman. Ουσιαστικά, πρόκειται για μια μέθοδο κατά την οποία δύο συσκευές συμφωνούν σε ένα κοινό μυστικό κλειδί, μέσω ενός επισφαλούς καναλιού επικοινωνίας. Σκεφτείτε, π.χ., ότι με το που αρχίζει ένας client να μιλά με τον OpenVPN server, πριν εγκαθιδρυθεί η μεταξύ τους σύνδεση το κανάλι μέσω του οποίου συνομιλούν δεν μπορεί να θεωρηθεί ασφαλές — και δεν είναι. Η δημιουργία των παραμέτρων Diffie-Hellman είναι τόσο απλή όσο ένα…

# ./build-dh 
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
..................................+............................
..............+................................................
...............................................................
..........................+...+.................+..............
.....................+......++*++*++*

Τα πιστοποιητικά, τα κλειδιά και το αρχείο με τις παραμέτρους Diffie-Hellman που δημιουργήσαμε, βρίσκονται όλα στον υποκατάλογο keys, του /usr/local/etc/openvpn/easy-rsa/2.0. Εκτός από το ca.key, τα αντιγράφουμε στον /usr/local/etc/openvpn κι αλλάζουμε σ’ αυτόν:

# cd keys/
# cp ca.crt fbsdvps.crt fbsdvps.key dh1024.pem /usr/local/etc/openvpn/
# cd /usr/local/etc/openvpn

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

Ρύθμιση OpenVPN και πρώτη εκκίνηση
Αυτή τη στιγμή, τα περιεχόμενα του καταλόγου /usr/local/etc/openvpn πρέπει να είναι κάπως έτσι:

# ls -lh
total 28
-rw-r--r--  1 root  wheel   1.5k Aug 27 11:12 ca.crt
-rw-r--r--  1 root  wheel   245B Aug 27 11:12 dh1024.pem
drwxr-xr-x  3 root  wheel   512B Aug 21 10:53 easy-rsa
-rw-r--r--  1 root  wheel   4.2k Aug 27 11:12 fbsdvpn.crt
-rw-------  1 root  wheel   887B Aug 27 11:12 fbsdvpn.key

Τα ονόματα των δύο τελευταίων αρχείων ενδεχομένως να είναι διαφορετικά στη δική σας περίπτωση, αναλόγως της τιμής που δώσατε στη μεταβλητή KEY_NAME του αρχείου vars, στον κατάλογο /usr/local/etc/openvpn/easy-rsa/2.0. Αντιγράφουμε τώρα εδώ ένα δείγμα του αρχείου ρυθμίσεων του OpenVPN, από τον κατάλογο /usr/local/share/doc/openvpn/sample-config-files/server.conf:

# cp /usr/local/share/doc/openvpn/sample-config-files/server.conf openvpn.conf

Ανοίγουμε το openvpn.conf με έναν text editor, π.χ., το nano:

# nano openvpn.conf

Εντοπίζουμε τη γραμμή cert server.crt και την αλλάζουμε καταλλήλως. Στο παράδειγμά μας, είναι:

cert fbsdvpn.crt

Αλλάζουμε και τη γραμμή key server.key, από κάτω. Παράδειγμα:

key fbsdvpn.key

Αποθηκεύουμε τις αλλαγές κι εγκαταλείπουμε τον editor. Θέλουμε ο OpenVPN server να ενεργοποιείται κατά την εκκίνηση του λειτουργικού συστήματος, επομένως ανοίγουμε το αρχείο /etc/rc.conf και φροντίζουμε ώστε να περιλαμβάνει την ακόλουθη γραμμή:

openvpn_enable="YES"

Αποθηκεύουμε την αλλαγή κι εγκαταλείπουμε τον editor. Πριν ξεκινήσουμε τον OpenVPN server για πρώτη φορά, φροντίζουμε για το logging προσθέτοντας στο αρχείο /etc/syslog.conf τις ακόλουθες δύο γραμμές:

!openvpn
*.* /var/log/openvpn.log

Μετά δημιουργούμε το αρχείο /var/log/openvpn.log

# touch /var/log/openvpn.log

…κι επανεκκινούμε τον syslogd:

# killall -HUP syslogd

Ώρα να ξεκινήσουμε επιτέλους και τον OpenVPN server:

# service openvpn start
Starting openvpn.
add net 10.8.0.0: gateway 10.8.0.2

Ο server λειτουργεί κι αν δώσουμε ένα ifconfig tun0, θα πρέπει να δούμε κάτι σαν αυτό:

# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
	options=80000<LINKSTATE>
	inet6 fe80::a00:27ff:fef2:c9d9%tun0 prefixlen 64 scopeid 0x7 
	inet 10.8.0.1 --> 10.8.0.2 netmask 0xffffffff 
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
	Opened by PID 26211

Το /dev/tun0 είναι το device file του ψευδο-δικτυακού ενδιάμεσου που δημιούργησε το OpenVPN. Για να το πούμε απλά, όλη η επικοινωνία μεταξύ clients και OpenVPN server γίνεται μέσω αυτού του network interface και είναι πλήρως κρυπτογραφημένη.

Πριν κάνουμε την πρώτη μας, απομακρυσμένη σύνδεση στον OpenVPN από κάποιον άλλον υπολογιστή ή laptop, πρέπει να φτιάξουμε ένα σετ κλειδιών για τον client.

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

Δημιουργία κλειδιών για clients
Μεταβαίνουμε στον κατάλογο όπου βρίσκονται τα scripts για τη δημιουργία πιστοποιητικών και κλειδιών…

# cd /usr/local/etc/openvpn/easy-rsa/2.0

…και φτιάχνουμε ένα πιστοποιητικό καθώς κι ένα ιδιωτικό κλειδί για τον client που μας ενδιαφέρει:

# ./build-key client
Generating a 1024 bit RSA private key
.........++++++
........................++++++
writing new private key to 'client.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) [GR]:
State or Province Name (full name) [Central Macedonia]:
Locality Name (eg, city) [Thessaloniki]:
Organization Name (eg, company) [Parabing Creations]:
Organizational Unit Name (eg, section) [VPSesRUS]:
Common Name (eg, your name or your server's hostname) [client]:
Name [fbsdvpn]:
Email Address [thevpn@parabing.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/local/etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'GR'
stateOrProvinceName   :PRINTABLE:'Central Macedonia'
localityName          :PRINTABLE:'Thessaloniki'
organizationName      :PRINTABLE:'Parabing Creations'
organizationalUnitName:PRINTABLE:'VPSesRUS'
commonName            :PRINTABLE:'client'
name                  :PRINTABLE:'fbsdvpn'
emailAddress          :IA5STRING:'thevpn@parabing.com'
Certificate is to be certified until Aug 26 09:56:59 2022 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

Βεβαίως, στη θέση του “client” μπορείτε να βάλετε ένα όνομα περισσότερο χαρακτηριστικό για τον client που έχετε κατά νου. Για άλλη μια φορά, παρατηρήστε ότι σε όλες τις ερωτήσεις αφήσαμε τις προεπιλογές.

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

# mkdir /usr/home/sub0/ovpn-client
# cd keys
# cp ca.crt client.crt client.key /usr/home/sub0/ovpn-client
# ls -lh /usr/home/sub0/ovpn-client
total 16
-rw-r--r--  1 root  sub0   1.5k Aug 28 13:16 ca.crt
-rw-r--r--  1 root  sub0   4.1k Aug 28 13:16 client.crt
-rw-------  1 root  sub0   887B Aug 28 13:16 client.key

Με παρόμοιο τρόπο εργαζόμαστε για να δημιουργήσουμε κλειδιά και για άλλους clients. Τώρα, πριν κάνουμε την πρώτη μας σύνδεση από κάποιον client προς τον OpenVPN server, πρέπει να ετοιμάσουμε κι ένα αρχείο ρυθμίσεων για τον πρώτο.

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

Ρύθμιση client
Ας συνεχίσουμε στα χνάρια του προηγούμενου παραδείγματος, φτιάχνοντας ένα αρχείο ρυθμίσεων για τον client τα κλειδιά του οποίου βρίσκονται στον κατάλογο /usr/home/sub0/ovep-client. Ένα υπόδειγμα αρχείου ρυθμίσεων ονομάζεται client.conf και βρίσκεται στον κατάλογο /usr/local/share/doc/openvpn/sample-config-files:

# cp /usr/local/share/doc/openvpn/sample-config-files/client.conf /usr/home/sub0/ovpn-client

Ανοίγουμε το αντίγραφο που μόλις δημιουργήσαμε με έναν text editor, π.χ., το nano:

# nano /usr/home/sub0/ovpn-client/client.conf

Εντοπίζουμε τη γραμμή

remote my-server-1 1194

κι αντικαθιστούμε το my-server-1 με το δημόσιο IP που έχει το μηχάνημα στο οποίο τρέχει ο OpenVPN server.

Σημείωση. Αν το μηχάνημα βρίσκεται πίσω από κάποιο router (π.χ., περίπτωση οικιακού server ή VM), τότε στη θέση του my-server-1 πρέπει να βάλουμε το δημόσιο IP του router, αυτό δηλαδή που έχει πάρει από τον ISP. Επίσης, θα πρέπει να φροντίσουμε για τον απαραίτητο κανόνα port forwarding στο router, ώστε τα εισερχόμενα πακέτα UDP προς το port 1194 –αυτό χρησιμοποιεί εξ ορισμού το OpenVPN– να ανακατευθύνονται στο ίδιο port του μηχανήματος που τρέχει τον server. Τέλος, επειδή το δημόσιο IP του router κατά πάσα πιθανότητα δεν θα είναι στατικό, κάπου εδώ αποδεικνύεται ιδιαίτερα χρήσιμη μια υπηρεσία dynamic DNS, όπως είναι αυτές που παρέχονται από τις dyn.com, no-ip.com κ.ά.

Σε περίπτωση που πριν λίγο, όταν φτιάχναμε το πιστοποιητικό και το ιδιωτικό κλειδί του client, τους δώσαμε βασικό όνομα διαφορετικό από το “client”, τώρα τροποποιούμε αναλόγως και τις εξής δύο γραμμές του client.conf:

cert client.crt
key client.key

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

# chown -R sub0:sub0 /usr/home/sub0/ovpn-client

Πλησιάζει η στιγμή για την πρώτη σύνδεση στον OpenVPN server του FreeBSD μας. Βεβαίως, αν έχουμε κάποιο firewall ενεργοποιημένο τότε –κατ’ ελάχιστον– πρέπει να φροντίσουμε ώστε να επιτρέπει τις συνδέσεις UDP στο port 1194.

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

Ρύθμιση PF firewall
Ειδικά στην περίπτωση που μιλάμε για VPS, είναι σχεδόν βέβαιο ότι θα έχουμε firewall ενεργοποιημένο. Από τη στιγμή ειδικά που τρέχουμε FreeBSD, το πιθανότερο είναι ότι μιλάμε για το PF. Στα deltaHacker 001 και 002 ο @sonic2000gr έχει δύο άριστα εισαγωγικά άρθρα πάνω στο PF. Διαβάζοντάς τα και παίζοντας λίγο, ο γράφων ρύθμισε το firewall στο VPS του ώστε να δέχεται, μεταξύ άλλων, συνδέσεις για το OpenVPN, αλλά και να επιτρέπει τη δρομολόγηση όλου του traffic των clients — πάντα μέσω του OpenVPN. Ακολουθεί μια ελαφρώς τροποποιημένη (για λόγους ασφαλείας) εκδοχή του pf.conf:

#----- macros -----

ext_if="le0"
ext_ip="1.2.3.4"

vpn_if="tun0"
vpn_net="10.8.0.0/24"

#----- global options -----

set block-policy drop
set skip on lo0

#----- traffic normalization -----

scrub in all fragment reassemble

#----- translation rules (NAT) -----

### we want to route all network traffic though the OpenVPN server
nat on $ext_if from $vpn_net to any -> $ext_if

#----- filter rules -----

block in  log from any to any
block out log from any to any

### allow ICMP (ping)
pass in  quick proto icmp from any to any
pass out quick proto icmp from any to any

### allow outgoing
pass out proto { tcp, udp } from any to any keep state

### allow OpenVPN and SSH
pass in on $ext_if proto udp from any to port 1194 keep state
pass in on $ext_if proto tcp from any to port 22 keep state

### allow traffic on OpenVPN's pseudo-interface
pass quick on $vpn_if

Βεβαίως, στη δική σας περίπτωση το macro ονόματι ext_if πιθανώς να έχει διαφορετική τιμή, ενώ πρέπει φυσικά να φροντίσετε και για την τιμή του ext_ip. Η έξοδος του εργαλείου ifconfig είναι διαφωτιστική.

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

Πρώτη σύνδεση στον OpenVPN server
Πριν απ’ όλα, τα περιεχόμενα του καταλόγου ~/ovpn-client πρέπει να μεταφερθούν με κάποιον ασφαλή τρόπο στον υπολογιστή-πελάτη, δηλαδή στον υπολογιστή από τον οποίο θα συνδεθούμε στον OpenVPN server. Η μεταφορά των σχετικών αρχείων –ή ακόμη καλύτερα ολόκληρου του καταλόγου– είναι δυνατόν να γίνει δικτυακά, μέσω SSH. Ιδού πώς.

Περίπτωση Linux/*BSD/OS X. Αρκεί να χρησιμοποιήσουμε το scp, από ένα παράθυρο τερματικού. Παράδειγμα:

# scp -r sub0@myvpnbox.somewhere.net:~/ovpn-client ~/

όπου στη θέση του myvpnbox.somewhere.net εσείς θα βάλετε είτε το πλήρες όνομα (fully qualified domain name) του FreeBSD box είτε το IP του. Επίσης, στη θέση του “sub0” θα είναι το username του δικού σας χρήστη.

Περίπτωση Windows. Ένα δωρεάν πρόγραμμα που καταλαβαίνει *και* το πρωτόκολλο SSH, είναι το Filezilla. Μ’ αυτό θα ξεκινήσετε μια σύνδεση SFTP (SSH File Transfer Protocol) προς το FreeBSD και θα πάρετε ολόκληρο τον απομακρυσμένο κατάλογο.

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

Περίπτωση Linux/*BSD. Μπορούμε να χρησιμοποιήσουμε το openvpn, από τη γραμμή εντολών. Ανοίγουμε, π.χ., ένα παράθυρο τερματικού, μεταβαίνουμε στον κατάλογο ovpn-client και με δικαιώματα υπερχρήστη δίνουμε κάτι σαν

# openvpn --config client.conf

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

Περίπτωση Windows. Ένα δωρεάν εργαλείο που μπορούμε να χρησιμοποιούμε για τις συνδέσεις μας, είναι το λεγόμενο OpenVPN GUI for Windows. Κατά την εγκατάστασή του τα Windows θα εμφανίσουν προειδοποίηση για άγνωστο εκδότη οδηγών — ή κάπως έτσι, τέλος πάντων. Πείτε τους να ησυχάσουν και ν’ αφήσουν τη διαδικασία να προχωρήσει. Τα αρχεία ca.crt, client.crt, client.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. Το επιλέγουμε και σε ελάχιστα δευτερόλεπτα έχουμε συνδεθεί.

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

Έχουμε συνδεθεί στον OpenVPN server, αλλά αυτός δεν είναι ρυθμισμένος ώστε όλο το network traffic να περνάει μέσα απ' αυτόν.

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

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

Όμως το traffic όλων των άλλων δημόσιων interfaces *δεν* διακινείται μέσω του ασφαλούς αυτού τούνελ. Για παράδειγμα, η ασύρματη κάρτα δικτύωσης με την οποία έχουμε συνδεθεί στο ανοικτό hotspot της πλατείας, αποτελεί ένα δημόσιο network interface κι όλο το HTTP traffic διακινείται μέσω αυτού — όχι μέσω του ασφαλούς tun device. Ιδανικά, αυτό που θα θέλαμε είναι όλο ανεξαιρέτως το network traffic να διέρχεται μέσω του tun device, μ’ άλλα λόγια μέσω του ασφαλούς, κρυπτογραφημένου τούνελ μεταξύ laptop και OpenVPN server. Ευτυχώς κάτι τέτοιο επιτυγχάνεται σχετικά εύκολα. Ας στραφούμε λοιπόν ξανά στον OpenVPN server, ώστε να δούμε πώς ακριβώς.

Θέλουμε κατ’ αρχάς τα DNS queries των OpenVPN clients να απαντώνται από το μηχάνημα του OpenVPN, ώστε κανείς να μη μπορεί να βλέπει ποια sites επισκέπτονται οι clients. Ο μόνος που θα μπορεί να έχει αυτή τη γνώση είναι ο διαχειριστής του FreeBSD box, αλλά αυτός είμαστε εμείς :) Για να πετύχουμε το σκοπό μας, στο FreeBSD εγκαθιστούμε τον DNS server ονόματι dnsmasq:

# cd /usr/ports/dns/dnsmasq
# make install clean

Στο text dialog box που θα εμφανιστεί πριν από τη μεταγλώττιση του dnsmasq, αφήνουμε τις προεπιλογές. Μετά την επιτυχή εγκατάστασή του, ανοίγουμε το σχετικό αρχείο ρυθμίσεων…

# nano /usr/local/etc/dnsmasq.conf

…εντοπίζουμε τη γραμμή…

#listen-address=

…και την αλλάζουμε σε

listen-address=127.0.0.1,10.8.0.1

Με την τροποποίηση αυτή το dnsmasq θα απαντά σε αιτήσεις που προέρχονται από το localhost (το ίδιο το μηχάνημα) κι από το tun device (το ασφαλές τούνελ) — και μόνο από εκεί. Αποθηκεύουμε την αλλαγή κι εγκαταλείπουμε τον editor. Στο /etc/rc.conf προσθέτουμε τη γραμμή

dnsmasq_enable="YES"

ώστε το dnsmasq να ξεκινά αυτόματα, κατά την εκκίνηση του λειτουργικού. Το ξεκινάμε και τώρα, χωρίς reboot φυσικά:

# service dnsmasq start
Starting dnsmasq.

Ξανά στο rc.conf, προσθέτουμε τη γραμμή

gateway_enable="YES"

Χάρη σ’ αυτή, το FreeBSD box θα συμπεριφέρεται κι ως router. Για να ενεργοποιηθεί το routing τώρα, χωρίς επανεκκίνηση του συστήματος, δίνουμε:

# sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1

Προκειμένου να γίνεται η δρομολόγηση όλου του network traffic των clients μέσω του OpenVPN server, χρειάζονται και δύο ακόμη τροποποιήσεις στο αρχείο ρυθμίσεων του τελευταίου. Το ανοίγουμε, λοιπόν…

# nano /usr/local/etc/openvpn/openvpn.conf

…και αρχικά εντοπίζουμε τη γραμμή:

;push "redirect-gateway def1 bypass-dhcp" 

Την αλλάζουμε ώστε να γίνει έτσι

push "redirect-gateway def1"

…κι από κάτω της προσθέτουμε κι αυτή:

push "dhcp-option DNS 10.8.0.1"

Αφού αποθηκεύσουμε τις αλλαγές στο αρχείο ρυθμίσεων του OpenVPN κι εγκαταλείψουμε τον editor, επανεκκινούμε την υπηρεσία πληκτρολογώντας

# service openvpn restart
Stopping openvpn.
Starting openvpn.
add net 10.8.0.0: gateway 10.8.0.2

Χρειάζεται τέλος κι ένας κανόνας NAT (Network Address Translation) για το PF, αλλά αυτόν τον έχουμε προσθέσει ήδη στο /etc/pf.conf (βλ. το παράδειγμα που δώσαμε προηγουμένως).

Αυτό ήταν. Στο εξής, κάθε φορά που θα συνδεόμαστε στον OpenVPN server όλο ανεξαιρέτως το network traffic θα διέρχεται μέσα απ’ αυτόν. Για να ελέγξετε ότι πράγματι συμβαίνει κάτι τέτοιο και στη δική σας περίπτωση, επισκεφτείτε κάποιο από τα sites που δίνουν το δημόσιο IP του υπολογιστή μας, αυτό δηλαδή με το οποίο κυκλοφορεί στο Internet. Παράδειγμα ενός τέτοιου site είναι το http://checkip.org.

Έχουμε συνδεθεί στον OpenVPN server, ο οποίος είναι έτσι ρυθμισμένος ώστε όλο το network traffic να περνάει μέσα απ' αυτόν. Γι' αυτό και φαίνεται να βγαίνουμε στο Internet από την Καλιφόρνια.

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

3 Responses to “OpenVPN στο FreeBSD: Εγκατάσταση και Ρύθμιση”

  1. psychaos | 20/07/2013 at 16:01

    Χρησιμοποιώ το παρακάτω script για το firewall μου, αλλά δυστυχώς σχετικά με την αναδρομολόγηση του traffic έχω θέμα. Συνδέομαι κανονικά στον διακομιστή αλλά δεν μπορώ να σερφάρω στον διαδίκτυο. Τι κάνω λάθος;

    http://pastebin.com/UVEWmzqW

    Ευχαριστώ

    • subZraw | 20/07/2013 at 16:09

      Ομολογώ ότι δεν έχω την πολυτέλεια χρόνου για να μελετήσω το script στο οποίο παραπέμπεις, έριξα όμως μια διαγώνια ματιά και στην αρχή είδα αυτό το

      INET_ADDRESS=”XX.XX.XX.XX”

      Να υποθέσω ότι αυτά τα X αποτελούν δική σου τροποποίηση ή είναι έτσι και στο script;

      Επίσης: Το άρθρο κάτω από το οποίο σχολίασες αφορά στο στήσιμο του OpenVPN στο FreeBSD και το Firewall που χρησιμοποιείται εκεί είναι το PF. Από την άλλη, το script σου αφορά στο Linux και στο iptables.

  2. psychaos | 24/07/2013 at 21:25

    Τα ΧΧΧΧ στοο ΙΝΕΤ ναι εγώ το τροποποίησα, αντί αυτού έχω την πραγματική μου ΙΡ. Έχεις δίκιο λανθασμένο post σε λάθος άρθρο – βασικά αναφερόμουν στον αντίστοιχο άρθρο με το ίδιο θέμα που είχε δημοσιευτεί στο Deltahacker τεύχος 007 (σελ. 13), στο οποίο η αναδρομολόγηση του traffic γινόταν με το iptables. Η αλήθεια είναι ότι το script δεν είναι τόσο μεγάλο όσο φαίνεται, είναι αρκετά commented για μεγαλύτερη σαφήνεια. Θεωρώ τον εαυτό μου αρχάριο όμως για να μπορέσω να κάνω σωστό debugging του εν λόγω script. Εφόσον κάποιος άλλος αναγνώστης μπορεί να βοηθήσει, θα ήταν ευχάριστο.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

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