|
@ -0,0 +1,152 @@ |
|
|
|
|
|
# tayga.sh - NAT64 backend |
|
|
|
|
|
|
|
|
|
|
|
find_tayga_wanif4() { |
|
|
|
|
|
local if=$(ip -4 r l e 0.0.0.0/0); if="${if#default* dev }"; if="${if%% *}" |
|
|
|
|
|
[ -n "$if" ] && grep -qs "^ *$if:" /proc/net/dev && echo "$if" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
find_tayga_wanip4() { |
|
|
|
|
|
local ip=$(ip -4 a s dev "$1"); ip="${ip#*inet }" |
|
|
|
|
|
echo "${ip%%[^0-9.]*}" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
find_tayga_wanif6() { |
|
|
|
|
|
local if=$(ip -6 r l e ::/0); if="${if#default* dev }"; if="${if%% *}" |
|
|
|
|
|
[ -n "$if" ] && grep -qs "^ *$if:" /proc/net/dev && echo "$if" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
find_tayga_wanip6() { |
|
|
|
|
|
local ip=$(ip -6 a s dev "$1"); ip="${ip#*inet6 }" |
|
|
|
|
|
echo "${ip%%[^0-9A-Fa-f:]*}" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
# Hook into scan_interfaces() to synthesize a .device option |
|
|
|
|
|
# This is needed for /sbin/ifup to properly dispatch control |
|
|
|
|
|
# to setup_interface_tayga() even if no .ifname is set in |
|
|
|
|
|
# the configuration. |
|
|
|
|
|
scan_tayga() { |
|
|
|
|
|
config_set "$1" device "tayga-$1" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
coldplug_interface_tayga() { |
|
|
|
|
|
setup_interface_tayga "tayga-$1" "$1" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
tayga_add_static_mappings() { |
|
|
|
|
|
local tmpconf="$1" |
|
|
|
|
|
|
|
|
|
|
|
( |
|
|
|
|
|
. /lib/functions.sh |
|
|
|
|
|
config_load firewall |
|
|
|
|
|
|
|
|
|
|
|
tayga_map_rule_add() { |
|
|
|
|
|
local cfg="$1" |
|
|
|
|
|
local tmpconf="$2" |
|
|
|
|
|
local ipv4_addr ipv6_addr |
|
|
|
|
|
config_get ipv4_addr "$cfg" ipv4_addr "" |
|
|
|
|
|
config_get ipv6_addr "$cfg" ipv6_addr "" |
|
|
|
|
|
[ -n "$ipv4_addr" ] && [ -n "$ipv6_addr" ] && |
|
|
|
|
|
echo "map $ipv4_addr $ipv6_addr" >>$tmpconf |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
config_foreach tayga_map_rule_add nat64 "$tmpconf" |
|
|
|
|
|
) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
setup_interface_tayga() { |
|
|
|
|
|
local iface="$1" |
|
|
|
|
|
local cfg="$2" |
|
|
|
|
|
local link="tayga-$cfg" |
|
|
|
|
|
|
|
|
|
|
|
local ipv4_addr ipv6_addr prefix dynamic_pool |
|
|
|
|
|
|
|
|
|
|
|
config_get ipv4_addr "$cfg" ipv4_addr |
|
|
|
|
|
config_get ipv6_addr "$cfg" ipv6_addr |
|
|
|
|
|
config_get prefix "$cfg" prefix |
|
|
|
|
|
config_get dynamic_pool "$cfg" dynamic_pool |
|
|
|
|
|
|
|
|
|
|
|
local args |
|
|
|
|
|
|
|
|
|
|
|
include /lib/network |
|
|
|
|
|
scan_interfaces |
|
|
|
|
|
|
|
|
|
|
|
local wanip4=$(uci_get network "$cfg" ipv4addr) |
|
|
|
|
|
local wanip6=$(uci_get network "$cfg" ipv6addr) |
|
|
|
|
|
|
|
|
|
|
|
local wanif4=$(find_tayga_wanif4) |
|
|
|
|
|
local wanif6=$(find_tayga_wanif6) |
|
|
|
|
|
|
|
|
|
|
|
[ -z "$wanip4" ] && { |
|
|
|
|
|
[ -n "$wanif4" ] && { |
|
|
|
|
|
wanip4=$(find_tayga_wanip4 "$wanif4") |
|
|
|
|
|
uci_set_state network "$cfg" wan4_device "$wanif4" |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[ -z "$wanip6" ] && { |
|
|
|
|
|
[ -n "$wanif6" ] && { |
|
|
|
|
|
wanip6=$(find_tayga_wanip6 "$wanif6") |
|
|
|
|
|
uci_set_state network "$cfg" wan6_device "$wanif6" |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[ -n "$wanip4" ] && [ -n "$wanip6" ] || { |
|
|
|
|
|
echo "Cannot determine local IPv4 and IPv6 addressed for tayga NAT64 $cfg - skipping" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
local tmpconf="/var/etc/tayga-$cfg.conf" |
|
|
|
|
|
args="-c $tmpconf" |
|
|
|
|
|
mkdir -p /var/etc |
|
|
|
|
|
mkdir -p /var/run/tayga/$cfg |
|
|
|
|
|
|
|
|
|
|
|
echo "tun-device $link" >$tmpconf |
|
|
|
|
|
echo "ipv4-addr $ipv4_addr" >>$tmpconf |
|
|
|
|
|
[ -n "$ipv6_addr" ] && |
|
|
|
|
|
echo "ipv6-addr $ipv6_addr" >>$tmpconf |
|
|
|
|
|
[ -n "$prefix" ] && |
|
|
|
|
|
echo "prefix $prefix" >>$tmpconf |
|
|
|
|
|
|
|
|
|
|
|
tayga_add_static_mappings "$tmpconf" |
|
|
|
|
|
|
|
|
|
|
|
[ -n "$dynamic_pool" ] && |
|
|
|
|
|
echo "dynamic-pool $dynamic_pool" >>$tmpconf |
|
|
|
|
|
echo "data-dir /var/run/tayga/$cfg" >>$tmpconf |
|
|
|
|
|
|
|
|
|
|
|
# creating the tunnel below will trigger a net subsystem event |
|
|
|
|
|
# prevent it from touching or iface by disabling .auto here |
|
|
|
|
|
uci_set_state network "$cfg" ifname $link |
|
|
|
|
|
uci_set_state network "$cfg" auto 0 |
|
|
|
|
|
|
|
|
|
|
|
# here we create TUN device and check configuration |
|
|
|
|
|
tayga $args --mktun || return 1 |
|
|
|
|
|
|
|
|
|
|
|
ip link set "$link" up |
|
|
|
|
|
|
|
|
|
|
|
ip addr add "$wanip4" dev "$link" |
|
|
|
|
|
ip addr add "$wanip6" dev "$link" |
|
|
|
|
|
|
|
|
|
|
|
[ -n "$dynamic_pool" ] && |
|
|
|
|
|
ip -4 route add "$dynamic_pool" dev "$link" |
|
|
|
|
|
[ -n "$prefix" ] && |
|
|
|
|
|
ip -6 route add "$prefix" dev "$link" |
|
|
|
|
|
|
|
|
|
|
|
start-stop-daemon -S -x tayga -- $args -p /var/run/$link.pid |
|
|
|
|
|
|
|
|
|
|
|
env -i ACTION="ifup" DEVICE="$link" INTERFACE="$cfg" PROTO="tayga" \ |
|
|
|
|
|
/sbin/hotplug-call iface |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
stop_interface_tayga() { |
|
|
|
|
|
local cfg="$1" |
|
|
|
|
|
local link="tayga-$cfg" |
|
|
|
|
|
|
|
|
|
|
|
env -i ACTION="ifdown" DEVICE="$link" INTERFACE="$cfg" PROTO="tayga" \ |
|
|
|
|
|
/sbin/hotplug-call iface |
|
|
|
|
|
|
|
|
|
|
|
service_kill tayga "/var/run/$link.pid" |
|
|
|
|
|
|
|
|
|
|
|
ip link set "$link" down |
|
|
|
|
|
ip addr flush dev "$link" |
|
|
|
|
|
ip route flush dev "$link" |
|
|
|
|
|
} |