### -*-sh-*- ### ### Initialization and finishing touches for firewall scripts ### ### (c) 2008 Mark Wooding ### ###----- Licensing notice --------------------------------------------------- ### ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software Foundation, ### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. m4_divert(30)m4_dnl ###-------------------------------------------------------------------------- ### Clear existing firewall rules. ## The main chains: set policy to drop, and then clear the rules. For a ## while, incoming packets will be silently dropped, but we should have got ## everything going before anyone actually hits a timeout. ## ## We don't control some of the chains, so we should preserve them. This ## introduces a whole bunch of problems. ## Chains we're meant to preserve preserve_chains="filter:fail2ban filter:fail2ban-* $preserve_chains" ## Take the various IP versions in turn. unref=nil for ip in ip ip6; do for table in $(cat /proc/net/${ip}_tables_names); do ## Step 1: clear out the builtin chains. ${ip}tables -nL -t $table | sed -n '/^Chain \([^ ]\+\) (policy .*$/ s//\1/p ' | while read chain; do case $table in nat) policy=ACCEPT ;; *) policy=DROP ;; esac run ${ip}tables -t $table -P $chain $policy run ${ip}tables -t $table -F $chain done ## Step 2: clear out user chains. Unfortunately, we can only clear ## chains which have no references to them, so work through picking off ## unreferenced chains which aren't meant to be preserved until there are ## none left. while :; do progress=nil ${ip}tables -nL -t $table | sed -n '/^Chain \([^ ]\+\) (0 references)$/ s//\1/p ' \ >/var/run/firewall-chains.tmp while read chain; do match=nil for pat in $preserve_chains; do case "$table:$chain" in $pat) match=t ;; esac done case $match in nil) run ${ip}tables -t $table -F $chain run ${ip}tables -t $table -X $chain progress=t ;; esac done /var/run/firewall-chains.tmp while read chain refs; do match=nil for pat in $preserve_chains; do case "$table:$chain" in $pat) match=t ;; esac done case $match in nil) echo >&2 "$0: can't clear referenced $ip chain \`$table:$chain'" unref=t ;; esac done