Exposing visitor IP to apache through varnish

In a previous post, i posted how you can put varnish on a virtual machine to cache content for your web server, But there was one small thing that we did not deal with, The IP address in the logs and that the website can see is simply that of the varnish server, not the visitor’s IP, and if you write PHP like me, I use the IP in everything, from securing logins to limiting page views to limiting comments. So, here is how we can work around this problem

First, the mission is as follows, Varnish needs to append something in the request header, that apache needs to consider the Visitor’s IP

To make apache do that, there is already a module (mod-remoteip) to do this

1- Tool to check the IP of the visitor

Create a PHP script to find out if what we are doing actually worked.

print "Your IP is: {$_SERVER['REMOTE_ADDR']} <br />\n\n";
$headers = apache_request_headers();
foreach($headers as $xheader => $xvalue)
print "$xheader : $xvalue <br />\n"; }

and upload it to the website, when accessing this from the internet, you should see the IP as the IP of the varnish server, not your IP (Like it should)

1- Playing with cpanel

First, we must download mod_remoteip from the cpanel website (See here)

Once downloaded, we will upload it to the cpanel server at


Once done, we will now extract it as we would extract any tar.gz file

cd /var/cpanel/easy/apache/custom_opt_mods
tar -C /var/cpanel/easy/apache/custom_opt_mods -xvf custom_opt_mod-remoteip.tgz

Now, this mod should appear in easy apache when rebuilding apache, so go ahead, visit

Home »Software »EasyApache 3

and on the Exhaustive Options List you should be able to see mod_remoteip, be sure to check it.

Now, before coming to configure it, We need to inform Varnish to send us those headers. So add this at the very beginning of the Varnish sub vcl_recv section

NOTE: It seems that for the latest varnish (VCL 4), you no longer need this, if you add this, you will get the header as ( X-Forwarded-For : xxx.105.60.194, xxx.105.60.194) meaning the same IP twice

