Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#!/bin/sh## iptables Start iptables firewall## chkconfig: 2345 08 92# description: Starts, stops and saves iptables firewall## config: /etc/sysconfig/iptables# config: /etc/sysconfig/iptables-config#### BEGIN INIT INFO# Provides: iptables# Required-Start:# Required-Stop:# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: start and stop iptables firewall# Description: Start, stop and save iptables firewall### END INIT INFO# Source function library.. /etc/init.d/functionsIPTABLES=iptablesIPTABLES_DATA=/etc/sysconfig/$IPTABLESIPTABLES_FALLBACK_DATA=${IPTABLES_DATA}.fallbackIPTABLES_CONFIG=/etc/sysconfig/${IPTABLES}-configIPV=${IPTABLES%tables} # ip for ipv4 | ip6 for ipv6[ "$IPV" = "ip" ] && _IPV="ipv4" || _IPV="ipv6"PROC_IPTABLES_NAMES=/proc/net/${IPV}_tables_namesVAR_SUBSYS_IPTABLES=/var/lock/subsys/$IPTABLES# only usable for root[ $EUID = 0 ] || exit 4if [ ! -x /sbin/$IPTABLES ]; thenecho -n $"${IPTABLES}: /sbin/$IPTABLES does not exist."; warning; echoexit 5fi# Old or new modutils/sbin/modprobe --version 2>&1 | grep -q module-init-tools \&& NEW_MODUTILS=1 \|| NEW_MODUTILS=0# Default firewall configuration:IPTABLES_MODULES=""IPTABLES_MODULES_UNLOAD="yes"IPTABLES_SAVE_ON_STOP="no"IPTABLES_SAVE_ON_RESTART="no"IPTABLES_SAVE_COUNTER="no"IPTABLES_STATUS_NUMERIC="yes"IPTABLES_STATUS_VERBOSE="no"IPTABLES_STATUS_LINENUMBERS="yes"IPTABLES_SYSCTL_LOAD_LIST=""# Load firewall configuration.[ -f "$IPTABLES_CONFIG" ] && . "$IPTABLES_CONFIG"# Netfilter modulesNF_MODULES=($(lsmod | awk "/^${IPV}table_/ {print \$1}") ${IPV}_tables)NF_MODULES_COMMON=(x_tables nf_nat nf_conntrack) # Used by netfilter v4 and v6# Get active tablesNF_TABLES=$(cat "$PROC_IPTABLES_NAMES" 2>/dev/null)rmmod_r() {# Unload module with all referring modules.# At first all referring modules will be unloaded, then the module itself.local mod=$1local ret=0local ref=# Get referring modules.# New modutils have another output format.[ $NEW_MODUTILS = 1 ] \&& ref=$(lsmod | awk "/^${mod}/ { print \$4; }" | tr ',' ' ') \|| ref=$(lsmod | grep ^${mod} | cut -d "[" -s -f 2 | cut -d "]" -s -f 1)# recursive call for all referring modulesfor i in $ref; dormmod_r $ilet ret+=$?;done# Unload module.# The extra test is for 2.6: The module might have autocleaned,# after all referring modules are unloaded.if grep -q "^${mod}" /proc/modules ; thenmodprobe -r $mod > /dev/null 2>&1res=$?[ $res -eq 0 ] || echo -n " $mod"let ret+=$res;fireturn $ret}flush_n_delete() {# Flush firewall rules and delete chains.[ ! -e "$PROC_IPTABLES_NAMES" ] && return 0# Check if firewall is configured (has tables)[ -z "$NF_TABLES" ] && return 1echo -n $"${IPTABLES}: Flushing firewall rules: "ret=0# For all tablesfor i in $NF_TABLES; do# Flush firewall rules.$IPTABLES -t $i -F;let ret+=$?;# Delete firewall chains.$IPTABLES -t $i -X;let ret+=$?;# Set counter to zero.$IPTABLES -t $i -Z;let ret+=$?;done[ $ret -eq 0 ] && success || failureechoreturn $ret}set_policy() {# Set policy for configured tables.policy=$1# Check if iptable module is loaded[ ! -e "$PROC_IPTABLES_NAMES" ] && return 0# Check if firewall is configured (has tables)tables=$(cat "$PROC_IPTABLES_NAMES" 2>/dev/null)[ -z "$tables" ] && return 1echo -n $"${IPTABLES}: Setting chains to policy $policy: "ret=0for i in $tables; doecho -n "$i "case "$i" inraw)$IPTABLES -t raw -P PREROUTING $policy \&& $IPTABLES -t raw -P OUTPUT $policy \|| let ret+=1;;filter)$IPTABLES -t filter -P INPUT $policy \&& $IPTABLES -t filter -P OUTPUT $policy \&& $IPTABLES -t filter -P FORWARD $policy \|| let ret+=1;;nat)$IPTABLES -t nat -P PREROUTING $policy \&& $IPTABLES -t nat -P POSTROUTING $policy \&& $IPTABLES -t nat -P OUTPUT $policy \|| let ret+=1;;mangle)$IPTABLES -t mangle -P PREROUTING $policy \&& $IPTABLES -t mangle -P POSTROUTING $policy \&& $IPTABLES -t mangle -P INPUT $policy \&& $IPTABLES -t mangle -P OUTPUT $policy \&& $IPTABLES -t mangle -P FORWARD $policy \|| let ret+=1;;*)let ret+=1;;esacdone[ $ret -eq 0 ] && success || failureechoreturn $ret}load_sysctl() {# load matched sysctl valuesif [ -n "$IPTABLES_SYSCTL_LOAD_LIST" ]; thenecho -n $"Loading sysctl settings: "ret=0for item in $IPTABLES_SYSCTL_LOAD_LIST; dofgrep $item /etc/sysctl.conf | sysctl -p - >/dev/nulllet ret+=$?;done[ $ret -eq 0 ] && success || failureechofireturn $ret}start() {# Do not start if there is no config file.[ ! -f "$IPTABLES_DATA" ] && return 6# check if ipv6 module load is deactivatedif [ "${_IPV}" = "ipv6" ] \&& grep -qIsE "^install[[:space:]]+${_IPV}[[:space:]]+/bin/(true|false)" /etc/modprobe.conf /etc/modprobe.d/* ; thenecho $"${IPTABLES}: ${_IPV} is disabled."return 150fiecho -n $"${IPTABLES}: Applying firewall rules: "OPT=[ "x$IPTABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c"$IPTABLES-restore $OPT $IPTABLES_DATAif [ $? -eq 0 ]; thensuccess; echoelsefailure; echo;if [ -f "$IPTABLES_FALLBACK_DATA" ]; thenecho -n $"${IPTABLES}: Applying firewall fallback rules: "$IPTABLES-restore $OPT $IPTABLES_FALLBACK_DATAif [ $? -eq 0 ]; thensuccess; echoelsefailure; echo; return 1fielsereturn 1fifi# Load additional modules (helpers)if [ -n "$IPTABLES_MODULES" ]; thenecho -n $"${IPTABLES}: Loading additional modules: "ret=0for mod in $IPTABLES_MODULES; doecho -n "$mod "modprobe $mod > /dev/null 2>&1let ret+=$?;done[ $ret -eq 0 ] && success || failureechofi# Load sysctl settingsload_sysctltouch $VAR_SUBSYS_IPTABLESreturn $ret}stop() {# Do not stop if iptables module is not loaded.[ ! -e "$PROC_IPTABLES_NAMES" ] && return 0# Set default chain policy to ACCEPT, in order to not break shutdown# on systems where the default policy is DROP and root device is# network-based (i.e.: iSCSI, NFS)set_policy ACCEPT# And then, flush the rules and delete chainsflush_n_deleteif [ "x$IPTABLES_MODULES_UNLOAD" = "xyes" ]; thenecho -n $"${IPTABLES}: Unloading modules: "ret=0for mod in ${NF_MODULES[*]}; dormmod_r $modlet ret+=$?;done# try to unload remaining netfilter modules used by ipv4 and ipv6# netfilterfor mod in ${NF_MODULES_COMMON[*]}; dormmod_r $mod >/dev/nulldone[ $ret -eq 0 ] && success || failureechofirm -f $VAR_SUBSYS_IPTABLESreturn $ret}save() {# Check if iptable module is loaded[ ! -e "$PROC_IPTABLES_NAMES" ] && return 0# Check if firewall is configured (has tables)[ -z "$NF_TABLES" ] && return 6echo -n $"${IPTABLES}: Saving firewall rules to $IPTABLES_DATA: "OPT=[ "x$IPTABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c"ret=0TMP_FILE=$(/bin/mktemp -q $IPTABLES_DATA.XXXXXX) \&& chmod 600 "$TMP_FILE" \&& $IPTABLES-save $OPT > $TMP_FILE 2>/dev/null \&& size=$(stat -c '%s' $TMP_FILE) && [ $size -gt 0 ] \|| ret=1if [ $ret -eq 0 ]; thenif [ -e $IPTABLES_DATA ]; thencp -f $IPTABLES_DATA $IPTABLES_DATA.save \&& chmod 600 $IPTABLES_DATA.save \&& restorecon $IPTABLES_DATA.save \|| ret=1fiif [ $ret -eq 0 ]; thenmv -f $TMP_FILE $IPTABLES_DATA \&& chmod 600 $IPTABLES_DATA \&& restorecon $IPTABLES_DATA \|| ret=1fifirm -f $TMP_FILE[ $ret -eq 0 ] && success || failureechoreturn $ret}status() {if [ ! -f "$VAR_SUBSYS_IPTABLES" -a -z "$NF_TABLES" ]; thenecho $"${IPTABLES}: Firewall is not running."return 3fi# Do not print status if lockfile is missing and iptables modules are not# loaded.# Check if iptable modules are loadedif [ ! -e "$PROC_IPTABLES_NAMES" ]; thenecho $"${IPTABLES}: Firewall modules are not loaded."return 3fi# Check if firewall is configured (has tables)if [ -z "$NF_TABLES" ]; thenecho $"${IPTABLES}: Firewall is not configured. "return 3fiNUM=[ "x$IPTABLES_STATUS_NUMERIC" = "xyes" ] && NUM="-n"VERBOSE=[ "x$IPTABLES_STATUS_VERBOSE" = "xyes" ] && VERBOSE="--verbose"COUNT=[ "x$IPTABLES_STATUS_LINENUMBERS" = "xyes" ] && COUNT="--line-numbers"for table in $NF_TABLES; doecho $"Table: $table"$IPTABLES -t $table --list $NUM $VERBOSE $COUNT && echodonereturn 0}reload() {# Do not reload if there is no config file.[ ! -f "$IPTABLES_DATA" ] && return 6# check if ipv6 module load is deactivatedif [ "${_IPV}" = "ipv6" ] \&& grep -qIsE "^install[[:space:]]+${_IPV}[[:space:]]+/bin/(true|false)" /etc/modprobe.conf /etc/modprobe.d/* ; thenecho $"${IPTABLES}: ${_IPV} is disabled."return 150fiecho -n $"${IPTABLES}: Trying to reload firewall rules: "OPT=[ "x$IPTABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c"$IPTABLES-restore $OPT $IPTABLES_DATAif [ $? -eq 0 ]; thensuccess; echoelsefailure; echo; echo "Firewall rules are not changed."; return 1fi# Load additional modules (helpers)if [ -n "$IPTABLES_MODULES" ]; thenecho -n $"${IPTABLES}: Loading additional modules: "ret=0for mod in $IPTABLES_MODULES; doecho -n "$mod "modprobe $mod > /dev/null 2>&1let ret+=$?;done[ $ret -eq 0 ] && success || failureechofi# Load sysctl settingsload_sysctlreturn $ret}restart() {[ "x$IPTABLES_SAVE_ON_RESTART" = "xyes" ] && savestopstart}case "$1" instart)[ -f "$VAR_SUBSYS_IPTABLES" ] && exit 0startRETVAL=$?;;stop)[ "x$IPTABLES_SAVE_ON_STOP" = "xyes" ] && savestopRETVAL=$?;;restart|force-reload)restartRETVAL=$?;;reload)[ -e "$VAR_SUBSYS_IPTABLES" ] && reloadRETVAL=$?;;condrestart|try-restart)[ ! -e "$VAR_SUBSYS_IPTABLES" ] && exit 0restartRETVAL=$?;;status)statusRETVAL=$?;;panic)set_policy DROPRETVAL=$?;;save)saveRETVAL=$?;;*)echo $"Usage: ${IPTABLES} {start|stop|reload|restart|condrestart|status|panic|save}"RETVAL=2;;esacexit $RETVAL