Menu="VPNmanager:100" Title="Tunnel wg0" Tag="icon-vpn" Nchan="wg_poller" --- 0) { $entries = array_filter(array_map('trim',preg_split('/\[(Interface|Peer)\]/',file_get_contents($conf)))); foreach ($entries as $key => $entry) { $i = $key-1; if ($i) $peer_wg[] = $i; $rows = explode("\n",$entry); foreach ($rows as $row) { [$id,$data] = array_map('trim',explode('=',$row,2)); switch ($id) { case 'PostUp': case 'PostDown': break; case 'Address': foreach (array_map('trim',explode(',',$data)) as $ip) { if (strpos($ip,'.')!==false) $wg["Address:$i"] = $ip; elseif (strpos($ip,':')!==false) $wg["Address6:$i"] = $ip; } break; case 'Endpoint': if ($data[0]=='[') { [$ip,$port] = explode(']:',$data); $ip = substr($ip,1); } else { [$ip,$port] = explode(':',$data); } $wg["Endpoint:$i"] = $ip; $wg["ListenPort:$i"] = $port; break; default: if ($id[0]=='#') $wg["Name:$i"] = substr($id,1); else $wg["$id:$i"] = $data; break; } } } $file = true; } if (file_exists($cfg)) { $more = parse_ini_file($cfg); foreach ($more as $key => $data) { [$id,$i] = explode(':',$key); if ($id!='Address') continue; switch ($more['PROT:0']) { case '46': [$ip4,$ip6] = array_map('trim',explode(',',$data)); $more[$key] = $ip4; $more["Address6:$i"] = $ip6; break; case '6': unset($more[$key]); $more["Address6:$i"] = $data; break; } } $wg = array_merge($wg,$more); [$subnet,$mask] = explode('/',$wg['Network:0']); [$subnet6,$mask6] = explode('/',$wg['Network6:0']); $netbase[$vtun] = ip2long($subnet) & (0x100000000-2**(32-$mask)); $netbase6[$vtun] = $subnet6 ?: $netpool6[$vtun]; } else { $netbase[$vtun] = ip2long($netpool[$vtun]); $netbase6[$vtun] = $netpool6[$vtun]; } foreach ($peer_wg as $i) if ((int)$wg["TYPE:$i"]==7) {$vpn = true; break;} return [$conf,$cfg,$file,$vpn]; } $public = strpos($_SERVER['HTTP_HOST'],'unraid.net')!==false && $remote['wanaccess']=='yes' ? (substr($_SERVER['HTTP_HOST'],0,4)!='www.'?'www.':'').explode(':',$_SERVER['HTTP_HOST'])[0] : ''; $active = (array)explode(' ',exec('wg show interfaces')); $autostart = (array)explode(' ',@file_get_contents("$etc/autostart")); $build = false; $script = "$docroot/webGui/scripts/upnp_port"; $template = "$docroot/webGui/WGX.page"; $tower = $var['NAME']; $server = $eth0['IPADDR:0']; $server6 = $eth0['IPADDR6:0']; $dnsserver = $eth0['DNS_SERVER1']; $link = file_exists('/sys/class/net/br0') ? 'br0' : (file_exists('/sys/class/net/bond0') ? 'bond0' : 'eth0'); $postUp0 = "$script add $link WireGuard- $server udp"; $postUp1 = "logger -t wireguard 'Tunnel WireGuard- started'"; $postUp2 = "iptables -t nat -A POSTROUTING -s -o $link -j MASQUERADE"; $postUp3 = "iptables -N WIREGUARD_DROP_;iptables -A WIREGUARD -o $link -j WIREGUARD_DROP_"; $postUpX = "iptables -A WIREGUARD_DROP_ -s -d -j DROP"; $postUpZ = "iptables -A WIREGUARD_DROP_ -s -j ACCEPT;iptables -A WIREGUARD_DROP_ -j RETURN"; $postUp26 = "ip6tables -t nat -A POSTROUTING -s -o $link -j MASQUERADE"; $postUp36 = "ip6tables -N WIREGUARD_DROP_;ip6tables -A WIREGUARD -o $link -j WIREGUARD_DROP_"; $postUpX6 = "ip6tables -A WIREGUARD_DROP_ -s -d -j DROP"; $postUpZ6 = "ip6tables -A WIREGUARD_DROP_ -s -j ACCEPT;ip6tables -A WIREGUARD_DROP_ -j RETURN"; $postDown0 = "$script del $link udp"; $postDown1 = "logger -t wireguard 'Tunnel WireGuard- stopped'"; $postDown2 = "iptables -t nat -D POSTROUTING -s -o $link -j MASQUERADE"; $postDown3 = "iptables -F WIREGUARD_DROP_;iptables -D WIREGUARD -o $link -j WIREGUARD_DROP_;iptables -X WIREGUARD_DROP_"; $postDown26= "ip6tables -t nat -D POSTROUTING -s -o $link -j MASQUERADE"; $postDown36= "ip6tables -F WIREGUARD_DROP_;ip6tables -D WIREGUARD -o $link -j WIREGUARD_DROP_;ip6tables -X WIREGUARD_DROP_"; $tld = file_get_contents("$docroot/webGui/include/tld.key"); $validDNS = "([0-9a-z]([0-9a-z\-]{0,61}[0-9a-z])?\.)+($tld)"; $validIP4 = "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}"; $validIP6 = "(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(:|([0-9a-fA-F]{1,4}:)+):(([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4})?)"; $maskIP4 = "([0-9]|[12][0-9]|3[0-2])?"; $maskIP6 = "([0-9]|[1-9][[0-9]|1[01][0-9]|12[0-8])?"; $validText = "^($validDNS|$validIP4|$validIP6)$"; $validList = "^(($validIP4/?$maskIP4|$validIP6/?$maskIP6)(, *)?)+$"; $validDNSServerList = "^(($validIP4|$validIP6)(, *)?)+$"; $validname = "^[0-9a-zA-Z \-_]*$"; $netbase = $netpool = $netport = []; $netbase6 = $netpool6 = []; $check_wg0 = in_array('wg0',$active) ? 'true' : 'false'; $start_wg0 = in_array('wg0',$autostart); $peer_wg0 = $wg0 = []; $netpool['wg0'] = '10.253.0.0'; $netpool6['wg0'] = 'fc00:253:0:0::'; $netport['wg0'] = 51820; // read current configuration [$conf_wg0, $cfg_wg0, $this_wg0, $vpn_wg0] = readConf($peer_wg0, $wg0, 'wg0'); // gather IPv4 and IPv6 addresses for available interfaces $endpoints = []; $ethX = 'eth0'; while (isset($$ethX)) { if (!empty($$ethX['IPADDR:0'])) $endpoints[] = $$ethX['IPADDR:0']; if (!empty($$ethX['IPADDR6:0'])) $endpoints[] = $$ethX['IPADDR6:0']; $ethX = 'eth'.(substr($ethX,3)+1); } // remove obsolete tunnels foreach (glob("$docroot/webGui/WG[1-9]*.page",GLOB_NOSORT) as $wgX) { if (!in_array(strtolower(basename($wgX,'.page')), $vtuns)) { unlink($wgX); $build = true; } } // add additional tunnels foreach ($vtuns as $wgX) { if ($wgX == 'wg0') continue; $file = "$docroot/webGui/".strtoupper($wgX).".page"; if (!file_exists($file)) { $X = filter_var($wgX,FILTER_SANITIZE_NUMBER_INT); $nnn = 100 + $X; copy($template, $file); exec("sed -i 's/parentname:nnn/VPNmanager:$nnn/;s/XXX/$X/g;s/wgX/$wgX/g' $file"); chmod($file,0644); $build = true; } } ?>