#!/bin/sh /etc/rc.common
# NAT6 init script for OpenWrt // Depends on package: kmod-ipt-nat6# edited by Sad Pencil at 2020-02-09# replace route command with ip command to solve issues on new OpenWRTSTART=55# Options# -------# Use temporary addresses (IPv6 privacy extensions) for outgoing connections? Yes: 1 / No: 0PRIVACY=1# Maximum number of attempts before this script will stop in case no IPv6 route is available# This limits the execution time of the IPv6 route lookup to (MAX_TRIES+1)*(MAX_TRIES/2) seconds. The default (15) equals 120 seconds.MAX_TRIES=15# An initial delay (in seconds) helps to avoid looking for the IPv6 network too early. Ideally, the first probe is successful.# This would be the case if the time passed between the system log messages "Probing IPv6 route" and "Setting up NAT6" is 1 second.DELAY=5# Logical interface name of outbound IPv6 connection# There should be no need to modify this, unless you changed the default network interface names# Edit by Vincent: I never changed my default network interface names, but still I have to change the WAN6_NAME to "wan" instead of "wan6"WAN6_NAME="wan6"# ---------------------------------------------------# Options end here - no need to change anything belowboot(){[$DELAY -gt 0]&& sleep $DELAYWAN6_INTERFACE=$(uci get "network.$WAN6_NAME.ifname") logger -t NAT6 "Probing IPv6 route"PROBE=0COUNT=1while[$PROBE -eq 0]doif[$COUNT -gt $MAX_TRIES]then logger -t NAT6 "Fatal error: No IPv6 route found (reached retry limit)"&&exit1fi sleep $COUNTCOUNT=$((COUNT+1))PROBE=$(ip -6 route | grep -i '^default.*via'| grep -i -F "dev $WAN6_INTERFACE"| grep -i -o 'via.*'| wc -l)done logger -t NAT6 "Setting up NAT6"if[ -z "$WAN6_INTERFACE"]||[ ! -e "/sys/class/net/$WAN6_INTERFACE/"];then logger -t NAT6 "Fatal error: Lookup of $WAN6_NAME interface failed. Were the default interface names changed?"&&exit1fiWAN6_GATEWAY=$(ip -6 route | grep -i '^default.*via'| grep -i -F "dev $WAN6_INTERFACE"| grep -i -o 'via.*'| cut -d ' ' -f 2| head -n 1)if[ -z "$WAN6_GATEWAY"];then logger -t NAT6 "Fatal error: No IPv6 gateway for $WAN6_INTERFACE found"&&exit1fiLAN_ULA_PREFIX=$(uci get network.globals.ula_prefix)if[$(echo"$LAN_ULA_PREFIX"| grep -c -E "^([0-9a-fA-F]{4}):([0-9a-fA-F]{0,4}):") -ne 1];then logger -t NAT6 "Fatal error: IPv6 ULA prefix $LAN_ULA_PREFIX seems invalid. Please verify that a prefix is set and valid."&&exit1fi ip6tables -t nat -I POSTROUTING -s "$LAN_ULA_PREFIX" -o "$WAN6_INTERFACE" -j MASQUERADE
if[$? -eq 0];then logger -t NAT6 "Added IPv6 masquerading rule to the firewall (Src: $LAN_ULA_PREFIX - Dst: $WAN6_INTERFACE)"else logger -t NAT6 "Fatal error: Failed to add IPv6 masquerading rule to the firewall (Src: $LAN_ULA_PREFIX - Dst: $WAN6_INTERFACE)"&&exit1fi ip -6 route add 2000::/3 via "$WAN6_GATEWAY" dev "$WAN6_INTERFACE"if[$? -eq 0];then logger -t NAT6 "Added $WAN6_GATEWAY to routing table as gateway on $WAN6_INTERFACE for outgoing connections"else logger -t NAT6 "Error: Failed to add $WAN6_GATEWAY to routing table as gateway on $WAN6_INTERFACE for outgoing connections"fiif[$PRIVACY -eq 1];thenecho2 > "/proc/sys/net/ipv6/conf/$WAN6_INTERFACE/accept_ra"if[$? -eq 0];then logger -t NAT6 "Accepting router advertisements on $WAN6_INTERFACE even if forwarding is enabled (required for temporary addresses)"else logger -t NAT6 "Error: Failed to change router advertisements accept policy on $WAN6_INTERFACE (required for temporary addresses)"fiecho2 > "/proc/sys/net/ipv6/conf/$WAN6_INTERFACE/use_tempaddr"if[$? -eq 0];then logger -t NAT6 "Using temporary addresses for outgoing connections on interface $WAN6_INTERFACE"else logger -t NAT6 "Error: Failed to enable temporary addresses for outgoing connections on interface $WAN6_INTERFACE"fifiexit0}