tayga.sh (3740B)
1 # tayga.sh - NAT64 backend 2 3 find_tayga_wanif4() { 4 local if=$(ip -4 r l e 0.0.0.0/0); if="${if#default* dev }"; if="${if%% *}" 5 [ -n "$if" ] && grep -qs "^ *$if:" /proc/net/dev && echo "$if" 6 } 7 8 find_tayga_wanip4() { 9 local ip=$(ip -4 a s dev "$1"); ip="${ip#*inet }" 10 echo "${ip%%[^0-9.]*}" 11 } 12 13 find_tayga_wanif6() { 14 local if=$(ip -6 r l e ::/0); if="${if#default* dev }"; if="${if%% *}" 15 [ -n "$if" ] && grep -qs "^ *$if:" /proc/net/dev && echo "$if" 16 } 17 18 find_tayga_wanip6() { 19 local ip=$(ip -6 a s dev "$1"); ip="${ip#*inet6 }" 20 echo "${ip%%[^0-9A-Fa-f:]*}" 21 } 22 23 # Hook into scan_interfaces() to synthesize a .device option 24 # This is needed for /sbin/ifup to properly dispatch control 25 # to setup_interface_tayga() even if no .ifname is set in 26 # the configuration. 27 scan_tayga() { 28 config_set "$1" device "tayga-$1" 29 } 30 31 coldplug_interface_tayga() { 32 setup_interface_tayga "tayga-$1" "$1" 33 } 34 35 tayga_add_static_mappings() { 36 local tmpconf="$1" 37 38 ( 39 . /lib/functions.sh 40 config_load firewall 41 42 tayga_map_rule_add() { 43 local cfg="$1" 44 local tmpconf="$2" 45 local ipv4_addr ipv6_addr 46 config_get ipv4_addr "$cfg" ipv4_addr "" 47 config_get ipv6_addr "$cfg" ipv6_addr "" 48 [ -n "$ipv4_addr" ] && [ -n "$ipv6_addr" ] && 49 echo "map $ipv4_addr $ipv6_addr" >>$tmpconf 50 } 51 52 config_foreach tayga_map_rule_add nat64 "$tmpconf" 53 ) 54 } 55 56 setup_interface_tayga() { 57 local iface="$1" 58 local cfg="$2" 59 local link="tayga-$cfg" 60 61 local ipv4_addr ipv6_addr prefix dynamic_pool 62 63 config_get ipv4_addr "$cfg" ipv4_addr 64 config_get ipv6_addr "$cfg" ipv6_addr 65 config_get prefix "$cfg" prefix 66 config_get dynamic_pool "$cfg" dynamic_pool 67 68 local args 69 70 include /lib/network 71 scan_interfaces 72 73 local wanip4=$(uci_get network "$cfg" ipv4addr) 74 local wanip6=$(uci_get network "$cfg" ipv6addr) 75 76 local wanif4=$(find_tayga_wanif4) 77 local wanif6=$(find_tayga_wanif6) 78 79 [ -z "$wanip4" ] && { 80 [ -n "$wanif4" ] && { 81 wanip4=$(find_tayga_wanip4 "$wanif4") 82 uci_set_state network "$cfg" wan4_device "$wanif4" 83 } 84 } 85 86 [ -z "$wanip6" ] && { 87 [ -n "$wanif6" ] && { 88 wanip6=$(find_tayga_wanip6 "$wanif6") 89 uci_set_state network "$cfg" wan6_device "$wanif6" 90 } 91 } 92 93 [ -n "$wanip4" ] && [ -n "$wanip6" ] || { 94 echo "Cannot determine local IPv4 and IPv6 addressed for tayga NAT64 $cfg - skipping" 95 return 1 96 } 97 98 local tmpconf="/var/etc/tayga-$cfg.conf" 99 args="-c $tmpconf" 100 mkdir -p /var/etc 101 mkdir -p /var/run/tayga/$cfg 102 103 echo "tun-device $link" >$tmpconf 104 echo "ipv4-addr $ipv4_addr" >>$tmpconf 105 [ -n "$ipv6_addr" ] && 106 echo "ipv6-addr $ipv6_addr" >>$tmpconf 107 [ -n "$prefix" ] && 108 echo "prefix $prefix" >>$tmpconf 109 110 tayga_add_static_mappings "$tmpconf" 111 112 [ -n "$dynamic_pool" ] && 113 echo "dynamic-pool $dynamic_pool" >>$tmpconf 114 echo "data-dir /var/run/tayga/$cfg" >>$tmpconf 115 116 # creating the tunnel below will trigger a net subsystem event 117 # prevent it from touching or iface by disabling .auto here 118 uci_set_state network "$cfg" ifname $link 119 uci_set_state network "$cfg" auto 0 120 121 # here we create TUN device and check configuration 122 tayga $args --mktun || return 1 123 124 ip link set "$link" up 125 126 ip addr add "$wanip4" dev "$link" 127 ip addr add "$wanip6" dev "$link" 128 129 [ -n "$dynamic_pool" ] && 130 ip -4 route add "$dynamic_pool" dev "$link" 131 [ -n "$prefix" ] && 132 ip -6 route add "$prefix" dev "$link" 133 134 start-stop-daemon -S -x tayga -- $args -p /var/run/$link.pid 135 136 env -i ACTION="ifup" DEVICE="$link" INTERFACE="$cfg" PROTO="tayga" \ 137 /sbin/hotplug-call iface 138 } 139 140 stop_interface_tayga() { 141 local cfg="$1" 142 local link="tayga-$cfg" 143 144 env -i ACTION="ifdown" DEVICE="$link" INTERFACE="$cfg" PROTO="tayga" \ 145 /sbin/hotplug-call iface 146 147 service_kill tayga "/var/run/$link.pid" 148 149 ip link set "$link" down 150 ip addr flush dev "$link" 151 ip route flush dev "$link" 152 }