#!/bin/bash set -x set -e [ -f /root/strongswan-config ] && . /root/strongswan-config ||: ETC=${ETC:=/etc/strongswan} SWAND="$ETC/strongswan.d" IPSECD="$ETC/ipsec.d" SWANC="$ETC/swanctl" NOWSEC=`date +%s` SWAN_LIBX=${SWAN_LIBX:=/usr/libexec/strongswan} [ -d $SWAN_LIBX ] || { echo "SWAN_LIBX $SWAN_LIBX not found. Plese set SWAN_LIBX in /root/strongswan-config" exit 1 } export LD_LIBRARY_PATH="$SWAN_LIBX:$LD_LIBRARY_PATH" WAN_IF=${WAN_IF:=eth1} WAN_IP=${WAN_IP:=10.1.99.1} WAN_CONCENTRATOR_IP=${WAN_CONCENTRATOR_IP:=10.1.99.1} XIF_IP=${XIF_IP:=10.9.99.1} function initialize_vrf() { local WANDEV=$WAN_IF local VRFID=$1 local VRFDEV=vrf$VRFID local XFRMDEV=xfrm$VRFID # do you need this? #sysctl -w net.ipv4.ip_forward=1 #sysctl -w net.ipv4.conf.all.rp_filter=0 # setup vrf ip link add $VRFDEV type vrf table $VRFID ip link set dev $VRFDEV up ip route add unreachable default metric 4278198272 vrf $VRFDEV # create tunnel device ip li del $XFRMDEV >/dev/null 2>&1 $SWAN_LIBX/xfrmi -n $XFRMDEV -i $VRFID -d $WANDEV ip li set dev $XFRMDEV up ip li set dev $XFRMDEV master $VRFDEV ip add add 169.254.24.201/32 dev $XFRMDEV scope link ip ro add default dev $XFRMDEV vrf $VRFDEV ip -6 ro add default dev $XFRMDEV vrf $VRFDEV } function initialize_fake_client_netns() { local VRFID=$1 sysctl net.ipv4.conf.all.rp_filter=0 sysctl net.ipv4.conf.default.rp_filter=0 ip netns add ts-vrf-${VRFID} ip netns exec ts-vrf-${VRFID} ip li set dev lo up ip li del ts-vrf-${VRFID}a ip link add ts-vrf-${VRFID}a type veth peer name ts-vrf-${VRFID}b netns ts-vrf-${VRFID} ip netns exec ts-vrf-${VRFID} ip link set dev ts-vrf-${VRFID}b up ip netns exec ts-vrf-${VRFID} ip add add dev ts-vrf-${VRFID}b 10.0.201.2/24 ip netns exec ts-vrf-${VRFID} ip ro add default via 10.0.201.1 ip li set dev ts-vrf-${VRFID}a up ip li set dev ts-vrf-${VRFID}a master vrf${VRFID} ip add add 10.0.201.1/24 dev ts-vrf-${VRFID}a } function initialize() { [ -d "$SWANC/peers-available" ] || mkdir "$SWANC/peers-available" [ -d "$SWANC/peers-enabled" ] || mkdir "$SWANC/peers-enabled" [ -f "$SWANC/secrets.conf" ] || touch "$SWANC/secrets.conf" systemctl enable strongswan systemctl daemon-reload systemct start strongswan || { journalctl -xe } } function vrf_ping() { local vrfid=$1 ip netns exec ts-vrf-$vrfid ping 10.0.201.2 } function backup_keys() { if [ -f $SWANC/secrets.conf ]; then cp $SWANC/secrets.conf $SWANC/.secrets.conf.$NOWSEC fi } function deactivate_peer() { [ -e "$SWANC/peers-enabled/${1}.conf" ] || { if [ -e "$SWANC/peers-available/${1}.conf" ]; then echo "Peer $1 deactivated." else echo "No peer config at $SWANC/peers-available/${1}.conf" fi exit 0 } echo -n "Deactivating $1..." rm "$SWANC/peers-enabled/${1}.conf" swanctl --load-all echo "done" } function activate_peer() { [ -f "$SWANC/peers-available/${1}.conf" ] || { echo "No peer config at $SWANC/peers-available/${1}.conf" exit 1 } if [ -e "$SWANC/peers-enabled/${1}.conf" ]; then echo "Peer $1 actiated." else echo -n "Activating $1..." ln -s" $SWANC/peers-available/${1}.conf" "$SWANC/peers-enabled/" swanctl --load-all echo "done" fi } function create_concentrator_peer() { if [ -f "$SWANC/peers-available/${1}.conf" ]; then echo "Peer $1 config already exists." return; fi cat > "$SWANC/peers-available/${1}.conf" < "$SWANC/peers-available/${1}.conf-remote" <> "$SWANC/secrets.conf" < $SWANC/${1}-secrets.conf-remote echo "created $SWANC/${1}-secrets.conf-remote" } function get_vrf_for_if() { local ifmaster=`ip -o li show $1 | egrep -o '(master \S+)'` [[ x$ifmaster = x ]] && echo "No master found for $1" echo ${ifmaster#master } } function enable_ipsec_if() { vrfnum=$(get_vrf_for_if $WAN_IF) xif="xfrm${vrfnum}" $SWAN_LIBX/xfrmi -n $xif -i ${vrfnum} -d $WAN_IF ||: ip link set dev $xif up ||: ip link set dev $xif master vrf${vrfnum} ||: ip address add $XIF_IP/32 dev $xif scope link ||: ip route add default dev $xif vrf $vrfnum ||: ip route add 10.0.0.0/8 dev $xif vrf $vrfnum ||: } function check_arg() { if [ ! -f "$SWANC/secrets.conf" ] ; then echo "$SWANC/secrets.conf not found. Suggest running $0 -i, bye." exit 1 fi [[ z$1 != z ]] || { echo "Please give me a peer name, bye." exit 1 } } function activate_all() { local f for f in $SWANC/*.conf; do echo "CONF $f" f=`basename $f` [[ $f = secrets.conf ]] && continue ||: [[ $f = swanctl.conf ]] && continue ||: [[ $f = *.conf ]] && f=${f%.conf} echo "f now $f" activate_peer $f done } function copy_config() { local vrf=`get_vrf_for_if $WAN_IF` ip vrf exec $vrf scp $WAN_IP:$SWANC/${1}-secrets.conf-remote $SWANC/${1}-secrets.conf ip vrf exec $vrf scp $WAN_IP:$SWANC/peers-available/${1}.conf-remote $SWANC/peers-available/${1}.conf } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # M A I N # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - while getopts "a:c:d:f:p:v:behi" arg; do case $arg in a) check_arg $OPTARG echo "Activating $OPTARG" activate_peer $OPTARG ;; b) enable_ipsec_if $WAN_IF ;; c) check_arg $OPTARG echo "Creating $OPTARG" create_concentrator_peer $OPTARG create_station_peer $OPTARG create_concentrator_key $OPTARG create_station_key $OPTARG ;; d) check_arg $OPTARG echo "Deactivating $OPTARG" deactivate_peer $OPTARG ;; e) activate_all ;; f) check_arg $OPTARG copy_config $OPTARG ;; h) cat <