Rev 33 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#!/bin/sh## ip6tables Start ip6tables firewall## chkconfig: 2345 08 92# description: Starts, stops and saves ip6tables firewall## config: /etc/sysconfig/ip6tables# config: /etc/sysconfig/ip6tables-config#### BEGIN INIT INFO# Provides: ip6tables# Required-Start:# Required-Stop:# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: start and stop ip6tables firewall# Description: Start, stop and save ip6tables firewall### END INIT INFO# Source function library.. /etc/init.d/functionsIP6TABLES=ip6tablesIP6TABLES_DATA=/etc/sysconfig/$IP6TABLESIP6TABLES_FALLBACK_DATA=${IP6TABLES_DATA}.fallbackIP6TABLES_CONFIG=/etc/sysconfig/${IP6TABLES}-configIPV=${IP6TABLES%tables} # ip for ipv4 | ip6 for ipv6[ "$IPV" = "ip" ] && _IPV="ipv4" || _IPV="ipv6"PROC_IP6TABLES_NAMES=/proc/net/${IPV}_tables_namesVAR_SUBSYS_IP6TABLES=/var/lock/subsys/$IP6TABLES# only usable for rootif [ $EUID != 0 ]; thenecho -n $"${IP6TABLES}: Only usable by root."; warning; echoexit 4fiif [ ! -x /sbin/$IP6TABLES ]; thenecho -n $"${IP6TABLES}: /sbin/$IP6TABLES 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:IP6TABLES_MODULES=""IP6TABLES_MODULES_UNLOAD="yes"IP6TABLES_SAVE_ON_STOP="no"IP6TABLES_SAVE_ON_RESTART="no"IP6TABLES_SAVE_COUNTER="no"IP6TABLES_STATUS_NUMERIC="yes"IP6TABLES_STATUS_VERBOSE="no"IP6TABLES_STATUS_LINENUMBERS="yes"IP6TABLES_SYSCTL_LOAD_LIST=""# Load firewall configuration.[ -f "$IP6TABLES_CONFIG" ] && . "$IP6TABLES_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_IP6TABLES_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_IP6TABLES_NAMES" ] && return 0# Check if firewall is configured (has tables)[ -z "$NF_TABLES" ] && return 1echo -n $"${IP6TABLES}: Flushing firewall rules: "ret=0# For all tablesfor i in $NF_TABLES; do# Flush firewall rules.$IP6TABLES -t $i -F;let ret+=$?;# Delete firewall chains.$IP6TABLES -t $i -X;let ret+=$?;# Set counter to zero.$IP6TABLES -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_IP6TABLES_NAMES" ] && return 0# Check if firewall is configured (has tables)tables=$(cat "$PROC_IP6TABLES_NAMES" 2>/dev/null)[ -z "$tables" ] && return 1echo -n $"${IP6TABLES}: Setting chains to policy $policy: "ret=0for i in $tables; doecho -n "$i "case "$i" inraw)$IP6TABLES -t raw -P PREROUTING $policy \&& $IP6TABLES -t raw -P OUTPUT $policy \|| let ret+=1;;filter)$IP6TABLES -t filter -P INPUT $policy \&& $IP6TABLES -t filter -P OUTPUT $policy \&& $IP6TABLES -t filter -P FORWARD $policy \|| let ret+=1;;nat)$IP6TABLES -t nat -P PREROUTING $policy \&& $IP6TABLES -t nat -P POSTROUTING $policy \&& $IP6TABLES -t nat -P OUTPUT $policy \|| let ret+=1;;mangle)$IP6TABLES -t mangle -P PREROUTING $policy \&& $IP6TABLES -t mangle -P POSTROUTING $policy \&& $IP6TABLES -t mangle -P INPUT $policy \&& $IP6TABLES -t mangle -P OUTPUT $policy \&& $IP6TABLES -t mangle -P FORWARD $policy \|| let ret+=1;;security)# Ignore the security table;;*)let ret+=1;;esacdone[ $ret -eq 0 ] && success || failureechoreturn $ret}load_sysctl() {# load matched sysctl valuesif [ -n "$IP6TABLES_SYSCTL_LOAD_LIST" ]; thenecho -n $"Loading sysctl settings: "ret=0for item in $IP6TABLES_SYSCTL_LOAD_LIST; dofgrep -hs $item /etc/sysctl.conf /etc/sysctl.d/*.conf | sysctl -p - >/dev/nulllet ret+=$?;done[ $ret -eq 0 ] && success || failureechofireturn $ret}start() {# Do not start if there is no config file.if [ ! -f "$IP6TABLES_DATA" ]; thenecho -n $"${IP6TABLES}: No config file."; warning; echoreturn 6fi# 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 $"${IP6TABLES}: ${_IPV} is disabled."return 150fiecho -n $"${IP6TABLES}: Applying firewall rules: "OPT=[ "x$IP6TABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c"$IP6TABLES-restore $OPT $IP6TABLES_DATAif [ $? -eq 0 ]; thensuccess; echoelsefailure; echo;if [ -f "$IP6TABLES_FALLBACK_DATA" ]; thenecho -n $"${IP6TABLES}: Applying firewall fallback rules: "$IP6TABLES-restore $OPT $IP6TABLES_FALLBACK_DATAif [ $? -eq 0 ]; thensuccess; echoelsefailure; echo; return 1fielsereturn 1fifi# Load additional modules (helpers)if [ -n "$IP6TABLES_MODULES" ]; thenecho -n $"${IP6TABLES}: Loading additional modules: "ret=0for mod in $IP6TABLES_MODULES; doecho -n "$mod "modprobe $mod > /dev/null 2>&1let ret+=$?;done[ $ret -eq 0 ] && success || failureechofi# Load sysctl settingsload_sysctltouch $VAR_SUBSYS_IP6TABLESreturn $ret}stop() {# Do not stop if ip6tables module is not loaded.[ ! -e "$PROC_IP6TABLES_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$IP6TABLES_MODULES_UNLOAD" = "xyes" ]; thenecho -n $"${IP6TABLES}: 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_IP6TABLESreturn $ret}save() {# Check if iptable module is loadedif [ ! -e "$PROC_IP6TABLES_NAMES" ]; thenecho -n $"${IP6TABLES}: Nothing to save."; warning; echoreturn 0fi# Check if firewall is configured (has tables)if [ -z "$NF_TABLES" ]; thenecho -n $"${IP6TABLES}: Nothing to save."; warning; echoreturn 6fiecho -n $"${IP6TABLES}: Saving firewall rules to $IP6TABLES_DATA: "OPT=[ "x$IP6TABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c"ret=0TMP_FILE=$(/bin/mktemp -q $IP6TABLES_DATA.XXXXXX) \&& chmod 600 "$TMP_FILE" \&& $IP6TABLES-save $OPT > $TMP_FILE 2>/dev/null \&& size=$(stat -c '%s' $TMP_FILE) && [ $size -gt 0 ] \|| ret=1if [ $ret -eq 0 ]; thenif [ -e $IP6TABLES_DATA ]; thencp -f $IP6TABLES_DATA $IP6TABLES_DATA.save \&& chmod 600 $IP6TABLES_DATA.save \&& restorecon $IP6TABLES_DATA.save \|| ret=1fiif [ $ret -eq 0 ]; thenmv -f $TMP_FILE $IP6TABLES_DATA \&& chmod 600 $IP6TABLES_DATA \&& restorecon $IP6TABLES_DATA \|| ret=1fifirm -f $TMP_FILE[ $ret -eq 0 ] && success || failureechoreturn $ret}status() {if [ ! -f "$VAR_SUBSYS_IP6TABLES" -a -z "$NF_TABLES" ]; thenecho $"${IP6TABLES}: Firewall is not running."return 3fi# Do not print status if lockfile is missing and ip6tables modules are not# loaded.# Check if iptable modules are loadedif [ ! -e "$PROC_IP6TABLES_NAMES" ]; thenecho $"${IP6TABLES}: Firewall modules are not loaded."return 3fi# Check if firewall is configured (has tables)if [ -z "$NF_TABLES" ]; thenecho $"${IP6TABLES}: Firewall is not configured. "return 3fiNUM=[ "x$IP6TABLES_STATUS_NUMERIC" = "xyes" ] && NUM="-n"VERBOSE=[ "x$IP6TABLES_STATUS_VERBOSE" = "xyes" ] && VERBOSE="--verbose"COUNT=[ "x$IP6TABLES_STATUS_LINENUMBERS" = "xyes" ] && COUNT="--line-numbers"for table in $NF_TABLES; doecho $"Table: $table"$IP6TABLES -t $table --list $NUM $VERBOSE $COUNT && echodonereturn 0}reload() {# Do not reload if there is no config file.if [ ! -f "$IP6TABLES_DATA" ]; thenecho -n $"${IP6TABLES}: No config file."; warning; echoreturn 6fi# 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 $"${IP6TABLES}: ${_IPV} is disabled."return 150fiecho -n $"${IP6TABLES}: Trying to reload firewall rules: "OPT=[ "x$IP6TABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c"$IP6TABLES-restore $OPT $IP6TABLES_DATAif [ $? -eq 0 ]; thensuccess; echoelsefailure; echo; echo "Firewall rules are not changed."; return 1fi# Load additional modules (helpers)if [ -n "$IP6TABLES_MODULES" ]; thenecho -n $"${IP6TABLES}: Loading additional modules: "ret=0for mod in $IP6TABLES_MODULES; doecho -n "$mod "modprobe $mod > /dev/null 2>&1let ret+=$?;done[ $ret -eq 0 ] && success || failureechofi# Load sysctl settingsload_sysctlreturn $ret}restart() {[ "x$IP6TABLES_SAVE_ON_RESTART" = "xyes" ] && savestopstart}case "$1" instart)[ -f "$VAR_SUBSYS_IP6TABLES" ] && exit 0startRETVAL=$?;;stop)[ "x$IP6TABLES_SAVE_ON_STOP" = "xyes" ] && savestopRETVAL=$?;;restart|force-reload)restartRETVAL=$?;;reload)[ -e "$VAR_SUBSYS_IP6TABLES" ] && reloadRETVAL=$?;;condrestart|try-restart)[ ! -e "$VAR_SUBSYS_IP6TABLES" ] && exit 0restartRETVAL=$?;;status)statusRETVAL=$?;;panic)set_policy DROPRETVAL=$?;;save)saveRETVAL=$?;;*)echo $"Usage: ${IP6TABLES} {start|stop|reload|restart|condrestart|status|panic|save}"RETVAL=2;;esacexit $RETVAL