A lot of home broadband plans in Australia do not offer a fixed IP address (I am not sure about plans in other countries). This can be troublesome if you want to get remote access to your home PCs with something like TightVNC or if you want to serve a little web page off of your home computers. It can also be a pain in the ass if you want to lock down access to remote servers based on IP address. I’ve worked up a little system of my own than allows me to work out what the currently assigned IP address is for my modem at home regardless of where I am in the world. Doing the same yourself is surprisingly simple. All you need is:
- A home based server running PHP that can run timed jobs with CRON or some equivalent windows based program.
- A remote web server running PHP.
The system uses three php files and one text file.
File 1 : check-and-update-ip.php
The first, which I’ll call check-and-update-ip.php resides on your local home server and is executed periodically either with CRON or some equivalent windows program. I’ve got my file to run every 30 minutes, so worse case if I need to access my home network and the assigned IP address has just changed I’ll have to wait a maximum of 30 minutes for the update. Here’s the contents of check-and-update-ip.php
<?php // check-and-update-ip.php // // This file calls a file on the remote server which returns the $_SERVER['REMOTE_ADDR'] value. // This value is compared with a stored value and if different written back to a stored value $remote_host="http://remote-host-address.com/file-location"; $current_remote_ip=file_get_contents($remote_host."/remote-ip.php"); $last_remote_ip=file_get_contents($remote_host."/last-ip.txt"); if ($current_remote_ip<>$last_remote_ip) { echo $remote_host."/write-ip.php?ip=".$current_remote_ip; $write_ip=file_get_contents($remote_host."/write-ip.php?ip=".$current_remote_ip); echo $write_ip; } else { echo "external ip address has not changed since last check"; } ?>
This file gets the returned contents of remote-ip.php from the remote server. This file simply returns the super global $_SERVER[‘REMOTE_ADDR’], compares it with the remotely stored contents of last-ip.txt and if different calls write-ip.php to record the change.
File 2: remote-ip.php
This file resides on the remote web server and contains just one line of PHP.
<?php // remote-ip.php // // This file simply echoes back the remote client IP echo $_SERVER['REMOTE_ADDR']; ?>
Of course this is just echoing back the client address, which in this case happens to be the IP address assigned to my home router by my ISP.
File 3: write-ip.php
This file is responsible for writing IP address changes to last-ip.txt.
<?php //write-ip.php // //This file takes one parameter in correct IP format and writes it to a text file. Incorrect parameter formats are rejected. if (isset($_GET['ip'])) $new_ip=trim($_GET['ip']); else { echo "no IP parameter"; die(); } if (strlen(trim($new_ip))==0 || strlen($new_ip)>15 ) { echo "invalid IP parameter"; die(); } $quartet_array=explode(".",$new_ip); if (count($quartet_array)!=4) { echo "invalid IP parameter"; die(); } if (!is_numeric($quartet_array[0]) || !is_numeric($quartet_array[1]) || !is_numeric($quartet_array[2]) || !is_numeric($quartet_array[3])) { echo "invalid IP parameter"; die(); } $file_name="/server/path/to/last-ip.txt"; $file_handle=fopen($file_name,'w') or die('cannot open file'); $contents=$new_ip; fwrite($file_handle,$contents); fclose($file_handle); echo $new_ip. " written to last-ip.txt"; ?>
This script expects one parameter in normal 4 quartet IP address format (XXX.XXX.XXX.XXX). Any other parameter format is rejected. If the parameter format is correct then the parameter is written to last-ip.txt.
File 4: last-ip.txt
This simple text file is an empty text file that can be uploaded to your remote server. You’ll need to chmod 777 it to make it writeable by write-ip.php. And finally we get to useful bit, it’s this file that you can access from any web browser by typing the file location into your browser, something like:
http://www.remote-host-address.com/path/to/last-ip.txt
And hey presto you’ll see the IP address of your modem at home. You can then use that IP in your remote desktop tool, or just type it into your browser if you’re hosting a website from home. I also use the text file as an include in other remote PHP files to provide IP based exceptions.