Tired of the constant attacks on your network services from China
and like countries? Me too. Here is how you drop the hammer on an
entire country using Geo-IP blocks with iptables.
First, install the xtables addon package, which will provide lots of
nice iptables extension modules, among them geoip and tarpit, the
two we will use:
```
apt-get install xtables-addons-dkms linux-headers-amd64
```
Substitute 'amd64' for your own CPU architecture. Once that is
installed (the install process includes compiling the modules for
you), do the following to setup a Geo-IP database that iptables can
reference:
```
mkdir /usr/share/xt_geoip/
cd /usr/share/xt_geoip/
wget http://static.wipmania.com/static/worldip.iptables.tar.gz
tar xzvf worldip.iptables.tar.gz --strip-components=2
find BE LE -type f | xargs rename 's/(..)\.iv0$/$1.iv4/'
```
Then you can delete or move worldip.iptables.tar.gz.
Using the geoip and tarpit extensions is easy once that is done,
here is an example that blocks all TCP and UDP traffic from China
and Russia, using the TARPIT target for the TCP traffic.
```
iptables -A INPUT -p tcp -m geoip --src-cc CN,RU -j TARPIT
iptables -A INPUT -p udp -m geoip --src-cc CN,RU -j DROP
```
I would put these rules at the top of my iptables firewall script or
ruleset spec. As a one-off manual rule addition from the shell, use
'-I' instead of '-A', to force the rules to be inserted at the top
of the INPUT chain.
Note the tarpit extension can only be used with the TCP protocol
(hence the -p tcp, above). You can use 'iptables -L -nvx' to see how
many packets and the total bytes that have been dropped or tarpitted
by the rules. On my own server, I have the rules separated by
country, so the byte and packet counters for each are separate.
Also, you don't have to use the tarpit extension, but I like it as
it slows the source connections down, forcing them to timeout rather
than being dropped or rejected immediately.
```
root@nix1:/var/log# iptables -L -nvx
pkts bytes target prot opt in out source destination
...
44032 1806261 TARPIT tcp -- * * 0.0.0.0/0 0.0.0.0/0 -m geoip --source-country CN -j TARPIT --tarpit
3992 163868 TARPIT tcp -- * * 0.0.0.0/0 0.0.0.0/0 -m geoip --source-country RU -j TARPIT --tarpit
12243 517021 TARPIT tcp -- * * 0.0.0.0/0 0.0.0.0/0 -m geoip --source-country IR -j TARPIT --tarpit
361 131089 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 -m geoip --source-country CN,RU,IR
```
It's amazing the constant stream of attacks from these countries. My
own server is used for personal email, so I have saslauth enabled
which is the target for most of the attacks (I run sshd on a
non-standard port, this keeps away almost all attacks on it).
Before I enabled the Geo-IP blocks, I was using fail2ban, configured
to send emails with a whois output every time an IP was blocked, and
getting dozens of emails per day. Now I get just a few.
Response:
text/plain