SSH Tunneling and Proxy Configuration on Linux

So I’ve spent quite a while trying to make this work and wanted to document it for others to use.  What this is going to do is allow you to proxy you web traffic through a server using SSH.  In the case of my setup it will be Linux on both ends (server running CentOS and PC running Mint).  Alright so let’s get started.

You will really only need two parts for this, a server (or VPS) running Linux with SSH enabled and a Linux computer. 

First you need to establish the SSH tunnel to the server using the D flag to bind to an address.  We will also be enabling compression which is the C flag:

ssh -D 8080 -C user@server.example.com

Obviously you will need to replace “user” with your username and “server.example.com” with your servers address.  It will prompt you for the password after you hit enter.

You now have the needed tunnel established to the server.  You have two options at this point, either configure Firefox alone to use the proxy or setup the system for the proxy.  If you are wanting only to proxy Firefox take a look here.   You will want to only fill in the SOCKS proxy with 127.0.0.1 and a port of 8080.

If you want to setup the proxy for the entire system you need to go to menu->preferences->network.  Scroll to the bottom and choose network proxy.  Fill in the SOCKS host with 127.0.0.1 and port with 8080 and turn it on.

You are set to go!  You will now have your traffic tunneled through the server.  Enjoy!

Migrating websites between Virtual Private Servers

So I recently found myself needing to move websites from one VPS to another.   In this case it was the same provider but different datacenters within the US.  While I was contemplating options I discovered a few rather simple tricks and thought I would share them here.  My research didn’t turn up any complete post on migrations (though a few came close) and I wanted a somewhat comprehensive guide.  As always this advice is given AS-IS and I cannot be held responsible if you destroy your data, bork your servers, or get your account suspended by your host.

Anyway let’s get started.  This post assumes you are moving between similar platforms and architectures.  I’m going from CentOS 6 to CentOS 6 both are x64 platforms.  If you are trying to migrate between dissimilar platforms (Debian to CentOS) or architectures (x86 to x64) there is a good chance these instructions will not work.  I’m also assuming you have installed all the correct packages on your new server.  You can do a “yum list installed” in your source server to see what all you have installed.

The first step is an initial sync of your files.  Depending on the size of your web root and the server’s Internet connections this might take a while.  I suggest you start this before bed then check it in the morning.  There is no need to worry if it fails as we will be running this  multiple times.  We are going to use rsync for the entire file sync process.  The command you need to run is:

rsync -avzhe ‘ssh -p 22222’ root@OLD.HOST:/var/www/ /var/www/

This command needs run from the DESTINATION SERVER.  If you are looking into the specifics of the rsync command please see here.  The only thing I will note is the number after the -p is the SSH port number.  22 is the default.

We can run this command as many times as needed as it will only bring across changed files or those that didn’t exist the first time.  If the initial sync fails simply run it again.  Now we need to move over any config files, this is easiest to do with rsync as well – again run from the destination server:

mv /etc/httpd /etc/httpd.old
rsync -avzhe ‘ssh -p 22222’ root@OLD.HOST:/etc/httpd/ /etc/httpd/

The first command moves the existing httpd directory to a backup location while the second brings over all the configs from the old server.  There are a handful of directories you will want to run this on including, but no limited to:
/etc/httpd/
/etc/postfix/
/etc/php.d/
/etc/mail/

Once you have done this it’s time to pick the migration time and run a few more commands.  I choose early on a Sunday for this final migration.  Shut down the Apache service on the source server.  Time to migrate the MySQL databases.  This command works nicely but need run from the SOURCE SERVER:

mysqldump -u root -pPASSWORD –all-databases | ssh -p 2222 root@NEW.HOST ‘cat – | mysql -u root -pPASSWORD’

Of the PASSWORD variables listed there the first is the MySQL root password of the source machine, the second is the MySQL root password of the destination machine.  You will be prompted for the main root password of the destination machine when you execute this command.   The number after the -p, as before, is the SSH port number.   As with the rsync this command may take a while.  Now time to run the final sync on the web root.  Same command as before:

rsync -avzhe ‘ssh -p 22222’ root@OLD.HOST:/var/www/ /var/www/

Assuming not much time has passed between the first time you ran this and now it should run fairly fast. 

