#!/bin/bash # # Configures the 6to4 address based on the ip address of the interface to which # the default route points. # Parameter 1: action (start, stop, restart) # 2: interface SLA (optional) # 3: interface ID (optional) # 4: interface prefix (optional) # 5: IPv6 relay address (optional) # # Variable parameters. TUN_INTF used for start and stop, all others only start # No validation of input at all!! TUN_INTF=${2:-tun6to4} SLA_INTF=${3:-0} INTF_ID=${4:-1} INTF_PFX=${5:-48} TUN_RELY=${6:-192.88.99.1} case "${1}" in start) # Clean up before configuring the tunnel $0 stop ${TUN_INTF} # IPv6 ready? [ -f /proc/net/if_inet6 ] || exit 0 # Grab the device of the default route (may be # multiple -> CUR_DV is an array) CUR_DV=(`ip -4 route list | awk '/^default / { print $0 }' | \ sed 's/.* dev \([^ ]\+\).*$/\1/'`) # Is there any device? Or no default route at all?? if [ -z ${CUR_DV} ]; then echo "No default route. Cannot determine IPv4 address to use" exit 0 fi # We simply take the device from the first default route CUR_IP=(`ip -4 addr show ${CUR_DV} | awk '/inet / { print $2 }' | \ sed -e 's/^\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*$/\1/'`) # Find the MTU on the interface used for the tunnel DEV_MTU=`ip link show ${CUR_DV} | tr '\n' ' ' | \ sed 's/.* mtu \([0-9]\+\).*$/\1/'` # Multiple IP addresses may be defined on device. First one is ours. # Add the tunnel. The local address is the one found from default route. ip tunnel add ${TUN_INTF} mode sit remote any local ${CUR_IP} # Bring the tunnel up. ip link set dev ${TUN_INTF} mtu `expr ${DEV_MTU} - 20` up # Add the interface address IPV6_ADDR=$(printf "2002:%02x%02x:%02x%02x:%04x::%04x" \ $(echo "${CUR_IP} ${SLA_INTF} ${INTF_ID}" | tr '.' ' ')) ip -6 addr add ${IPV6_ADDR}/${INTF_PFX} dev ${TUN_INTF} # Add the routes ip -6 route add 2002::/16 dev ${TUN_INTF} ip -6 route add ::/0 via ::${TUN_RELY} dev ${TUN_INTF} metric 1 # Notify echo "6to4 tunnel '${TUN_INTF}' created." \ "IPv6 address: ${IPV6_ADDR}/${INTF_PFX}, IPv6 relay: ${TUN_RELY}" ;; stop) # Skip if device is not configured ip link list ${TUN_INTF} > /dev/null 2>&1 if [ $? = 0 ]; then # Remove all routes going through this device ip -6 route flush dev ${TUN_INTF} # Disable the link ip link set dev ${TUN_INTF} down # Delete the device ip tunnel del ${TUN_INTF} # Notify echo "6to4 tunnel '${TUN_INTF}' removed." fi ;; restart) $0 stop ${2} $0 start ${2} ${3} ${4} ${5} ;; *) echo "Usage: `basename $0` (start|restart)" \ "[ [ [ [ []]]]]" echo " `basename $0` stop []" ;; esac