IP over DNS How To
To howto αυτό θα μας δείξει πως να δρομολογήσουμε δεδομένα IP (TCP, UDP κτλ) "πάνω" ή καλύτερα μέσα σε DNS δεδομένα τύπου ΤΧΤ. Με απλά ελληνικά: πως θα πάρω πρόσβαση στο internet από εκείνο το wifi hotspot στο πλοίο (ή το αεροδρόμιο ή οπουδήποτε έχουν το θράσος να χρεώνουν γι' αυτό το απαραίτητο αγαθό της ζωής!)
Συστατικά:
- Ένα linux laptop σε τοποθεσία με επί-πληρωμή wifi. Κατα προτίμηση με κάτι debian based. Εγώ το έκανα με Ubuntu
- Ένας linux server
- Ένα domain που να μπορούμε να επεξεργαστούμε τα subdomain του
- Το nstx λογισμικό (debian πακέτο nstx) website
Βασική ιδέα
Η βασική ιδέα πίσω από το όλο εγχείρημα είναι η εξής. Βρισκόμαστε σε ένα χώρο με wifi hotspot στο οποίο μπορούμε να συνδεθούμε, παίρνουμε IP και μόλις ζητήσουμε ένα site αντί για το site εμφανίζεται μία ωραία σελίδα που σου λέει να βάλεις τον κωδικό σου. Σε αυτές τις περιπτώσεις συνήθως επιτρέπεται να κάνεις ping ή/και dns queries χωρίς πρόβλημα. Οπότε αμέσως το διαβολάκι πάνω από τον αριστερό σου ώμο σε ρωτάει: "Δεν είναι δυνατόν να δρομολογήσουμε κάπως δεδομένα IP "πάνω" από ICMP (ping) ή DNS?" Φυσικά και είναι δυνατόν.
Σε δύο εγκαταστάσεις με αυτό το σύστημα που έχω δει, επιτρέπουν και οι δύο ping και dns δεδομένα χωρίς να τα φιλτράρουν (τα dns φυσικά μόνο προς τον δικό τους dns server). Δυστυχώς όμως οι λύσεις IP over ICMP (παρόλο που υπάρχουν πολλές στο google και το ptunnel σε πακέτο στο ubuntu) δεν έπαιξαν επειδή έπαιρνες εσωτερικό IP και είχες πρόσβαση στο δίκτυο μέσω NAT. Οπότε κάπου κόλλαγε η διαδικασία.
Απορρίπτουμε λοιπόν το IP over ICMP και πάμε στο πιο δύσκολο στο set-αρισμα, αλλά πολύ πιο πιθανό να παίζει εάν όχι σε όλες, τουλάχιστον στις περισσότερες εγκαταστάσεις τέτοιου τύπου IP over DNS. Με απλά λόγια αυτό που κάνουμε είναι ο εξής, δημιουργούμε ένα κανάλι δεδομένων στο οποίο αποστέλλουμε πληροφορία κωδικοποιημένη στο subdomain για το οποίο ζητάμε πληροφορίες και λαμβάνουμε πληροφορία κωδικοποιημένη στο TXT πεδίο της DNS απάντησης. Δηλαδή όταν ζητάμε να μάθουμε για το domain jsKsje38.tunnel.foo.gr στην ουσία λέμε στην άλλη μεριά του καναλιού ssh root@1.2.3.4 και η απάντηση μας έρχεται ο DNS πληροφορία κ.ο.κ.
Για να παίξει αυτό θα πρέπει να κάνουμε ρυθμίσεις στο dns server που διαχειρίζεται το domain μας foo.gr, να έχουμε ένα άλλο μηχάνημα που να μην τρέχει DNS για να τρέξουμε τον nstx server που πρέπει να καταλαβαίνει τι του στέλνουμε και να μας απαντά κατάλληλα (έστω ότι έχει την IP 1.2.3.4) και φυσικά να ρυθμίσουμε το nstx client στο laptop.
DNS site:
Έστω ότι έχουμε το domain foo.gr, θα πρέπει να δημιουργήσουμε δύο νέες καταχωρήσεις στο dns server μας τύπου
tunnel.foo.gr. 1 IN NS ntunnel.foo.gr.
ntunnel.foo.gr. 1 IN A 1.2.3.4
Όπου tunnel.foo.gr είναι το domain που θα χρησιμοποιήσουμε ως tunnel για να μεταφέρουμε τα ΤΧΤ δεδομένα μας και πληροφορίες για το domain αυτό θα μας δίνει ο ntunnel.foo.gr nameserver που ακούει στην διεύθυνση 1.2.3.4.
TIP: Για να λειτουργήσει το σύστημα δεν θέλουμε αναγκαστικά δύο μηχανήματα. Μπορούμε να δώσουμε σε μία κάρτα δικτύου δύο διαφορετικά (ή και παραπάνω IP) χρησιμοποιώντας IP aliasing. Φυσικά πρέπει να έχουμε δύο διαφορετικά public IP. Στο παράδειγμά μας έχουμε τα IP 1.2.3.3 (o dns server μας) και το 1.2.3.4 (o nstx server μας).
Server side:
Χρησιμοποιούμε το ip aliasing για να δημιουργήσουμε το interface eth0:1 με την διεύθυνση 1.2.3.4
ifconfig eth0:1 1.2.3.4 netmask 255.255.255.0 up
Κατεβάζουμε το nstx
apt-get install nstx
To nstx χρησιμοποιεί το αρχείο /etc/default/nstx για την ρύθμισή του, αλλά κάτι πήγαινε στραβά με αυτό και το έτρεξα με το χέρι.
Τρέχουμε το nstx server
nstxd -i 1.2.3.4 tunnel.foo.gr
Όπου -i σημαίνει να ακούει μόνο στην διεύθυνση 1.2.3.4 (στην διεύθυνση 1.2.3.3 έχουμε τον πραγματικό DNS) και να επεξεργάζεται δεδομένα του domain tunnel.foo.gr.
Επίσης δημιουργούμε το interface που θα χρησιμοποιήσει το nstx server για να μεταφέρει δεδομένα
modprobe tun
ifconfig tun0 10.0.0.1 netmask 255.0.0.0 up
Τέλος θέλουμε ότι δεδομένα φτάνουν στο tun0 interface (δηλαδή δεδομένα από τον nstx server) να μπορούν να έχουν πρόσβαση στο net, οπότε θα χρησιμοποιήσουμε IP Masquarate για να τα δρομολογήσουμε μέσω του interface eth0 που έχει πρόσβαση στο διαδίκτυο.
Εγκαθιστούμε το iptables και κάνουμε τις κατάλληλες ρυθμίσεις
apt-get install iptables
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
iptables -I FORWARD -j ACCEPT -s 10.0.0.0/8
echo "1" >> /proc/sys/net/ipv4/ip_forward
Συνοψίζουμε: Όποιος ζητήσει πληροφορίες για το domain tunnel.foo.gr θα μάθει ότι ο nameserver του tunnel.foo.gr είναι το ntunnel.foo.gr που ακούει στην διεύθυνση 1.2.3.4. Άρα θα στείλει τον DNS server στην διεύθυνση 1.2.3.4 δηλαδή τον nstx server δεδομένα, τα οποία το nstx τα μεταφράζει σε χρήσιμα δεδομένα και τα δρομολογεί στο interface eth0.
Client side:
Έχουμε συνδεθεί στο δίκτυο και έχουμε IP. Πρέπει να μάθουμε μερικά πράγματα για το δίκτυο που βρισκόμαστε. Πρώτα το IP του dns server που πρέπει να χρησιμοποιούμε. Βρίσκεται στο αρχείο /etc/resolv.conf . Δεύτερον το IP του gateway που έχουμε τώρα.
H καταχώρηση στο route table με flags UG είναι το gateway μας
route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
xx.xx.xx.xx 0.0.0.0 255.255.255.248 UG 0 0 0 eth0
Κατεβάζουμε το nstx (το έχουμε από πριν! θυμάστε ότι δεν έχουμε πρόσβαση εδώ που βρισκόμαστε!)
apt-get install nstx
Και το εκτελούμε
nstxcd tunnel.foo.gr <ip dns server που πρέπει να χρησιμοποιούμε>
Δημιουργούμε το interface για το nstxcd
modprobe tun
ifconfig tun0 up 10.0.0.2 netmask 255.255.255.0
Και τώρα πρέπει να ορίσουμε ως νέο default interface το tun0 και να δρομολογούμε από το παλιό μόνο τις αιτήσεις DNS.
route del defautl
route add default gw 10.0.0.1 tun0
route add -host gw dev eth1
To eth1 είναι το wifi device στο laptop. Σε άλλους μπορεί να είναι wlan.
Voila! Τώρα όλα τα δεδομένα δρομολογούνται μέσω του tun0 μεταφράζονται σε dns queries κ.ο.κ. και εσύ απολαμβάνεις internet access χωρίς να πληρώνεις 10 ευρώ τα 15' λεπτά! (ναι για τέτοιες τιμές μιλάμε!)
Τελικές παρατηρήσεις:
Δεν ξέρω για άλλους χώρους, αλλά στα πλοία η πρόσβαση στο Inet πέρα από πανάκριβη είναι και τόσο ασταθής και αργή που ουσιαστικά δεν μπορεί να χρησιμοποιηθεί. Προσωπικά κατάφερα μερικά ssh connections (για web ούτε για αστείο) χρησιμοποιώντας συμπίεση και ssh version 1 (δεν ξέρω γιατί αλλά έπαιζε καλύτερα από το δύο. μάλλον λιγότερα δεδομένα
και αυτές δεν διαρκούσαν παραπάνω από 1-2 εντολές, εάν έφταναν μέχρι εκεί.
Κανω την πτυχιακη μου πανω σε IP-OVER-DNS. Εχω πετυχει bidiretional συνδεση. Δοκιμασα web ssh scp και ολα παιζουν χωρις να χαλαει κατι. Δεν ακολουθησα το μοντελο του TXT αλλα μεταφερω τα data απο τον server με NULL Type.
Αν σας ενδιαφερει κατι ρωτηστε με.
Ευχαριστώ
Έχω καιρό να ασχοληθώ με το αντικείμενο και πλέον -ευτυχώς για μένα- έχω περιορίσει τα ταξιδια με πλοία. Θα είχε όμως πολύ ενδιαφέρον να γράψεις ένα μικρό γρήγορο tutorial για το πως θα μπορούσαμε να το χρησιμοποιήσουμε με τα linux box μας. Ευχαριστώς θα το δημοσίευα και στο blog μου φυσικά. Καλή πτυχιακή!
Συγνωμη για την αργοπορημενη απαντηση.
Εχω τελιωσει την πτυχιακη εχοντας φτιαξει δυο εφαρμογες μια για windows και μια για windows mobile. Στην σελιδα μου εχω οτι χρειαζεται και σε λιγο καιρο θα ανεβασω και το ebook της εργασιας.
http://www.it.teithe.gr/~kontam/wiod
Κώστα συγχαρητήρια για την δουλειά!
Περιμένουμε και το ebook.
Ετοιμο το ebook για download. Οτι διορθωσεις καλοδεχουμενες.
Δυστυχως το link του “Kostas” δεν λειτουργεί… έχει περάσει καιρός ίσως γι αυτό.
Ψαχνω πληροφορίες για Ip over DNS σε windows.. (HOW TO)
το προγραμματακι που δουλευω είναι το Iodine..
(έχει δοκιμασει κανεις να το τρέξει σε VMWARE???)
Seadog μπορεις να μου δωσεις καποιο στοιχειο επικοινωνίας (e-mail ) με τον Kostas???
thanks in advance!!
που θα βρω το ebook??
Δυστυχώς δεν έχω επαφή ούτε με τον Κώστα, ούτε γνωρίζω που μπορείς να βρεις το ebook.
Είμαι στη δουλειά και είδα το blog σου (αφού έλαβα το mail σου). Καταρχήν με έστειλες, γιατί είναι τελείως τρελό το όλο πράγμα. Κατά δεύτερον με έσκισες, γιατί έχει πέσει πολύ δουλειά και ταυτόχρονα προσπαθώ να καταλάβω πως ακριβώς το έχεις κάνει (προφανώς δεν μπορώ να το δοκιμάσω γιατί εδώ δουλεύουμε με win) και έχω θολώσει. Οπότε ανέμενε ερωτήσεις (ας πρόσεχες
)
Για να δοκιμάσουμε τα διάφορα σεταρίσματα, πρέπει να βρούμε κάποιο δημόσιο χώρο ή είναι εύκολο να αναπαράγουμε τις συνθήκες στο σπίτι;
Τέλος, για την περίπτωση που δεν το ξέρεις, πέρα από τα πλοία τέτοιες εγκαταστάσεις υπαρχουν στα διάφορα νησιά του Αιγαίου για την εξυπηρέτηση των τουριστών (με άθλιες γενικά τιμές). Ως εκ τούτου η εφαρμογή σου μπορεί να φανεί πολύ χρήσιμη (αν καταφέρω τελικά να ρυθμίσω κάποια στιγμή το laptop του σπιτιού).