Moment of truth, shut down all web service on the SOURCE server: MySQL, httpd, postfix, etc.  Start all services on the DESTINATION server.  Then change over your DNS to point to the new server.  Assuming everything came up as expected you should be golden!

Test all the sites you had running on the old server paying close attention to things like SSL and 301 redirects handled by the .htaccess files. 

You have now migrated to a new server!  While this seems like a lot of steps when you actually dig down into it there really isn’t much here.  Feel free to leave a comment with your experiences or any questions/comments you may have. 

Arduino Temperature/Power Loss Monitoring – Part 1

Since I was unable to find a complete post on this I decided to write one.  I found a lot of good information from other blogs and websites but nothing exactly what I wanted to do.  I’m going to put together what I hope will be a complete guide for home temperature monitoring, power loss, and reporting/graphing (though that last piece will come in a later post).  You are welcome to use any part of this or use it all.  All code is open source under WTFPL.

Basically what I wanted was the ability to monitor the temperature at multiple points in my house.  I also wanted to monitor the power and alert on a power outage.  Since the Arduino board is plugged into a UPS it will stay running for a while after the power goes out.  Obviously without a UPS your Arduino would be unable to alert on a power outage.

First things first, here is a parts list that I used to make this happen:
– 1 Arduino Uno R3
– 1 Arduino Ethernet Shield R3
– 1 4.7k Ohm resistor
– As many DS18B20 temperature sensors as you want.  I will use 4 for this project.
– An LM35 analog sensor from here (optional)
– Wire – I am using spools of 2-pair telco wiring that I’ve had in my basement forever.
– Breadboard for connecting sensors and power to the Arduino board.
– ~9V Power adapter for Arduino board (only if you don’t have USB power nearby)
– 5V SWITCH MODE power adapter for power loss monitoring (optional)
– LAMP web server stack.  If you want to run this on Windows I suggest XAMPP.

(Depending on where you go for this and what you already have you should be able to get away for about $100 US)

Additionally here are the skills you need:
– Basic soldering
– Basic web programming/LAMP skills
– Wire pulling
– Time

Final notes before I get started with the actually how-to.  I will do my best to give enough details on everything (without going overboard) for you to make this work.  If you get stuck though please feel free to leave a comment or message me.  I also give no guarantees on the code.  If it works for you, wonderful.  If it sets your computer on fire, I’m not responsible.  Oh and if your system gets hacked from use of this code also not my responsibility.  All code provided AS-IS.  I am also going to attempt to link to all the places I found parts of this project but I greatly apologize if I don’t cite your source.  There were a TON of different sources so there is a good chance I will miss someone.

Alright – let’s get this show on the road!

Wiring things up is quite straightforward.  I will mention that I’m using an analog sensor on the breadboard just because I was able to get a free sample here.  I would not recommend using these for your whole project as the voltage drop across the cable runs will cause problems.  I just stuck one with the board because it was free so I figured why not.

Alright connecting the DS18B20 sensors is really easy.  We will be using normal mode (instead of parasitic) as this provides more consistency and allows for longer cable runs.

Pinout:

Schematic:

(I didn’t make these, they came from here)

Additionally if you are connecting up an analog sensor as I did the wiring is a slight bit different:

(source)

Alright so things are wired up, now you need the addresses of the digital sensors.  As I found this wonderful post on obtaining the addresses so I will not cover it in the post.  Please see that post for information on getting the addresses of the sensors.

Here are the files you will need to get started: Zipped Files  Obviously the .ino file needs to be uploaded to the Arduino board after inputting the correct server IP , host, mac, and sensor addresses.  The .sql file needs imported into your database.  The write.php needs edited with your DynamicDNS host if you are doing this from home.  You can sign up for an account here.  You just have to make sure one of the devices on your network is updating the IP address.  Additionally if you are writing to a local web server you can remove this part as it’s merely for security to prevent anyone from writing to the database.  After you have edited this file upload it and the lib directory to your web server.

Assuming everything is working correctly you should start seeing temp and power readings in your database:

At this point you should be good to go.  You can watch the output from the Arduino board on your PC to make sure that things are doing what they are supposed to.  Also the logs on your webserver can be useful if you encounter problems.  Hopefully this post helps someone and please feel free to leave a comment with additions/questions/problems!  Thanks for reading!