|
@@ -0,0 +1,152 @@
|
|
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
|
+}
|