How do I read a list of ip address (subnets) using a text file and block all of them using Linux iptables command?
You can create a file which contains the list of all blocked ip address or subnets per line. You can read a file line by line using while loop.
Example: iptables Read IPs / Subnets From The Text File
Create a text file - /root/firewall/badips.db as follows:
# Block db # Added on Aug/19/2009 202.54.1.2 # Spammers 203.1.2.3/29
The basic logic as follows to read a text file:
_input=/path/to/text.db IPT=/sbin/iptables $IPT -N droplist egrep -v "^#|^$" x | while IFS= read -r ip do $IPT -A droplist -i eth1 -s $ip -j LOG --log-prefix " myBad IP BlockList " $IPT -A droplist -i eth1 -s $ip -j DROP done < "$_input" # Drop it $IPT -I INPUT -j droplist $IPT -I OUTPUT -j droplist $IPT -I FORWARD -j droplist
Here is a sample shell script:
#!/bin/bash # Modify script as per your setup # Usage: Sample firewall script # --------------------------- _input=/root/firewall/badips.db _pub_if="eth1" IPT=/sbin/iptables # Die if file not found [ ! -f "$_input" ] && { echo "$0: File $_input not found."; exit 1; } # DROP and close everything $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # Unlimited lo access $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Allow all outgoing connection but no incoming stuff by default $IPT -A OUTPUT -o ${_pub_if} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -i ${_pub_if} -m state --state ESTABLISHED,RELATED -j ACCEPT ### Setup our black list ### # Create a new chain $IPT -N droplist # Filter out comments and blank lines # store each ip or subnet in $ip egrep -v "^#|^$" x | while IFS= read -r ip do # Append everything to droplist $IPT -A droplist -i ${_pub_if} -s $ip -j LOG --log-prefix " Drop Bad IP List " $IPT -A droplist -i ${_pub_if} -s $ip -j DROP done <"${_input}" # Finally, insert or append our black list $IPT -I INPUT -j droplist $IPT -I OUTPUT -j droplist $IPT -I FORWARD -j droplist # Okay add your rest of $IPT commands here # Example: open port 53 #$IPT -A INPUT -i ${_pub_if} -s 0/0 -d 1.2.3.4 -p udp --dport 53 -j ACCEPT #$IPT -A INPUT -i ${_pub_if} -s 0/0 -d 1.2.3.4 -p tcp --dport 53 -j ACCEPT # Open port 80 # $IPT -A INPUT -i ${_pub_if} -s 0/0 -d 1.2.3.4 -p tcp --destination-port 80 -j ACCEPT # Allow incoming ICMP ping pong stuff # $IPT -A INPUT -i ${_pub_if} -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -m limit --limit 30/sec -j ACCEPT # $IPT -A INPUT -i ${_pub_if} -p icmp -m icmp --icmp-type 3 -m limit --limit 30/sec -j ACCEPT # $IPT -A INPUT -i ${_pub_if} -p icmp -m icmp --icmp-type 5 -m limit --limit 30/sec -j ACCEPT # $IPT -A INPUT -i ${_pub_if} -p icmp -m icmp --icmp-type 11 -m limit --limit 30/sec -j ACCEPT # drop and log everything else $IPT -A INPUT -m limit --limit 5/m --limit-burst 7 -j LOG $IPT -A INPUT -j DROP
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop












{ 5 comments… read them below or add one }
the script looks good, but when i run the script i get this message…
egrep: x: No such file or directory
just remove the egrep bit, I got the same message, its only required if you have whitespace in your list of banned IPs. Make sure it doesnt, and you can remove the egrep part, everything up to and including the pipe |
Hi,
I have an list.db and it looks like:
……etc
when I try to run a script:
Im getting error for every entry which got netmask stated as /xx
… looks like this:
‘ specified.4.4: invalid mask `21
Try `iptables -h’ or ‘iptables –help’ for more information.
How to alter the script??
In case the list of IP address in text file contains duplicate IP address, how is your script will handle it?
It’s not great since egrep doesn’t work and I need comments in the text file…