if (req.restarts == 0) {
  if (req.http.X-Forwarded-For) {
    set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
  } else {
    set req.http.X-Forwarded-For = client.ip;

Now, we need to tell apache, what the extra header’s name is (X-Forwarded-For) and what servers this header should be honored for (the varnish server IPs, currently displaying in the script we wrote right after Your IP is:) So start by editing


And add this, the IP here is the varnish server IP

<IfModule mod_remoteip.c>
   RemoteIPHeader X-Forwarded-For
   RemoteIPInternalProxy xxx.172.13.208

Or, Probably the more suitable


And add this, the IP here is the varnish server IP

<IfModule mod_remoteip.c>
   RemoteIPHeader X-Forwarded-For
   RemoteIPTrustedProxy xxx.172.13.0/24
   RemoteIPTrustedProxy xxx.172.14.0/24
   RemoteIPTrustedProxy xxx.172.19.0/24

Now, visit Home >> Restart Services on your cpanel server, and restart apache

There you have it, refresh that PHP script, and your IP address should appear.

Now, the apache logs will still log the Varnish server IP, to fix that, you need to modify the log section in your apache config, changing %h with %a, like so

#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

restoring lost tabs in firefox

Every once in a while (often), something happens and the “Restore session” option in firefox disappears (right now it is june 2016), usually this happens after a crash where i try to re open firefox early or when computer hangs then i do something stupid, if you just opened firefox, keep it open, then go to C:\Users\techg\AppData\Roaming\Mozilla\Firefox\Profiles\8xve5flx.default (Or whatever your profile folder is named), and WITH YOUR FIREFOX STILL OPEN, copy the file sessionstore.js (back it up), Now close firefox, your original might have reset to a small file size as soon as you close firefox, Now, the tabs are all stored in sessionstore.js.bak (or whatever you called the copy), so delete the one you have, and copy this file back in it’s place.

With that done, it is editing time

The bad copy starts like this

{"version":["sessionrestore",1],"windows":[{"tabs":[{"entries":[{"url":"about:home","title":"Mozilla Firefox Start Page","charset":"","ID":716087720,"docshellID":11510,"docIdentifier":13,"persist":true}],"lastAccessed":1465298115431,"hidden":false,"attributes":{},"userContextId":0,"index":1,"image":"chrome://branding/content/icon32.png"}],

delete some text (“version”:[“sessionrestore”,1],) to make it look like this

{"windows":[{"tabs":[{"entries":[{"url":"about:home","title":"Mozilla Firefox Start Page","charset":"","ID":716087720,"docshellID":11510,"docIdentifier":13,"persist":true}],"lastAccessed":1465298115431,"hidden":false,"attributes":{},"userContextId":0,"index":1,"image":"chrome://branding/content/icon32.png"}],

Now, open your firefox browser, and you should see the restore button come back up.

Mounting a multipart vmdk disk on Linux

There are many ways to do that, one of which is using the tools provided by vmware to combine the disks into one and then mounting it with

kpartx -av mydisk.vmdk;


mount -o /dev/mapper/loop0p1 /hds/disk

While another method, which is simpler

apt-get install qemu-utils
qemu-img convert disk-s001.vmdk s01.raw
qemu-img convert disk-s013.vmdk s13.raw
qemu-img convert disk-s032.vmdk s32.raw

The above will be sparse files, so you will not have disk usage as big as the file, a “df -h” should not result in any lost of disk space beyond the data that is used by files in the image

following the above, we need to combine the RAW files like so

cat s01.raw s02.raw s03.raw s04.raw s05.raw s06.raw s07.raw s08.raw s09.raw s10.raw s11.raw s12.raw s13.raw s14.raw s15.raw s16.raw s17.raw s18.raw s19.raw s20.raw s21.raw s22.raw s23.raw s24.raw s25.raw s26.raw s27.raw s28.raw s29.raw s30.raw s31.raw s32.raw > combined.raw
losetup /dev/loop0 combined.raw
kpartx -a /dev/loop0
mount /dev/mapper/loop0p1 /hds/img1

Review of the Seagate ST8000DM002 8TB 7200rpm desktop hard drive

This is not a review in the sense that it explores the drive in every possible aspect, this is better seen as a user review.

I got this drive on 2016-04-06 (6th of april), the first thing that catches your eye about this drive is that every inch of the space a regular hard drive uses (that empty area under the disk) is used, as a consequence, there is no middle screw hole, only in the back and in the front, a bit of a problem for many computer and NAS cases that rely on that hole to fasten the drive in place.

So, formatting the system into ext4 and copying files onto it, the drive seems very fast, how fast exactly remains to be seen in the coming few hours as i can only run the test after ext4lazyinit completes and finalizes the ext4 partition. I also enabled lazy write-back and removed the journal (tune2fs -O ^has_journal /dev/sdb1)

Now, let us take a better look at some parameters that were given to us by seagate

This is not the SMR (Shingled magnetic recording) disk, this is a proper hard drive meant to run as your desktop’s hard drive, the hard drive features 6  1.33TB plates, which is very high density compared to any disk on the market.

Price per gigabyte at the time of writing on this drive is 4 cents, that is pretty good for a desktop hard drive (The archive drive costs less per GB, but is much less of a performer), the archiving drive, with the SMR needs to delete neighbouring bytes and rewrite them whenever it needs to update a certain byte, so it suffers in performance, not to mention that other things are designed with this in mind too.

Using cloud linux

Basically, CloudLinux sets limits on hosting accounts, here is what you need

1- Remove limits for a certain user
lvectl set-user techg –unlimited

2- Restore all limits to defaults
lvectl apply all
lvectl delete-user techg

3- Increase speed of website to use 3 cores
lvectl set-user techg –speed=300%

Change the defaults
lvectl set default –speed=100% –pmem=2048m

Server unable to read htaccess file, denying access to be safe

I am very new to centos (Debian usually), and on my cpanel / whm server, i got this error


You don't have permission to access / on this server.
Server unable to read htaccess file, denying access to be safe

Additionally, a 403 Forbidden error was encountered while trying to use an ErrorDocument to handle the request.

Something seemed seriously wrong, I had already chowned all the files

chown -R techg:techg public_html

I also even deleted the htaccess file, but still, the server was reporting the error.

The solution turned out to be making the public_html directory executable

I found that out through the apache log files that read

[Sun Mar 06 02:48:10.894154 2016] [core:crit] [pid 1261] (13)Permission denied: [client 46.xxx.216.169:55886] AH00529: /home/techg/public_html/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable and that ‘/home/techg/public_html/’ is executable

gigabit Ethernet VirtIO driver for Windows 10 64bit

By default, KVM gives your virtual machine a realtek rtl8139 Ethernet adapter, with an ancient 100Mbit/Second speed, we all need gigabit Ethernet adapter for the KVM guest.

The answer is changing the string rtl8139 with virtio in the XML file of the virtual machine, then installing the drivers

The steps i use are

Run virtual machine with the realtek adapter to download the other adapter’s driver
once the adapter is there, shutdown the virtual machine guest (Windows guest), then edit the xml of the guest, and restart libvirtd
start the KVM guest again
open with VNC, start the device manager, install the driver you downloaded.

You are good, the adapter should report the speed of 10Gbit/second (10 gigabit per second)

One annoying thing is that all windows drivers come in a big ISO file, you probably just want the driver you need.

I will add the download links in the coming few days, but you can get them right now if you like from fedora, the fedora windows guest drivers should work on any linux distribution (Debian, ubuntu, etc…)

Protecting roundcube against bruit force attacks

You probably have protected your dovecot, postfix, exim, dbmail, or any other port opening application that needs to be protected from bruit force and dictionary attacks.

But what about roundcube, the problem with roundcube is that you have to whitelist it (whether it is on the same server or a different server) so that it does not get blocked, so now you have another security issue, this way a hacker can bruit force your server even when fail2ban is monitoring all SMTP and IMAP and POP ports.

The solution to this is to actually protect RoundCube itself against bruit force.

Forget the apache logs, we don’t need to use those as roundcube will log failed attempts in it’s /logs/errors file, this file has something similar to the following line

IMAP Error: Login failed for aaa@bbb.com from xxx.xxx.xxx.xxx. AUTHENTICATE PLAIN: Authentication failed

You should also note that there is a certain roundcube config file in fail2ban, which i am not using because i like to make things as simple as possible but not too simple, the file that comes with fail2ban roundcube-auth.conf seems to account for older installations of roundcube, something i don’t really need.

Now, here is a step by step manual to protect roundcube (Or phpmyadmin or ispconfig or what have you) from bruit force attacks and dictionary attacks.

1- Make sure fail2ban is installed
apt-get install fail2ban

2- add the following two configuration file to fail2ban programs directory (/etc/fail2ban/filter.d/)

1- roundcube.conf

# Fail2Ban configuration file for roundcube webmail
# Author: Fabian Wenk 
# $Revision$
# To have logging information available, it is necessary to adjusting
# the following option in config/main.inc.php from Roundcube:
# $rcmail_config['debug_level'] = 1;	// not sure, probably not needed
# $rcmail_config['log_session'] = true;
# and point in the fail2ban jail config to the correct logfile,
# or change also the following config to log to syslog:
# $rcmail_config['log_driver'] = 'syslog';


# Option: failregex
# Notes.: regex to match the password failures messages in the logfile.
#	first line is for Cyrus IMAP (2.4.x)
#	second line is for Dovecot (2.1.x)
# Values: TEXT
#failregex = roundcube: IMAP Error: Login failed for .* from . AUTHENTICATE PLAIN: authentication failure in .*$
failregex = roundcube: IMAP Error: Login failed for .* from . AUTHENTICATE PLAIN: Authentication failed. in .*$

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex =  

2- roundcube-repeat.conf, this rule inspects the fail2ban log file itself, and if there are repeated bans (repeated violations), imposes a bigger penalty

# roundcube configuration file


# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P\S+)
# Values:  TEXT
failregex = \[roundcube\] Ban 

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex =

The above is how fail2ban will identify failed logins, now in the /etc/fail2ban/jail.local we need to tell fail2ban 1- Where to look for this rule, 2- what file to look for the logs in !

So, to activate the above, we need to add some rules in /etc/fail2ban/jail.conf

enabled  = true
port     = http,https
filter   = roundcube
logpath  = /var/sys_ssl/rcmail/logs/errors
maxretry = 5
findtime = 600
bantime = 3600

enabled = true
port = http,https
filter = roundcube-repeat
logpath = /var/log/fail2ban.log
maxretry = 3
findtime = 21600
bantime = 86400

Now, to the testing, mind you, if you test, you will be blocked, depending on how you test, you might get blocked for a whole day, so keep that in mind

For those of you on a recent cpanel installation, you should probably know that iptables are disabled by default in favor of firewalld, fail2ban will update the rules, but the rules will not work 😉

Keeping your mobile phone battery in good health

Phone manufacturers are leaning towards non removable batteries on higher end phones , the reason for that is that they can save space and use it to install a slightly larger battery making use of space previously lost in plastic holding the battery, with that , there seems to be interest in prolonging that battery’s life to avoid having to send it to a repair shop to crack it open and install a new one.

Their concerns are very understandable , sometimes repair shops cause some harm to your device , other times they install cheaper grade (or old stock) batteries that will need to be replaced again within months. So here is how we make sure we get the longest possible life out of a lithium battery. The first of the two sections below are for the average user, the second is for the more curious.

Side note: – An optional addition that can be very useful in your quest to keep your phone’s battery healthy (Adding convenience to the methods you will learn here) is a phone cover with a built in power bank, usually selling for $10 or so, or even a $5 mobile power bank, otherwise you will need to have a nearby charger handy at most times. So, that whenever we say connect a charger in this article, you could simply switch on the battery bank (Embedded in your phone cover)

Section 1 , how to use your phone to prolong the phone’s battery life.

1- – Charge your phone while it is switched off when possible.

This is probably not very important but here is he justification, when you recharge a battery, the charging circuit needs to measure the voltage of the battery to provide the right voltage , this is not possible in an accurate manner with the phone itself acting as an electric load , so the charging circuit will have to be cautious but not actually going through the last phase of the charge, while this will not deteriorate your battery’s life expectancy it will leave you with less power during the day which could sometimes mean going below 20% level of power by the end of the day, now that could do your battery some incremental damage (Internal corrosion) , to maintain your battery, you should avoid letting it go below 20% at all times.

2- Connect your charger/Battery bank while using the phone for power intensive tasks such as watching video or browsing the internet.

it is well known that lithium batteries suffer when discharged quickly, the exact reason is unknown , some claim it is related to ions getting trapped at higher rate, others believe it has to do with heating of either the phone’s CPU (close to the battery) and heating of the battery itself, we don’t really know why for 100%, all we know is that it is certainly bad for your battery but if your phone is plugged in during those activities , your phone will draw the current from the charging circuit instead of the battery, simply because the circuit will have to provide higher voltage than the battery, and from electricity 101 we know that your phone will draw electricity from the higher voltage source.

3- Recharge often. while your phone’s battery still has 40% – 60% of the charge , try to keep it above 15% at all times

– Older phones had nickle based batteries that forced full cycles, so it was best to fully charge your batteries, then drain them all the way down to zero, then recharge them again, people read those words in those manuals back in the nineties but no one actually told them that this is no longer the case , in fact that is terrible advice if ever applied to lithium batteries , most lithium batteries are happiest when they are charged between

40%-90% , the longer they stay at those levels , the longer they live

4 – Charge slow while you sleep, using a smaller capacity charger

phone manufacturers try to provide faster chargers to make your life easier, because no one likes to get tethered to a wall for long, but while you sleep , charging slow is in fact better for your battery, batteries have ratings for the maximum speed they accept a charge ( 0.5 c , 1 c , 1.5c etc.. ) but the rule thumb of the is that the higher the current the more exhausting it is for the battery’s health.

5- to conveniently use this advice without owning that battery bank case, i need a long charging cable right?? is there anything wrong with that??

well yes, and no , slow charging a battery is not a bad thing at all , but charging cables are usually thin for obvious reasons so the longer the cable the higher the resistance so you are actually.

A- wasting power that the wall adapter sent to the phone in form of heat generated by the cable

B- consuming your power adapter making it work harder for nothing

but it is generally okm, now if you are a perfectionist, a work around can be an electric extension cord between the charger and the wall socket, simply because the higher the voltage , the lower the amps, the thinner the needed wire, i will avoid getting into details now but that is one solution you can use

Also note that:

A mobile phone cover with built in battery bank will also help you avoid wear on the charging connector.

These connectors on your phone are rated for a finite number of plug/unplug cycles, what amplifies that wear on the connector and wire is the fact that i am actually recommending that you charge the phone while you use it in certain circumstances now while this is good for your battery it is certainly bad for the socket on your phone, the aforementioned cover will keep your phone charging  socket from wearing out.

right now you are probably thinking that I’m affiliated with some sort of manufacturer , well , I’m not , and that is why i am forced not to recommend one any phone cover with a power bank built in , but please do read customer reviews before you buy one. Some of them have very cheap quality bateries inside.