From: <abe...@us...> - 2017-05-29 16:04:50
|
Revision: 8353 http://sourceforge.net/p/astlinux/code/8353 Author: abelbeck Date: 2017-05-29 16:04:48 +0000 (Mon, 29 May 2017) Log Message: ----------- arnofw, add 'Network Prefix Translation' plugin (NPTv6) Modified Paths: -------------- branches/1.0/package/arnofw/arnofw.mk branches/1.0/package/arnofw/arnofw.serial Added Paths: ----------- branches/1.0/package/arnofw/net-prefix-translation/ branches/1.0/package/arnofw/net-prefix-translation/20net-prefix-translation.plugin.sh branches/1.0/package/arnofw/net-prefix-translation/net-prefix-translation.conf Modified: branches/1.0/package/arnofw/arnofw.mk =================================================================== --- branches/1.0/package/arnofw/arnofw.mk 2017-05-28 18:37:02 UTC (rev 8352) +++ branches/1.0/package/arnofw/arnofw.mk 2017-05-29 16:04:48 UTC (rev 8353) @@ -163,6 +163,13 @@ $(TARGET_DIR)$(ARNOFW_PLUGIN_SCRIPT_DIR)/50miniupnpd.plugin $(INSTALL) -m 0644 package/arnofw/miniupnpd/miniupnpd-astlinux.conf \ $(TARGET_DIR)/stat$(ARNOFW_PLUGIN_CONFIG_DIR)/miniupnpd.conf + @echo + @echo "Install local version of net-prefix-translation plugin." + @echo + $(INSTALL) -m 0644 package/arnofw/net-prefix-translation/20net-prefix-translation.plugin.sh \ + $(TARGET_DIR)$(ARNOFW_PLUGIN_SCRIPT_DIR)/20net-prefix-translation.plugin + $(INSTALL) -m 0644 package/arnofw/net-prefix-translation/net-prefix-translation.conf \ + $(TARGET_DIR)/stat$(ARNOFW_PLUGIN_CONFIG_DIR)/net-prefix-translation.conf arnofw: $(TARGET_DIR)$(ARNOFW_TARGET_BINARY) Modified: branches/1.0/package/arnofw/arnofw.serial =================================================================== --- branches/1.0/package/arnofw/arnofw.serial 2017-05-28 18:37:02 UTC (rev 8352) +++ branches/1.0/package/arnofw/arnofw.serial 2017-05-29 16:04:48 UTC (rev 8353) @@ -1 +1 @@ -0002~0032~0000~0000~0000~ +0002~0033~0000~0000~0000~ Added: branches/1.0/package/arnofw/net-prefix-translation/20net-prefix-translation.plugin.sh =================================================================== --- branches/1.0/package/arnofw/net-prefix-translation/20net-prefix-translation.plugin.sh (rev 0) +++ branches/1.0/package/arnofw/net-prefix-translation/20net-prefix-translation.plugin.sh 2017-05-29 16:04:48 UTC (rev 8353) @@ -0,0 +1,286 @@ +# ------------------------------------------------------------------------------ +# -= Arno's iptables firewall - Network Prefix Translation plugin =- +# +PLUGIN_NAME="Network Prefix Translation plugin" +PLUGIN_VERSION="1.00" +PLUGIN_CONF_FILE="net-prefix-translation.conf" +# +# Last changed : May 28, 2017 +# Requirements : AIF 2.0.1g+, ip6tables NETMAP support +# Comments : NPTv6 (Network Prefix Translation) for IPv6 +# Perform a 1:1 mapping of ULA <-> GUA prefixes +# via the external interface. +# +# Author : (C) Copyright 2017 by Lonnie Abelbeck & Arno van Amersfoort +# Homepage : http://rocky.eld.leidenuniv.nl/ +# Email : a r n o v a AT r o c k y DOT e l d DOT l e i d e n u n i v DOT n l +# (note: you must remove all spaces and substitute the @ and the . +# at the proper locations!) +# ------------------------------------------------------------------------------ +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# version 2 as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# ------------------------------------------------------------------------------ + +NET_PREFIX_TRANSLATION_GLOBAL_IPV6="/var/tmp/aif-net-prefix-translation-global-ipv6" + +net_prefix_translation_global_ipv6() +{ + local lan IFS + + IFS=' ,' + for lan in $NET_PREFIX_TRANSLATION_IF; do + ip -6 -o addr show dev $lan scope global 2>/dev/null \ + | awk '$3 == "inet6" { print $4; }' + done +} + +net_prefix_translation_global_prefix() +{ + local global_prefix prefix len cut_chars prefix_label prefix_len ipv6 ipv6_ex IFS + + global_prefix="" + if [ -n "$NET_PREFIX_TRANSLATION_IF" ]; then + prefix_len="$(echo "$NET_PREFIX_TRANSLATION_GLOBAL_PREFIX" | cut -s -d'/' -f2)" + case $prefix_len in + 64) cut_chars="1-19" + prefix_label="::/64" + ;; + 60) cut_chars="1-18" + prefix_label="0::/60" + ;; + 56) cut_chars="1-17" + prefix_label="00::/56" + ;; + 52) cut_chars="1-16" + prefix_label="000::/52" + ;; + 48) cut_chars="1-15" + prefix_label="0000::/48" + ;; + *) cut_chars="" + prefix_label="" + ;; + esac + + if [ -n "$cut_chars" -a -n "$prefix_label" ]; then + unset IFS + for prefix in $(net_prefix_translation_global_ipv6); do + len="$(echo "$prefix" | sed -n -r -e 's/^[0-9a-fA-F:]+\/([0-9]+)$/\1/p')" + if [ -n "$len" ]; then + if [ $len -ge 32 -a $len -le 64 ]; then + ipv6="$(echo "$prefix" | cut -d'/' -f1)" + ipv6_ex="$(netcalc "$ipv6" | sed -n -r -e 's/^Expanded IPv6 *: *([0-9a-fA-F:]+).*$/\1/p')" + global_prefix="$(echo "$ipv6_ex" | cut -c $cut_chars)" + if [ -n "$global_prefix" ]; then + global_prefix="$global_prefix$prefix_label" + break + fi + fi + fi + done + fi + else + global_prefix="$NET_PREFIX_TRANSLATION_GLOBAL_PREFIX" + fi + + echo "$global_prefix" +} + +# Plugin start function +plugin_start() +{ + local global_prefix local_prefix eif IFS + + #### remove when in main script #### + ip6tables -t nat -F + ip6tables -t nat -X + #### + + ip6tables -t nat -N NET_PREFIX_TRANSLATION_IN 2>/dev/null + ip6tables -t nat -F NET_PREFIX_TRANSLATION_IN + + ip6tables -t nat -N NET_PREFIX_TRANSLATION_OUT 2>/dev/null + ip6tables -t nat -F NET_PREFIX_TRANSLATION_OUT + + global_prefix="$(net_prefix_translation_global_prefix)" + + if [ -z "$global_prefix" ]; then + echo "${INDENT}Network Prefix Translation Global Prefix: Not Found" + return 1 + fi + + local_prefix="$NET_PREFIX_TRANSLATION_LOCAL_PREFIX" + + echo "${INDENT}Network Prefix Translation Global Prefix: $global_prefix" + echo "${INDENT}Network Prefix Translation Local Prefix: $local_prefix" + + IFS=' ,' + for eif in $EXT_IF; do + ip6tables -t nat -A NET_PREFIX_TRANSLATION_IN -i $eif -d $global_prefix -j NETMAP --to $local_prefix + ip6tables -t nat -A NET_PREFIX_TRANSLATION_OUT -o $eif -s $local_prefix -j NETMAP --to $global_prefix + done + + echo "$global_prefix" > "$NET_PREFIX_TRANSLATION_GLOBAL_IPV6" + + ip6tables -t nat -A PREROUTING -j NET_PREFIX_TRANSLATION_IN + ip6tables -t nat -A POSTROUTING -j NET_PREFIX_TRANSLATION_OUT + + return 0 +} + + +# Plugin restart function +plugin_restart() +{ + + # Skip plugin_stop on a restart + plugin_start + + return 0 +} + + +# Plugin stop function +plugin_stop() +{ + + ip6tables -t nat -D PREROUTING -j NET_PREFIX_TRANSLATION_IN + ip6tables -t nat -D POSTROUTING -j NET_PREFIX_TRANSLATION_OUT + + ip6tables -t nat -F NET_PREFIX_TRANSLATION_IN + ip6tables -t nat -X NET_PREFIX_TRANSLATION_IN 2>/dev/null + + ip6tables -t nat -F NET_PREFIX_TRANSLATION_OUT + ip6tables -t nat -X NET_PREFIX_TRANSLATION_OUT 2>/dev/null + + rm -f "$NET_PREFIX_TRANSLATION_GLOBAL_IPV6" + + return 0 +} + + +# Plugin status function +plugin_status() +{ + local old_prefix global_prefix local_prefix eif IFS + + if [ -f "$NET_PREFIX_TRANSLATION_GLOBAL_IPV6" ]; then + old_prefix="$(cat "$NET_PREFIX_TRANSLATION_GLOBAL_IPV6")" + else + old_prefix="" + fi + + global_prefix="$(net_prefix_translation_global_prefix)" + + if [ -z "$global_prefix" ]; then + echo " Network Prefix Translation Global Prefix: Not Found" + return 0 + fi + + if [ "$old_prefix" = "$global_prefix" ]; then + echo " Network Prefix Translation Global Prefix did not change: $global_prefix" + return 0 + fi + + local_prefix="$NET_PREFIX_TRANSLATION_LOCAL_PREFIX" + + if [ "$NET_PREFIX_TRANSLATION_UPDATE_ON_STATUS" != "0" ]; then + # update rules + + ip6tables -t nat -F NET_PREFIX_TRANSLATION_IN + ip6tables -t nat -F NET_PREFIX_TRANSLATION_OUT + + IFS=' ,' + for eif in $EXT_IF; do + ip6tables -t nat -A NET_PREFIX_TRANSLATION_IN -i $eif -d $global_prefix -j NETMAP --to $local_prefix + ip6tables -t nat -A NET_PREFIX_TRANSLATION_OUT -o $eif -s $local_prefix -j NETMAP --to $global_prefix + done + + echo "$global_prefix" > "$NET_PREFIX_TRANSLATION_GLOBAL_IPV6" + echo " Network Prefix Translation Global Prefix (updated): $global_prefix" + else + echo " Network Prefix Translation Global Prefix needs updating to: $global_prefix" + fi + + return 0 +} + + +# Check sanity of eg. environment +plugin_sanity_check() +{ + # Sanity check + + if [ -z "$(echo "$NET_PREFIX_TRANSLATION_GLOBAL_PREFIX" | cut -s -d'/' -f2)" ]; then + printf "\033[40m\033[1;31m${INDENT}ERROR: NET_PREFIX_TRANSLATION_GLOBAL_PREFIX is missing a /nn prefix!\033[0m\n" >&2 + return 1 + fi + + if [ -z "$(echo "$NET_PREFIX_TRANSLATION_LOCAL_PREFIX" | cut -s -d'/' -f2)" ]; then + printf "\033[40m\033[1;31m${INDENT}ERROR: NET_PREFIX_TRANSLATION_LOCAL_PREFIX is missing a /nn prefix!\033[0m\n" >&2 + return 1 + fi + + if [ -n "$NET_PREFIX_TRANSLATION_IF" ] && ! check_command netcalc; then + printf "\033[40m\033[1;31m${INDENT}ERROR: Required binary \"netcalc\" is not available!\033[0m\n" >&2 + return 1 + fi + + return 0 +} + + +############ +# Mainline # +############ + +# Check where to find the config file +CONF_FILE="" +if [ -n "$PLUGIN_CONF_PATH" ]; then + CONF_FILE="$PLUGIN_CONF_PATH/$PLUGIN_CONF_FILE" +fi + +# Preinit to success: +PLUGIN_RET_VAL=0 + +# Check if the config file exists +if [ ! -e "$CONF_FILE" ]; then + printf "NOTE: Config file \"$CONF_FILE\" not found!\n Plugin \"$PLUGIN_NAME v$PLUGIN_VERSION\" ignored!\n" >&2 +else + # Source the plugin config file + . "$CONF_FILE" + + if [ "$ENABLED" = "1" -a "$PLUGIN_CMD" != "stop-restart" ] || + [ "$ENABLED" = "0" -a "$PLUGIN_CMD" = "stop-restart" ] || + [ -n "$PLUGIN_LOAD_FILE" -a "$PLUGIN_CMD" = "stop" ] || + [ -n "$PLUGIN_LOAD_FILE" -a "$PLUGIN_CMD" = "status" ]; then + # Show who we are: + echo "${INDENT}$PLUGIN_NAME v$PLUGIN_VERSION" + + # Increment indention + INDENT="$INDENT " + + # Only proceed if environment ok + if ! plugin_sanity_check; then + PLUGIN_RET_VAL=1 + else + case $PLUGIN_CMD in + start|'') plugin_start; PLUGIN_RET_VAL=$? ;; + restart ) plugin_restart; PLUGIN_RET_VAL=$? ;; + stop|stop-restart) plugin_stop; PLUGIN_RET_VAL=$? ;; + status ) plugin_status; PLUGIN_RET_VAL=$? ;; + * ) PLUGIN_RET_VAL=1; printf "\033[40m\033[1;31m ERROR: Invalid plugin option \"$PLUGIN_CMD\"!\033[0m\n" >&2 ;; + esac + fi + fi +fi Added: branches/1.0/package/arnofw/net-prefix-translation/net-prefix-translation.conf =================================================================== --- branches/1.0/package/arnofw/net-prefix-translation/net-prefix-translation.conf (rev 0) +++ branches/1.0/package/arnofw/net-prefix-translation/net-prefix-translation.conf 2017-05-29 16:04:48 UTC (rev 8353) @@ -0,0 +1,56 @@ +# ------------------------------------------------------------------------------ +# -= Arno's iptables firewall - Network Prefix Translation plugin =- +# ------------------------------------------------------------------------------ + +# To actually enable this plugin make ENABLED=1: +# ------------------------------------------------------------------------------ +ENABLED=0 + +# NPTv6 (Network Prefix Translation) for IPv6 +# +# Commonly used to assign fixed ULA (Unique Local IPv6 Unicast Addresses) +# (RFC4193) prefixes to local networks and perform a 1:1 mapping to a +# GUA (IPv6 Global Unicast Address) (RFC3587) prefix provided by your ISP. +# Should the GUA prefix change, the local ULA prefix can remain the same. +# +# The simplest case is where the GUA prefix is static, or seldom changes, +# specify the global prefix with NET_PREFIX_TRANSLATION_GLOBAL_PREFIX. +# +# Example: +# NET_PREFIX_TRANSLATION_GLOBAL_PREFIX="2001:db8:abcd:1230::/60" +# (IPv6 Only) +# ------------------------------------------------------------------------------ +NET_PREFIX_TRANSLATION_GLOBAL_PREFIX="::/60" + +# The more common case is where the GUA prefix is dynamic, using DHCPv6-PD. +# In this case monitor an interface that is automatically assgined a prefix. +# The value of NET_PREFIX_TRANSLATION_GLOBAL_PREFIX is used only to determine +# the prefix length. When NET_PREFIX_TRANSLATION_IF is not defined, +# NET_PREFIX_TRANSLATION_GLOBAL_PREFIX is used, and must be fully specified. +# +# Example: (first INT_IF interface will be used) +# NET_PREFIX_TRANSLATION_IF="$INT_IF" +# ------------------------------------------------------------------------------ +NET_PREFIX_TRANSLATION_IF="$INT_IF" + +# You must define NET_PREFIX_TRANSLATION_LOCAL_PREFIX by generating a ULA, +# using a script or web site, whatever you are most comfortable with. +# +# Example: (generate your own, random, ULA) +# NET_PREFIX_TRANSLATION_LOCAL_PREFIX="fd04:928b:f87e::/48" +# (IPv6 Only) +# ------------------------------------------------------------------------------ +NET_PREFIX_TRANSLATION_LOCAL_PREFIX="fd04:928b:f87e::/48" + +# When this plugin's status is called, if the global IPv6 prefix has changed, +# noted by the IPv6 prefix associated with NET_PREFIX_TRANSLATION_IF, the +# rules will be updated. Set NET_PREFIX_TRANSLATION_UPDATE_ON_STATUS to "0" +# to disable this automatic update on status. +# +# Example: +# $ arno-iptables-firewall status-plugins net-prefix-translation +# +# Defaults to update on status if not set to "0" +# ------------------------------------------------------------------------------ +NET_PREFIX_TRANSLATION_UPDATE_ON_STATUS=1 + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |