#!/bin/sh -e # Dynamic Multipoint VPN setup script for Alpine Linux # Copyright (c) 2017-2018 Kaarle Ritvanen # See LICENSE file for license details . /lib/libalpine.sh if [ -z "$1" ]; then echo "Usage: $0 " >&2 exit 1 fi ATTRS=$(/usr/libexec/dmvpn-pfx-decode "$1") eval $ATTRS for attr in GRE_IPV4_ADDRESS HUBS VPNC_TYPE; do eval "[ \"\$$attr\" ]" || die "attribute not defined: $attr" done ask "NHRP network ID" 1 NHRP_ID=$resp NFLOG_GROUP= if [ $VPNC_TYPE = hub ]; then ask "NFLOG group" 1 NFLOG_GROUP=$resp ask "DMVPN site IPv4 prefix length" 16 SITE_PREFIX_LEN_IPV4=$resp if [ "$GRE_IPV6_ADDRESS" ]; then ask "DMVPN site IPv6 prefix length" 48 SITE_PREFIX_LEN_IPV6=$resp fi fi GRE_MODULE=nf_conntrack_proto_gre PMTU_SYSCTL=net.ipv4.ip_forward_use_pmtu get_dev() { sed -E "s/^$* (.+ )?dev ([^ ]+)( .+)?\$/\\2/;ta;d;:a" } get_local_dev() { ip route list table local | get_dev local $1 } is_active() { rc-service $1 status > /dev/null } enable_service() { if is_active $1; then rc-service $1 restart else rc-update add $1 rc-service $1 start fi } enable_firewall() { augtool -s < /dev/null; then host $h | sed -E 's/^.+ has address //;ta;d;:a' else echo $h fi done | while read addr; do if [ -z "$(get_local_dev $addr)" ]; then ip route get $addr | get_dev $addr break fi done) TRANSPORT_IFACE=$resp i=1 while [ -d /sys/class/net/gre$i ]; do : $(( i++ )) done ask "GRE tunnel interface" gre$i GRE_IFACE=$resp echo "$PMTU_SYSCTL = 1" > /etc/sysctl.d/dmvpn.conf sysctl -w $PMTU_SYSCTL=1 cat >> /etc/network/interfaces <> /etc/network/interfaces < \ /etc/awall/dmvpn-config.json if [ "$NFLOG_GROUP" ]; then cat > /etc/nhrp-events.conf <> /etc/nhrp-events.conf < /etc/modules-load.d/dmvpn.conf fi enable_firewall iptables [ -f /etc/iptables/rules6-save -o "$SITE_PREFIX_LEN_IPV6" ] && \ enable_firewall ip6tables fi