GeoIP based IP Block on Debian Buster

셋업 절차
# have to become root
$ id
uid=0(root) gid=0(root) groups=0(root)
# install required modules
$ apt-get install xtables-addons-common libnet-cidr-lite-perl libtext-csv-xs-perl libgeoip2-perl -y

# loading kernel extension
$ modprobe xt_geoip

# if failed to load
$ apt-get install module-assistant git bc bison flex libssl-dev libncurses5-dev
$ git clone https://github.com/notro/rpi-source.git
$ cd rpi-source
$ python ./rpi-source
$ export KERNELDIRS=/root/linux
$ module-assistant --verbose --text-mode auto-install xtables-addons
$ modprobe x_tables
$ modprobe xt_geoip

# confirm
$ lsmod | grep geoip
xt_geoip 16384 5
x_tables 32768 5 xt_state,xt_geoip,ip_tables,nft_compat,xt_conntrack

# move to following location to fetch data
$ cd /usr/src/xtables-addons-3.2/geoip
$ ./xt_geoip_dl
$ ls -la
drwxr-xr-x 2 root root  4096 Jul 14 09:03 GeoLite2-Country-CSV_20190709
-rw-r--r-- 1 root root 17682 Sep 29  2018 Makefile
-rw-r--r-- 1 root root   112 Sep 29  2018 Makefile.am
-rw-r--r-- 1 root root 17169 Sep 29  2018 Makefile.in
-rwxr-xr-x 1 root root  6168 Sep 29  2018 xt_geoip_build
-rw-r--r-- 1 root root  1520 Sep 29  2018 xt_geoip_build.1
-rwxr-xr-x 1 root root   191 Sep 29  2018 xt_geoip_dl
-rw-r--r-- 1 root root   582 Sep 29  2018 xt_geoip_dl.1
-rwxr-xr-x 1 root root  2024 Sep 29  2018 xt_geoip_fetch

# prepare copy GeoIP2 db
$ mkdir -p /usr/share/xt_geoip
$ cd GeoLite2-Country-CSV_20190709
$ ../xt_geoip_build -D /usr/share/xt_geoip

# add xt_geoip kernel module to /etc/modules-load.d for automatic loading when booting
$ echo 'xt_geoip' >> /etc/modules-load.d

# initialize iptables database, then run the followings
iptables -A INPUT -m geoip --src-cc CN -j DROP
iptables -A INPUT -m geoip --src-cc HK -j DROP
iptables -A INPUT -m geoip --src-cc RU -j DROP
iptables -A INPUT -m geoip --src-cc DE -j DROP
iptables -A INPUT -m geoip --src-cc IT -j DROP
 
참조 사이트
  • https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/
  • https://malicious.link/post/2016/blocking-countries-via-iptables/

 

WordPress 뚫어보겠다 출석췍하는 기생충들 박멸하는 씸쁠 방화벽

오늘도 이 허접한 워드프레스 뚫어보겠다 시도하는 기생충이들.. 여러 국가에서 지겹게도 성실하시다. 그나마 GeoIP로 막아서 이 정도..  Static Website 쓰지않고 나 처럼 워드프레스로 블로그 돌리는 가장 걸림돌은 뚫어보겠다 기웃거리는 기생충이들이다.

 

Raspberry Pi에서 블로그를 돌리고 있는데 RPi 3으로 몇년 째 버티는 중.  1년 정도는 EC2 Instance에서 돌리다가 무료 사용기간이 끝나서 다시 쳐박아 뒀던 RPi3 에 Buster를 설치해서 돌아왔다.

다시 설치한 후에 가장 먼저 해야할 방화벽 기능은 ufw 를 사용해서 편히 지낼 수 있으려나 했더니, 뜻대로 잘 안되더라. 걍 적용이 안된다.  뭔가 내가 제대로 설정을 안한듯.  어차피 포트야 열린게 80/443 밖에 없으니 nginx 로그를 통해 검사 후, 원격 IP 자체를 DROP 시키는 방식을 사용중이다.  스크립트들은 혹이라도 나중에 또 설정할 때 필요할테니 여기다 올려둠.

 

cd /var/log/nginx
tail -f -n0 wp-error.log | /root/bin/watching-and-block.sh
 
watching-and-block.sh

#!/bin/bash
while read line
do
  attack_type=$(echo "$line" | /root/bin/search-for.sh)
  if [[ $? ]]; then
    ip_addr=$(echo "$line" | awk -F'client: ' '{print $2}' | awk -F',' '{print $1}')
    echo "${attack_type}: $ip_addr"
    /root/bin/block-ip-addr.sh $ip_addr
  fi
done <"${1:-/dev/stdin}"

 

block-ip-addr.sh

#!/bin/bash
IP=${1:-no_ip_addr}
# 차단된 IP를 모아서 포인트적립
BLOCK_LIST_FILE=/root/ip-blocked.list

# 내 네트워크를 제외하는 거 잊지 말자
if [[ "$IP" == "no_ip_addr" ]] || [[ "$IP" == "서버 IP" ]] || [[ "$IP" =~ "내부 네트워크" ]] || [[ "$IP" =~ "VPN 네트워크" ]]; then
  exit 0
fi

touch ${BLOCK_LIST_FILE}; grep $IP ${BLOCK_LIST_FILE}

# iptables -C 명령은 왜 동작하지 않는걸까.. 최신판 buster 라면서..
if [[ $? -ne 0 ]]; then
  echo "block $IP"
  iptables -A INPUT -s ${IP} -j DROP
  echo $IP >> ${BLOCK_LIST_FILE}
else
  echo "already in block list"
fi

 

search-for.sh

#!/bin/bash

# 대표적인 패턴 몇개..
declare -a rules=(\
    "Primary script unknown:script attck" \
    "access forbidden by rule:dotfile attack" \
    "cgi-bin:cgi-bin seeker" \
 )

# 하나라도 매칭되면 싱고~
while read pattern; do
  for rule in "${rules[@]}"; do
    IFS=':'; read -a token <<< "$rule"; unset IFS
    if [[ $pattern =~ "${token[0]}" ]]; then
      echo "${token[1]}"
      exit 0
    fi
  done;
done < "${1:-/dev/stdin}"
exit 255