Originally published October 4, 2019 @ 11:58 am
I’ve been using my mod of this handy script to block countries with iptables
. One issue with the script is that it is adding rules one-by-one using the iptables -A
syntax. This is the proper way to add rules, but it does take a long while. And here’s how you can make it orders of magnitude faster.
Here’s the basic process in the original script:
for each country_code do download zone file get a list of all IPs for each IP in the list do add a logging rule to iptables add a block rule to iptables done done
Here’s what I have in my revised version:
save current iptables config copy saved config to a temp file remove (but remember) the COMMIT footer at the end of the config file for each country_code do download zone file get a list of all IPs for each IP in the list do echo logging rule to temp file echo block rule to temp file done done move temp file to iptables config file reload iptables
The iptables
command is called after all the rules are already in the config file, and not for every single rule, of which there may be tens of thousands.
Here’s the actual code for this:
function func_add_rules() { iptables-save > /etc/sysconfig/iptables tmpfile3=$(mktemp) /bin/cp -p /etc/sysconfig/iptables ${tmpfile3} footer="$(sed -n '/^COMMIT/{:a;n;/*$/b;p;ba}' ${tmpfile3})" sed -i "/^COMMIT/,/*$/d" ${tmpfile3} for country_code in af cn ua jp do wget -O /root/${country_code}.zone ${download_url}/${country_code}.zone log_msg="${country_code} CountryDrop" banned_ips=$(grep -Ev "^#|^$" /root/${country_code}.zone) for ban_ip in ${banned_ips} do echo "-A ${chain_name} -s ${ban_ip} -j LOG --log-prefix ${log_msg}" >> ${tmpfile3} echo "-A ${chain_name} -s ${ban_ip} -j DROP" >> ${tmpfile3} done done echo COMMIT >> ${tmpfile3} echo "${footer}" >> ${tmpfile3} awk '/^COMMIT$/ { delete x; }; !x[$0]++' ${tmpfile3} > /etc/sysconfig/iptables iptables-restore < /etc/sysconfig/iptables /sbin/service iptables reload /sbin/service iptables save }
Experienced Unix/Linux System Administrator with 20-year background in Systems Analysis, Problem Resolution and Engineering Application Support in a large distributed Unix and Windows server environment. Strong problem determination skills. Good knowledge of networking, remote diagnostic techniques, firewalls and network security. Extensive experience with engineering application and database servers, high-availability systems, high-performance computing clusters, and process automation.