Public IP – Ένα TLD μόνο είναι αρκετό || Raspi server
Απλώνοντας τους server μου στην υφήλιο και έχοντας ένα μόνο tld (το παρών δηλαδή) είχα ένα πρόβλημα για το πως θα βρίσκω τους server μου εφόσον όπως ξέρουμε πέφτουν τα modem, κόβεται ουκ ολίγες φορές το ρεύμα κτλ.
Άς το πάρουμε από την αρχή. Στήνουμε τον server μας. Του δίνουμε μια σταθερή IP από το modem/router μας και ανοίγουμε πόρτες. (προσωπικά δεν βάζω DMZ στο router ούτως ώστε να διαχειρίζομαι όλες τις πόρτες από το firewall του linux. Χρησιμοποιώ και τα 2 firewall με γενικό κανόνα να αποκλείουν τα πάντα. Έτσι μπορώ να ρυθμίσω εγώ ποιες πόρτες και μόνο θα είναι ανοιχτές και τι traffic θα πηγαινοέρχεται)
Μετά: Τι έχω; Ένα tld. Είναι αρκετό για να κάνω τη δουλεία μου. Ανά πάσα στιγμή ξέρω την πόρτα του service που θέλω χρησιμοποιήσω, ξέρω τους κωδικούς και έχω τα keyfiles. Άρα το μόνο που λείπει είναι η IP που μπορεί να έχει αλλάξει για τους λόγους που είπαμε παραπάνω.
Λοιπόν. Αυτό που κάνω είναι να στέλνω ένα post request σε μια σελίδα στον server που έχει tld με ένα απλό και μη ενεργοβόρο python script. (μπορεί να είναι ένα sub-domain..το προτιμώ είναι η αλήθεια) Η σελίδα σε php δέχεται μόνο POST requests και δεν τυπώνει τίποτα στην οθόνη. Το μόνο που κάνει είναι να βάζει την IP σε ένα αρχείο .txt (που παρεμπίπτοντος δεν μπορεί να διαβαστεί από τον έξω κόσμο — a.k.a. .htaccess file) και μόνο αν η προηγούμενη IP δεν είναι η ίδια με αυτή που πήρε από την POST request.
Το post request που θα γίνεται από το python script μπορεί αν είναι ένας αριθμός ένα string ή ακόμα θα μπορούσε να διαβάζει και ένα αρχείο με κλειδιά που θα είχαμε φτιάξει. Το θέμα είναι να έχει μια παράμετρο τουλάχιστον για να είναι ακόμα ποιο δύσκολο κάποιος να κάνει μια απλή post και να περάσει τη δική του IP.(και με μια προκαθορισμένη τιμή παραμέτρου εννοείτε)
Αυτό το python script εκτελείτε σε ένα προκαθορισμένο χρόνο από το cron.(εμένα μου αρέσει να είναι κάθε 15sec) Στη χειρότερη περίπτωση δηλαδή θα περιμένουμε μόνο 15 δευτερόλεπτα για να δούμε την IP.
Τέλος μπορούμε να παρουσιάσουμε και την IP σε κάποια σελίδα στον server με το tld απλά διαβάζοντας τον αρχείο .txt που δημιούργησε το script πριν από λίγο. Αλλά δεν την παρουσιάζουμε όπως μας την έχει δώσει ο server μας. Μπορούμε επίσης να την κωδικοποιήσουμε με κάποιο τρόμο. Π.χ. να πολλαπλασιάζουμε όλα τα ψηφία με έναν προκαθορισμένο αριθμό ή ακόμα και μια απλά πρόσθεση. It’s up to you to make your cipher!
Ας αρχίσουμε με το python script που θα τρέχει στο σπίτι:
import urllib
import urllib2
url = 'http://eyrhka.gr/post.php'
values = {'param':'value'}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
Το προσθέτουμε και ως cron job και είναι έτοιμο! Προχωράμε τώρα για να φτιάξουμε το php αρχείο που θα δέχεται αυτή την post.
<?php
$value = "preshared_key";
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(isset($_POST['param']) && $_POST['param'] == $value){
$ip_address = $_SERVER['REMOTE_ADDR'];
$file = 'ipstext.txt';
$handle = fopen($file, "a+");
$last_ip = shell_exec('tail -2 ./ipstext.txt');
$last_ip = trim($last_ip);
if($ip_address != $last_ip){
fwrite($handle, $ip_address ."\n");
}
fclose($handle);
}
}
header('Location: http://eyrhka.gr' );
?>
Και ακολουθεί και το τελευταίο μέρος που δείχνουμε την IP στην index.php. Καλό είναι όπως είπα και παραπάνω πρέπει να χρησιμοποιήσετε κάποιο είδος κωδικοποιήσεις ούτος ώστε να μην γίνεται στόχος διάφορων bot που μπορούν εύκολα να ρίξουν το internet και ειδικότερα το σύστημα του Raspi που χρησιμοποιώ.
<?php
$last_ip = shell_exec('tail -2 ./ipstext.txt');
$last_ip = trim($last_ip);
echo $last_ip;
?>
Επιπλέον αυτό είναι προστασία από τα free-domains που όπως έχω παρατηρήσει γίνονται πολύ ποιο συχνά στόχος επιθέσεων.
Τελικά όλο αυτό θα μπορούσε να λειτουργήσει σαν accessor (που λέμε και στις κλάσεις ^_^ ) για το τοπικό δίκτυο. Θα μπορούσε π.χ. να φαίνεται ότι η σελίδα είναι στο eyrhka.gr αλλά στην πραγματικότητα να σερβίριζόταν από το Raspi.