💾 Archived View for magaz.hellug.gr › 33 › 02_iptun › index.gmi captured on 2024-08-25 at 00:36:57. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-02-05)
-=-=-=-=-=-=-
Τοπογλίδης Κων/νος Ιουν 2003
IP tunnels με απλά λόγια.
1. Εισαγωγή
2. Τα εργαλεία
3. Tunnel με το SSH
4. Vtun - Virtual tunnel
5. FreeS/WAN
6. Επίλογος
Όλοι μας, λίγο πολύ έχουμε ακούσει κάτι για τα IP tunnels και ίσως να έχουμε ακούσει περισσότερα τώρα που υπάρχει και έξαρση με τις wireless συσκευές.
Τα IP Tunnels είναι, με απλά λόγια, μια σύνδεση 2 υπολογιστών μέσω κάποιου ευρύτερου (όχι απαραίτητα) δικτύου όπως το intenet. Όμως διαφέρει από τις υπόλοιπες συνδέσεις γιατί η σύνδεση που δημιουργείται μεταξύ των δύο υπολογιστών έχει κάποιες ιδιότητες. Για παράδειγμα, μπορεί να είναι encrypted ή και να σχηματίζουν ένα τοπικό δίκτυο μεταξύ τους.
Η κυριότερη εφαρμογή - ίσως και ο λόγος που δημιουργήθηκαν - είναι η απομακρυσμένη και ασφαλής σύνδεση ενός υπολογιστή σε ένα εταιρικό τοπικό δίκτυο για να μην υποκλαπούν δεδομένα και η απομακρυσμένη και ασφαλής σύνδεση δύο τοπικών δικτύων, για τον ίδιο λόγο. Οπότε μπορεί κανείς να δει την χρησιμότητα τους στα wireless δίκτυα. Άλλο όνομα για τα IP Tunnels είναι το VPN (δηλαδή Virtual Private Network). Όμως, μπορούν να χρησιμοποιηθούν και για να "προσπεράσει" κάποιος έναν πολύ "αυστηρό" proxy server.
Υπάρχουν αρκετοί τρόποι για να κάνει κάποιος ένα Tunnel. Υπάρχουν αρκετές διανομές που είναι παρακλάδια μικρών διανομών όπως: Wolverine Firewall and VPN Server, Astaro Security Linux που δεν είναι όμως από την άδεια χρήσης GPL. Υπάρχουν και λύσεις όπως της Cisco και άλλων εταιριών, που πωλούν ένα συγκεκριμένο μηχάνημα και συνήθως κοστίζει αρκετά χρήματα ακόμα και για μεσαίες επιχειρήσεις.
Φυσικά όμως, υπάρχουν και αρκετά project τα οποία είναι Free/Open Source κάτω από την GPL άδεια χρήσης. Το άρθρο θα καλύψει μερικά από αυτά όπως: tunnels με το ssh, το vtun, και λιγότερο το FreeS/WAN. Φυσικά υπάρχουν και άλλα projects όπως το OpenVPN, το vpnd, το tinc, το SLAN, το CIPE, το Htun και άλλα.
Το ssh είναι από τα πιο γνωστά πλέον προγράμματα. Είναι για όλους σχεδόν ένα από τα πιο χρήσιμα εργαλεία για remote access. Το αγαπημένο μας ssh μπορεί να κάνει και κάποιες άλλες δουλειές, όπως να κάνει port forwarding ή να γίνει socks 4 proxy, διοχετεύοντας όλο το traffic από το τοπικό μηχάνημα στο απομακρυσμένο.
Για να γίνει το ssh ένας μικρός τοπικός socks 4 proxy το μόνο που έχετε να κάνετε είναι:
ssh -D 1080 my.linux.server.gr
Τώρα όσο είμαστε συνδεδεμένοι στο απομακρυσμένο μηχάνημα my.linux.server.gr θα παρατηρήσουμε και την port 1080 στο μηχάνημά μας να ακούει για συνδέσεις. Το option -D ορίζει πως το τοπικό μηχάνημα θα εξυπηρετεί συνδέσεις στην port 1080. Άρα, αν ρυθμίσουμε τον φυλλομετρητή μας να χρησιμοποιεί proxy ή τον αγαπημένο μας IRC client να χρησιμοποιεί την port 1080 σαν proxy θα παρατηρήσουμε πως όλες πλέον οι συνδέσεις μας περνούν μέσα από το secure shell που έχουμε.
Ένα άλλο option που έχει το ssh είναι να κάνει port forwarding από και προς το απομακρυσμένο μηχάνημα. Εδώ υπάρχουν δύο περιπτώσεις.
Για να γίνει αυτό το μόνο που πρέπει να κάνουμε είναι :
ssh -L 1080:uk.irc.gr:6667 my.linux.server.gr
όπου στην προκειμένη περίπτωση, ανοίγει μια port στο τοπικό μηχάνημα και στο παράδειγμά μας η port 1080 και ότι σύνδεση γίνει εκεί μεταφέρεται αμέσως μέσω του ssh και κάνει σύνδεση στο server uk.irc.gr στην port 6667. Με το συγκεκριμένο παράδειγμα μπορούμε να ανοίξουμε τον αγαπημένο μας IRC Client και να δώσουμε σαν server το local μηχάνημα και port την 1080
/server 127.0.0.1 1080
και να συνδεθούμε στο GRNet και συγκεκριμένα στον server uk.irc.gr. Ομοίως, μπορούμε να κάνουμε το ίδιο και για ένα web site ή ένα ftp server. Προσωπικά βρήκα πολύ χρήσιμο το option αυτό όταν ο διαχειριστής του proxy της εταιρίας σου επιτρέπει να κάνεις ssh άλλα δεν επιτρέπει τις port για να κάνει κανείς IRC.
Αυτό θα ήτανε ιδιαίτερα χρήσιμο αν θέλουμε να συνδεθεί κάποιος προσωρινά στο μηχάνημα μας ή σε κάποιο μηχάνημα στο τοπικό μας δίκτυο. Με την εντολή:
ssh -R 5100:192.168.0.3:80 my.linux.server.gr
ανοίγουμε την port 5100 στο μηχάνημα my.linux.server.gr και του ορίζουμε πως θα ανακατευθύνει ότι συνδέσεις γίνονται εκεί μέσω του ssh στο μηχάνημα 192.168.0.3 και στην port 80 (που είναι οι web υπηρεσίες συνήθως). Έν ολίγοις αν στο μηχάνημα μας 192.168.0.3 έχουμε κάποιο web server όποιος χρήστης πάει να δει το site http://my.linux.server.gr:5100/[1] στην πραγματικότητα θα δει τον web server μας.
1: http://my.linux.server.gr:5100/
Σημείωση: Για να ανοίξουμε ports μικρότερα από την port 1024 θα πρέπει να έχουμε root access στα αντίστοιχα μηχανήματα, δηλαδή στο 3.2.2 πρέπει να έχουμε root access στο απομακρυσμένο μηχάνημα και στην ενότητα 3.2.1 θα πρέπει να έχουμε root access στο μηχάνημα το οποίο βρισκόμαστε.
Σε πολλές περιπτώσεις όμως, για πολλούς και διάφορους λόγους, κάποιος "κακός" διαχειριστής δεν μας αφήνει να έχουμε πρόσβαση με secure shell (ssh), και περνάει όλη την κίνηση του δικτύου προς το Internet από κάποιο proxy. Ευτυχώς όμως υπάρχουν εργαλεία που μας επιτρέπουν να μπορέσουμε να "προσπεράσουμε" τον proxy. Τέτοια εργαλεία είναι: το proxytunnel, το corkscrew, το desproxy, το Http Proxy και άλλα. Ύστερα από αρκετές δοκιμές εμένα μου άρεσε περισσότερο και μου δούλεψε αρκετά έως πολύ εύκολα το proxytunnel που δεν χρειάζεται καν root access, μπορείς να το έχεις στο home directory και υποστηρίζει και proxy authentication.
Μπορείτε να κατεβάσετε το πρόγραμμα από το http://proxytunnel.sf.net/[2] και να το εγκαταστήσετε πολύ εύκολα, είτε να κατεβάσετε binaries. Ίσως η ρύθμισή του να φανεί λιγάκι περίεργη αλλά είναι αρκετά εύκολη. Τα μόνα που έχετε να κάνετε είναι:
Να δημιουργήσετε τον κατάλογο /.ssh στο home directory σας (mkdir /.ssh)
Να δημιουργήσετε το αρχείο config (touch /.ssh/config)
Να επεξεργασθείτε το αρχείο config με τον αγαπημένο σας επεξεργαστή κειμένου (πχ. vi, vim, mcedit, pico, joe ή όποιον προτιμάτε)
και τέλος να προσθέσετε την γραμμή
Host foobar ProtocolKeepAlives 30 ProxyCommand /path/to/proxytunnel -g proxy.customer.com -G 8080 -u user -s password -d my.linux.server.gr -D 443
Όπου:
* proxy.customer.com είναι ο proxy server (μπορεί να χρησιμοποιηθεί και η IP του server)
* 8080 είναι η port του proxy
* user είναι το username που χρησιμοποιείτε για τον proxy
* password είναι το password για τον proxy
* my.linux.server.gr είναι το μηχάνημα στο οποίο θέλετε να συνδεθείτε
* και 443 είναι η port στο μηχάνημα αυτό (η port για το ssh συνήθως είναι η 22, αλλά μπορούμε να "σηκώσουμε" ssh server σε όποια port θέλουμε. Εδώ χρησιμοποιώ την 443 γιατί σε αυτήν την port επιτρέπει ο proxy secure connections, επειδή η 443 είναι η port για https)
Είναι πλέον έτοιμο το proxytunnel να το χρησιμοποιήσετε. Για να το χρησιμοποιήσουμε απλά γράφουμε:
ssh foobar
και το πρόγραμμα κάνει τα υπόλοιπα. Αν όλα πάνε καλά και είναι σωστές οι ρυθμίσεις θα συνδεθεί στο my.linux.server.gr χωρίς κανένα πρόβλημα.
Το vtun είναι ένα πάρα πολύ καλό εύχρηστο και μικρό εργαλείο για την δημιουργία IP tunnel πάνω από ένα ήδη υπάρχον δίκτυο. Υποστηρίζει συμπίεση, κρυπτογράφηση ακόμα και περιορισμό κίνησης (compression, encryption and traffic shaping).
Μπορείτε να κατεβάσετε το vtun από το site http://vtun.sf.net/[3] . Υπάρχει και σαν binary πακέτα, όπως επίσης υπάρχουν και πακέτα για FreeBSD, OpenBSD και Solaris.
Το πρόγραμμα χρησιμοποιείται και σαν server αλλά και σαν client, ανάλογα την ρύθμιση.
Τα λιγότερα πράγματα που θα χρειαστείτε για να γίνει compile είναι:
* Universal TUN/TAP driver http://vtun.sourceforge.net/tun
* OpenSSL encryption library http://www.openssl.org
και optional τα:
* LZO compression library http://www.oberhumer.com/opensource/lzo
Κατά ένα μεγάλο ποσοστό αυτό που θα χρειαστείτε και δεν θα υπάρχει ήδη στην διανομή σας είναι το TUN/TAP Driver, που θα πρέπει να κατεβάσετε και να εγκαταστήσετε.
Εφ' όσον έχουμε όλα τα παραπάνω απλά κάνουμε unzip/untar το αρχείο
tar xzvf vtun-2.6.tar.gz cd vtun ./configure make
και τέλος σαν root για να το εγκαταστήσετε
make install
Την ίδια ακριβώς διαδικασία πρέπει να γίνει και στο μηχάνημα με το οποίο θέλουμε να κάνουμε το IP/Ethernet Tunnel.
Όταν εγκαταστήσουμε πλήρως και στα δύο μηχανήματα το vtun θα παρατηρήσουμε πως στον κατάλογο /etc υπάρχει το αρχείο vtund.conf, που έχει ήδη κάποια παραδείγματα από ρυθμίσεις. Εμείς θα το ρυθμίσουμε από την αρχή. Πρώτα πρέπει να ορίσουμε τα γενικά options:
options { port 5000; # Listen on this port. # Syslog facility syslog daemon; # Path to various programs ppp /usr/sbin/pppd; ifconfig /sbin/ifconfig; route /sbin/route; firewall /sbin/ipchains; ip /sbin/ip; } # Default session options default { compress no; # Compression is off by default speed 0; # By default maximum speed, NO shaping }
Όπου στην αρχή δηλώνουμε ότι ο vtun server "ακούει" στην port 5000 μετά ότι θα χρησιμοποιήσει τον syslog για τα logs και μετά οι τοποθεσίες που βρίσκεται κάθε πρόγραμμα, όπως ο pppd δαίμονας και άλλα προγράμματα που ίσως θα χρειαστούμε και τέλος ορίζουμε τα default options των συνδέσεών μας, για το αν θα έχει ή όχι κρυπτογράφηση ή αν θα έχει όριο στο bandwidth.
Η βασική ρύθμιση για ένα Ethernet Tunnel είναι:
Πρέπει να ορίσουμε ένα όνομα για να αναφερόμαστε στη συγκεκριμένη ρύθμιση μιας και μπορούμε να έχουμε παραπάνω από μία.
alekos {
Μέτα ορίζουμε το password στον server μας
passwd magaz; # Password
Μετά τι τύπος tunnel θα είναι. Εδώ μπορούμε να ορίσουμε είτε ether, είτε tun, είτε tty ή pipe
type ether; # Ethernet tunnel
Ποια συσκευή θα χρησιμοποιήσει (αν δεν κάνετε και 2ο tunnel αφήστε το option ως έχει).
device tap0; # Device tap0
Ποιο πρωτόκολλο θα χρησιμοποιήσει. Αυτό παίζει ρόλο αν είσαστε πίσω από proxy ή όχι. Προτιμήστε το udp αν δεν είσαστε πίσω από proxy, αλλιώς θα πρέπει να χρησιμοποιήσετε το tcp.
proto tcp; # UDP protocol
Αν θέλουμε συμπίεση και σε τι επίπεδο (παίρνει περισσότερη επεξεργαστική ισχύ, αλλά μπορεί να δώσει περισσότερο bandwidth)
# compress lzo:5; # LZO compression level 1
Αν θέλουμε να είναι το tunnel μας κρυπτογραφημένο (καταναλώνει αρκετό bandwidth). Καλό είναι να το έχουμε ενεργοποιημένο, εκτός αν το περνάμε μέσω ssh tunnel, όπου είναι περιττό.
encrypt no; # Encryption
Αν θέλουμε να κρατάει log files στο syslog.
stat yes; # Log connection statistic
Αν θέλουμε να προσπαθεί να κρατάει την σύνδεση ενεργή αν δεν την χρησιμοποιήσουμε για κάποια ώρα. Χρήσιμο αν κάνουμε tunnels μέσω dial-up συνδέσεων ή dial-on-demand συνδέσεων.
keepalive yes; # Keep connection alive
Εδώ ορίζουμε τι θέλουμε να κάνει όταν ανοίξει η σύνδεση μεταξύ server και client.
up { # Connection is Up
Να δώσει μία IP στο μηχάνημα (ορίζω την 192.168.0.1 μιας και είναι ο server)
# Assign IP address ifconfig "%% 192.168.0.1 netmask 255.255.255.0";
Δίνουμε και μία δρομολόγηση (routing) για να ξέρει που πάνε τα IP πακέτα
# Add route to net route "add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.1";
Ενεργοποιούμε το firewall μας για masquerading (αν για παράδειγμα συνδεόμαστε στον server για να έχουμε internet access)
# Enable masquerading for net 10.2.0.0.0/24 # firewall "-A forward -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQ"; };
και τέλος τι κάνουμε όταν κλείνει η σύνδεση
down { # Connection is Down
Κλείνουμε την συσκευή
# Shutdown tap device. ifconfig "%% down";
και απενεργοποιούμε το firewall μας
# Disable masquerading for net 10.2.0.0.0/24 # firewall "-D forward -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQ"; }; }
Πάμε στο μηχάνημα που θα είναι ο client στο tunnel μας. Πάλι στον κατάλογο /etc θα βρούμε το αρχείο vtund.conf . Οι ρυθμίσεις που θα μπουν εδώ θα πρέπει να είναι αντίστοιχες με τον server αλλά όχι ίδιες. Οπότε:
options { port 5000; # Connect to this port. timeout 60; # General timeout # Path to various programs ppp /usr/sbin/pppd; ifconfig /sbin/ifconfig; route /sbin/route; firewall /sbin/ipchains; ip /sbin/ip; }
Όπως και πριν, το πρώτο option αναφέρεται στο port που θα συνδεθεί στον server, το timeout για να κλείσει την σύνδεση και τέλος τα διάφορα προγράμματα.
Και οι ρυθμίσεις που θα πρέπει να κάνουμε για την αντίστοιχη σύνδεση στον server. Οι ρυθμίσεις είναι στο ίδιο μοτίβο:
Το όνομα της ρύθμισης για να αναφερόμαστε σ' αυτήν
alekos {
Το password που έχουμε ορίσει στον server
passwd magaz; # Password
Τι τύπος tunnel θα είναι πρέπει να είναι ίδιο με τον server
type ether; # Ethernet tunnel
Ποια συσκευή να χρησιμοποιήσει, αφήστε το default εκτός και αν θέλετε να κάνετε πάνω από ένα tunnel
device tap0; # Device tap0
Τι θα κάνει όταν γίνει η σύνδεση
up { # Connection is Up
Πρέπει να ορίσουμε μία IP αλλά φυσικά όχι ίδια με τον server εδώ ορίζουμε την IP 192.168.0.2
# Assign IP address and netmask. ifconfig "%% 192.168.0.2 netmask 255.255.255.0";
Ορίζουμε και την δρομολόγηση (routing) για τα IP πακέτα
route "add default gw 192.168.0.1"; };
Τι να κάνουμε όταν κλείσει η σύνδεση
down { # Connection is Down
Να κλείσει την συσκευή.
# Shutdown tap device ifconfig "%% down"; }; }
Και στον client θα μπορούσαμε να ανοίγουμε και να κλείνουμε κάποιο firewall αν θέλαμε να περάσουμε μέσω του tunnel κίνηση (traffic) μεταξύ δύο τοπικών δικτύων. Περισσότερα παραδείγματα θα βρείτε και στο site του vtun αλλά και στα configuration files (στο /etc/vtund.conf) που καλύπτουν σχεδόν κάθε περίπτωση IP/Ethernet tunnel.
Αφού ρυθμίσαμε και τον vtun server μας αλλά και τον client, ήρθε η ώρα να ενεργοποιήσουμε το tunnel που ρυθμίσαμε.
Από τον server σαν root λοιπόν, δίνουμε την εντολή:
vtund -s alekos
Όπου -s είναι το option για τρέξει τον server και να περιμένει για συνδέσεις, και alekos είναι το όνομα της ρύθμισης που κάναμε στο server. Τώρα ο server μας λειτουργεί και περιμένει να συνδεθούμε.
Οπότε, πάμε στο client και πάλι σαν root δίνουμε την εντολή:
vtund alekos my.linux.server.gr
Αν όλα έχουν πάει καλά και οι ρυθμίσεις μας είναι σωστές μπορούμε να δούμε αν έχει πραγματοποιηθεί το IP tunnel μας με την εντολή:
/sbin/ifconfig
Όπου θα δούμε κάτι σαν:
tap0 Link encap:Ethernet HWaddr 00:FF:AE:E8:EC:85 inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:432204 errors:0 dropped:0 overruns:0 frame:0 TX packets:151242 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:612105831 (583.7 Mb) TX bytes:9998554 (9.5 Mb)
Επιτυχώς λοιπόν έχουμε φτιάξει το πρώτο μας IP Tunnel!
Φυσικά υπάρχει η περίπτωση να είμαστε πίσω από κάποιον proxy που δεν μας επιτρέπει να κάνουμε IP Tunnels. Η γνώση και οι δοκιμές που περιέχονται σε αυτό το άρθρο αποκτήθηκαν στην προσπάθεια να "προσπεράσουμε" κάποιον proxy server που δεν μας επέτρεπε να κάνουμε σχεδόν τίποτα. Η λύση λοιπόν είναι η εξής:
Κάνουμε όλα τα configurations και όλες τις ρυθμίσεις μας για το tunnel με το vtun. Επίσης ρυθμίζουμε το proxytunnel όπως περιγράφετε στο πρώτο μέρος και πρώτα κάνουμε ένα ssh tunnel κάνοντας forward το port 5000 από το τοπικό μας μηχάνημα στο server. Παράδειγμα:
Έστω πως το proxytunnel δουλεύει κανονικά για να κάνουμε και IP Tunnel δίνουμε:
ssh -L 5000:127.0.0.1:5000 foobar <verb> Οπότε και ανοίγουμε μία σύνδεση με το μηχάνημα που θέλουμε να κάνουμε IP Tunnel οπότε δίνουμε την εντολή: <verb> vtund alekos 127.0.0.1
και το tunnel σας λειτουργεί.
Το FreeS/WAN είναι ένα πρόγραμμα που υλοποιεί το IPSec πρωτόκολλο. Το IPSec δεν είναι τίποτα άλλο παρά Security for the Internet Protocol, δηλαδή είναι η επέκταση ασφαλείας του απλού IP πρωτοκόλλου. Εν ολίγοις είναι ένα τυποποιημένο πρωτόκολλο που θα είναι μέρος της έκδοσης του Internet Protocol v6 (IPv6). Αυτό σημαίνει πως το IPSec είναι συμβατό και με άλλες εμπορικές εφαρμογές, όπως τα VPN clients της Cisco και τα hardware firewalls (PIX) της Cisco. Με το IPSec μπορούμε να δημιουργήσουμε VPN (Virtual Private Network), που είναι ακριβώς ίδιο με στην γενική ιδέα με το vtun αλλά τα tunnels που δημιουργούνται είναι κρυπρογραφημένα και εξακριβωμένα (encrypted and authenticated). Που σημαίνει πως κάθε πακέτο που ανταλλάσσεται μεταξύ των δύο μηχανημάτων, ελέγχεται πρώτα για να διαπιστωθεί αν είναι εξακριβωμένος (authenticated) ο αποστολέας και το πακέτο μετά μεταδίδεται μέσω του κρυπτογραφημένου tunnel ώστε να μην υποκλαπεί. Ένα μεγάλο μειονέκτημα που έχει το FreeS/WAN όμως είναι ότι είναι αρκετά περίπλοκο στην εγκατάστασή του, μίας και απαιτεί μερικές αλλαγές στην ρύθμιση του πυρήνα. Το δύσκολο κομμάτι δεν είναι στο να τα εγκαταστήσει τα επιπλέον κομμάτια, αλλά να γίνουν compile σωστά. Το άρθρο αυτό δεν θα αναφερθεί παραπάνω στο FreeS/WAN ακόμα. Όποιο θα θέλανε να το δοκιμάσουν μπορούνε να βρούνε αρκετά πακέτα σε binary μορφή και οδηγίες από το site του FreeS/WAN, http://www.freeswan.org[4] . Τέλος να αναφέρω πως υπάρχουν μερικές διανομές που περιλαμβάνουν το FreeS/WAN στα CD τους. Τέτοιες διανομές όπως:
Η δημιουργία και η υλοποίηση ενός IP Tunnel δεν είναι κάτι δύσκολο, ούτε κάτι το οποίο απαιτεί "ειδικές" γνώσεις και είναι αρκετά χρήσιμο σε πολλές περιπτώσεις. Ανάλογα και την περίπτωση το κάθε πρόγραμμα έχει τα αρνητικά και τα θετικά του στοιχεία. Το καλό όμως, είναι πως υπάρχουν αρκετά Free/Open Source