/ iptables-persistent
iptables-persistent
1 #!/bin/sh 2 # Written by Simon Richter <sjr@debian.org> 3 # modified by Jonathan Wiltshire <jmw@debian.org> 4 # with help from Christoph Anton Mitterer 5 # 6 7 ### BEGIN INIT INFO 8 # Provides: iptables-persistent 9 # Required-Start: mountkernfs $local_fs 10 # Required-Stop: $local_fs 11 # Default-Start: 2 3 4 5 12 # Default-Stop: 0 1 6 13 # X-Start-Before: $network 14 # X-Stop-After: $network 15 # Short-Description: Set up iptables rules 16 # Description: Loads/saves current iptables rules from/to /etc/iptables 17 # to provide a persistent rule set during boot time 18 ### END INIT INFO 19 20 . /lib/lsb/init-functions 21 22 rc=0 23 24 load_rules() 25 { 26 log_action_begin_msg "Loading iptables rules" 27 28 # MUST load IPSet first, in case any iptables depend on a set being present 29 #load IPSet rules 30 if [ ! -f /etc/iptables/rules.set ]; then 31 log_action_cont_msg " skipping IPset (no rules to load)" 32 else 33 log_action_cont_msg " IPset" 34 ipset restore < /etc/iptables/rules.set 2> /dev/null 35 # if [ $? -ne 0 ]; then 36 # rc=1 37 # fi 38 fi 39 40 #load IPv4 rules 41 if [ ! -f /etc/iptables/rules.v4 ]; then 42 log_action_cont_msg " skipping IPv4 (no rules to load)" 43 else 44 log_action_cont_msg " IPv4" 45 iptables-restore < /etc/iptables/rules.v4 2> /dev/null 46 if [ $? -ne 0 ]; then 47 rc=1 48 fi 49 fi 50 51 #load IPv6 rules 52 if [ ! -f /etc/iptables/rules.v6 ]; then 53 log_action_cont_msg " skipping IPv6 (no rules to load)" 54 else 55 log_action_cont_msg " IPv6" 56 ip6tables-restore < /etc/iptables/rules.v6 2> /dev/null 57 if [ $? -ne 0 ]; then 58 rc=1 59 fi 60 fi 61 62 log_action_end_msg $rc 63 } 64 65 save_rules() 66 { 67 log_action_begin_msg "Saving rules" 68 69 #save IPv4 rules 70 #need at least iptable_filter loaded: 71 /sbin/modprobe -q iptable_filter 72 if [ ! -f /proc/net/ip_tables_names ]; then 73 log_action_cont_msg " skipping IPv4 (no modules loaded)" 74 elif [ -x /sbin/iptables-save ]; then 75 log_action_cont_msg " IPv4" 76 iptables-save > /etc/iptables/rules.v4 77 if [ $? -ne 0 ]; then 78 rc=1 79 fi 80 fi 81 82 #save IPv6 rules 83 #need at least ip6table_filter loaded: 84 /sbin/modprobe -q ip6table_filter 85 if [ ! -f /proc/net/ip6_tables_names ]; then 86 log_action_cont_msg " skipping IPv6 (no modules loaded)" 87 elif [ -x /sbin/ip6tables-save ]; then 88 log_action_cont_msg " IPv6" 89 ip6tables-save > /etc/iptables/rules.v6 90 if [ $? -ne 0 ]; then 91 rc=1 92 fi 93 fi 94 95 #save IPset rules 96 #need at least ip_set loaded: 97 /sbin/modprobe -q ip_set 98 if [ ! -f /proc/net/ip6_tables_names ]; then 99 log_action_cont_msg " skipping IPset (no modules loaded)" 100 elif [ -x "$(command -v ipset)" ]; then 101 log_action_cont_msg " IPset" 102 ipset save > /etc/iptables/rules.set 103 if [ $? -ne 0 ]; then 104 rc=1 105 fi 106 fi 107 108 log_action_end_msg $rc 109 } 110 111 flush_rules() 112 { 113 log_action_begin_msg "Flushing rules" 114 115 if [ ! -f /proc/net/ip_tables_names ]; then 116 log_action_cont_msg " skipping IPv4 (no module loaded)" 117 elif [ -x /sbin/iptables ]; then 118 log_action_cont_msg " IPv4" 119 for param in F Z X; do /sbin/iptables -$param; done 120 for table in $(cat /proc/net/ip_tables_names) 121 do 122 /sbin/iptables -t $table -F 123 /sbin/iptables -t $table -Z 124 /sbin/iptables -t $table -X 125 done 126 for chain in INPUT FORWARD OUTPUT 127 do 128 /sbin/iptables -P $chain ACCEPT 129 done 130 fi 131 132 if [ ! -f /proc/net/ip6_tables_names ]; then 133 log_action_cont_msg " skipping IPv6 (no module loaded)" 134 elif [ -x /sbin/ip6tables ]; then 135 log_action_cont_msg " IPv6" 136 for param in F Z X; do /sbin/ip6tables -$param; done 137 for table in $(cat /proc/net/ip6_tables_names) 138 do 139 /sbin/ip6tables -t $table -F 140 /sbin/ip6tables -t $table -Z 141 /sbin/ip6tables -t $table -X 142 done 143 for chain in INPUT FORWARD OUTPUT 144 do 145 /sbin/ip6tables -P $chain ACCEPT 146 done 147 fi 148 149 if [ -x "$(command -v ipset)" ]; then 150 log_action_cont_msg " IPSet" 151 ipset -F 152 else 153 log_action_cont_msg " skipping IPSet" 154 fi 155 156 log_action_end_msg 0 157 } 158 159 case "$1" in 160 start|restart|reload|force-reload) 161 load_rules 162 ;; 163 save) 164 save_rules 165 ;; 166 stop) 167 # Why? because if stop is used, the firewall gets flushed for a variable 168 # amount of time during package upgrades, leaving the machine vulnerable 169 # It's also not always desirable to flush during purge 170 echo "Automatic flushing disabled, use \"flush\" instead of \"stop\"" 171 ;; 172 flush) 173 flush_rules 174 ;; 175 *) 176 echo "Usage: $0 {start|restart|reload|force-reload|save|flush}" >&2 177 exit 1 178 ;; 179 esac 180 181 exit $rc