#!/bin/sh
#################################################################################################
## - 25/12/2014 --- RT-AC66U/RT-AC56U/RT-AC68U Firewall Addition v2.5 - #
###################################################################################################################
### ----- Make Sure To Edit The Following Files ----- #
### /jffs/scripts/firewall-start <-- Sets up cronjob/iptables rules #
### /jffs/scripts/firewall <-- Blacklists IP's From /jffs/scripts/ipset.txt #
### /jffs/scripts/ipset.txt <-- Banned IP List/IPSet Rules #
###################################################################################################################
##############################
#####Commands / Variables#####
##############################
UNBANSINGLE="unban" # <-- Remove Single IP From Blacklist
UNBANALL="unbanall" # <-- Unbans All IPs In Blacklist
REMOVEBANS="removeall" # <-- Remove All Entries From Blacklist
SAVEIPSET="save" # <-- Save Blacklists to /jffs/scripts/ipset.txt
BANSINGLE="ban" # <-- Adds Entry To Blacklist
BANCOUNTRYSINGLE="country" # <-- Adds entire country to blacklist
BANCOUNTRYLIST="bancountry" # <-- Bans specified countries in this file
WHITELIST="whitelist" # <-- Add IPs from path to Whitelist
NEWLIST="new" # <-- Create new IPSet Blacklist
DUMPCFE="dumpcfe" # <-- Dumps current CFE to /jffs/scripts/cfe.dump
UPDATECFE="updatecfe" # <-- Flash CFE from /jffs/scripts/cfe.flash (reset nvram afterwards)
##############################
start_time=`date +%s`
cat /jffs/scripts/firewall | head -28
#####################################################################################################################################
# - Unban / Unbanall / Removeall / Save / Ban / Country / Bancountry / Whitelist / Hideme / Findme/ DumpCFE / UpdateCFE / Backup - #
#####################################################################################################################################
if [ X"$@" = X"UNBANSINGLE" ]
then
echo "Input IP Address To Unban"
read unbannedip
logger -t Firewall "[Unbanning And Removing $unbannedip From Blacklist] ... ... ..."
ipset -D Blacklist $unbannedip
echo "`sed /$unbannedip/d /jffs/scripts/ipset.txt`" > /jffs/scripts/ipset.txt
echo "$unbannedip Is Now Unbanned"
elif [ X"$@" = X"UNBANALL" ]
then
echo "[Unbanning All IP's] ... ... ..."
logger -t Firewall "[Unbanning All IP's] ... ... ..."
ipset --flush Blacklist
ipset --flush BlockedCountries
elif [ X"$@" = X"REMOVEBANS" ]
then
nvram set Blacklist=`expr \`ipset -L Blacklist | wc -l\` - 6`
echo "[Deleting All `echo \`nvram get Blacklist\`` Entries From Blacklist] ... ... ..."
logger -t Firewall "[Deleting All `echo \`nvram get Blacklist\`` Entries From Blacklist] ... ... ..."
ipset --flush Blacklist
ipset --flush BlockedCountries
ipset --save > /jffs/scripts/ipset.txt
elif [ X"$@" = X"SAVEIPSET" ]
then
echo "[Saving Blacklists] ... ... ..."
ipset --save > /jffs/scripts/ipset.txt
echo "`sed '/crond: USER admin/d' /tmp/syslog.log`" > /tmp/syslog.log
elif [ X"$@" = X"BANSINGLE" ]
then
echo "Input IP Address"
read bannedip
logger -t Firewall "[Adding $bannedip To Blacklist] ... ... ..."
ipset -q -A Blacklist $bannedip
echo "$bannedip Is Now Banned"
elif [ X"$@" = X"BANCOUNTRYSINGLE" ]
then
echo "Input Country Abbreviation"
read country
for IP in $(wget -q -O - http://www.ipdeny.com/ipblocks/data/countries/$country.zone)
do
ipset -q -A BlockedCountries $IP
done
elif [ X"$@" = X"BANCOUNTRYLIST" ]
then
echo "[Banning Spam Countries] ... ... ..."
for country in pk cn in jp ru sa
do
for IP in $(wget -q -O - http://www.ipdeny.com/ipblocks/data/countries/$country.zone)
do
ipset -q -A BlockedCountries $IP
done
done
elif [ X"$@" = X"WHITELIST" ]
then
echo "Input file location"
read WHITELISTFILE
for IP in `cat $WHITELISTFILE`
do
ipset -q -A Whitelist $IP
echo $IP
done
ipset --save > /jffs/scripts/ipset.txt
elif [ X"$@" = X"NEWLIST" ]
then
echo "Does The Blacklist Need To Be Downloaded? yes/no"
read ENABLEDOWNLOAD
if [ X"$ENABLEDOWNLOAD" = X"yes" ]; then
echo "Input URL For IPSet Blacklist"
read DOWNLOADURL
wget -O /jffs/scripts/ipset2.txt $DOWNLOADURL
fi
echo "Input New Set Name"
read SETNAME
sed -i "s/Blacklist/$SETNAME/g" /jffs/scripts/ipset2.txt
ipset -q -R < /jffs/scripts/ipset2.txt
echo "Successfully Added New Set"
elif [ X"$@" = X"DUMPCFE" ] && [ X"`nvram get model`" = X"RT-AC68U" ]
then
echo "Dumping CFE"
logger -t Firewall "[Dumping CFE] ... ... ..."
OLDCFE="`strings /dev/mtd0 | grep model` - `strings /dev/mtd0 | grep bl_v` - `strings /dev/mtd0 | grep 0:ccode` - `strings /dev/mtd0 | grep et0macaddr` - `strings /dev/mtd0 | grep 0:macaddr` - `strings /dev/mtd0 | grep 1:macaddr` - `strings /dev/mtd0 | grep secret_code`"
cat /dev/mtd0 > /jffs/scripts/cfe.dump
echo "Sucessfully Dumped CFE - $OLDCFE"
logger -t Firewall "Sucessfully Dumped CFE - $OLDCFE"
elif [ X"$@" = X"UPDATECFE" ] && [ X"`nvram get model`" = X"RT-AC68U" ]
then
echo "Flashing new CFE"
logger -t Firewall "[Flashing new CFE] ... ... ..."
OLDCFE="`strings /dev/mtd0 | grep et0macaddr` `strings /dev/mtd0 | grep 0:macaddr` `strings /dev/mtd0 | grep 1:macaddr` `strings /dev/mtd0 | grep secret_code`"
NEWCFE="`strings /jffs/scripts/cfe.flash | grep et0macaddr` `strings /jffs/scripts/cfe.flash | grep 0:macaddr` `strings /jffs/scripts/cfe.flash | grep 1:macaddr` `strings /jffs/scripts/cfe.flash | grep secret_code`"
if [ X"`echo $OLDCFE`" = X"`echo $NEWCFE`" ]; then
echo "Correct Values Detected"
/jffs/scripts/mtd-write cfe.flash boot && status="Successfully flashed new CFE. `strings /dev/mtd0 | grep bl_v` `strings /dev/mtd0 | grep 0:ccode` $NEWCFE" || status="Failed flashing new CFE"
logger -t Firewall "$status ... ... ..."
echo "$status"
else
echo "Values Missing From New CFE - Make Sure Values Are Hex'd In" && status="Values Missing From New CFE - Make Sure Values Are Hex'd In"
echo "Old CFE - $OLDCFE"
echo "New CFE - $NEWCFE"
logger -t Firewall "$status ... ... ..."
fi
else
if [ X"`nvram get fw_enable_x`" = X"1" ]
then
echo "Correct Settings Detected."
else
echo "Enabled SPI Firewall"
nvram set fw_enable_x=1
nvram commit
fi
if [ X"`nvram get fw_log_x`" = X"drop" ]
then
echo "Correct Settings Detected"
else
echo "Enabled Firewall Logging"
nvram set fw_log_x=drop
nvram commit
fi
if [ X"`nvram get clkfreq`" != X"1200,800" ] && [ X"`nvram get model`" = X"RT-AC68U" ]
then
echo "Enabled Overclock - Current Clock `nvram get clkfreq`"
nvram set clkfreq=1200,800
nvram commit
else
echo "Correct Settings Detected."
fi
echo "`sed '/IP Banning Started/d' /tmp/syslog.log`" > /tmp/syslog.log
echo "[IP Banning Started] ... ... ..."
logger -t Firewall "[IP Banning Started] ... ... ..."
ipset -q -R < /jffs/scripts/ipset.txt
echo "[Loading Blacklist] ... ... ..."
ipset -q -N Blacklist iphash
iptables -D INPUT -m set --set Blacklist src -j DROP
iptables -I INPUT -m set --set Blacklist src -j DROP
echo "[Loading Blocked Countries] ... ... ..."
ipset -q -N BlockedCountries nethash
iptables -D INPUT -m set --set BlockedCountries src -j DROP
iptables -I INPUT -m set --set BlockedCountries src -j DROP
echo "[Loading Whitelist] ... ... ..."
ipset -q -N Whitelist nethash
iptables -D INPUT -m set --set Whitelist src -j ACCEPT
iptables -I INPUT -m set --set Whitelist src -j ACCEPT
ipset -q -A Whitelist 192.168.1.0/24
ipset -q -A Whitelist 192.168.0.0/24
ipset -q -A Whitelist 192.3.148.0/24
ipset -q -A Whitelist `nvram get lan_ipaddr`/24
#iptables -D logdrop -m state --state NEW -j LOG --log-prefix "DROP " --log-tcp-sequence --log-tcp-options --log-ip-options > /dev/null 2>&1
#iptables -D logdrop -m state --state NEW -j SET --add-set Blacklist src
#iptables -I logdrop -m state --state NEW -j SET --add-set Blacklist src
echo "`sed '/DROP IN=/d' /tmp/syslog.log`" > /tmp/syslog.log
echo "`sed '/DROP IN=/d' /tmp/syslog.log-1`" > /tmp/syslog.log-1
fi
###############
# - Logging - #
###############
OLDAMOUNT=`nvram get Blacklist`
nvram set Blacklist=`expr \`ipset -L Blacklist | wc -l\` - 6 `
NEWAMOUNT=`nvram get Blacklist`
#nvram set BlacklistTotal=`expr \`ipset -L | wc -l\` - 21`
start_time=$(expr `date +%s` - $start_time)
echo "[Complete] $NEWAMOUNT IPs currently banned. `expr $NEWAMOUNT - $OLDAMOUNT` New IP's Banned. `nvram get BlacklistTotal` Banned Overall [`echo $start_time`s]"
logger -t Firewall "[Complete] $NEWAMOUNT IPs currently banned. `expr $NEWAMOUNT - $OLDAMOUNT` New IP's Banned. `nvram get BlacklistTotal` Banned Overall [`echo $start_time`s]"