private void Cleanup() { Utils.SafeClose(m_fileDescriptor); m_fileDescriptor = null; Utils.SafeDispose(m_builder); m_builder = null; }
public AndroidVPNContext(AndroidVPNService service) { m_builder = new VpnService.Builder(service); m_builder.SetConfigureIntent(service.CreateConfigIntent()); InitDNS(); InitMTU(); InitApplications(); }
public void StartVpn() { if ((VpnConfig.Handler == null) == (VpnConfig.Socks == null)) { throw new Exception("Should specify (('Handler' and optional 'SocksPort') or 'Socks') and optional 'DnsResolver'"); } InitAdapters(); if (_pfd != null) { return; } var builder = new VpnService.Builder(Bg) .SetSession("NaiveSocks VPN bridge") .SetMtu(VpnConfig.Mtu) .AddAddress(ClientIp, 24) .AddDnsServer(RouterIp) .AddRoute("0.0.0.0", 0); if (VpnConfig.Ipv6) { builder.AddAddress(ClientIp6, 126); builder.AddRoute("::", 0); } foreach (var item in VpnConfig.RemoteDns) { builder.AddDnsServer(item); } var me = Bg.PackageName; bool isAnyAllowed = false; if (VpnConfig.EnableAppFilter && !string.IsNullOrEmpty(VpnConfig.AppList)) { Logging.info("applying AppList..."); foreach (var item in from x in VpnConfig.AppList.Split('\n') let y = x.Trim() where y.Length > 0 && y != me select y) { try { if (VpnConfig.ByPass) { builder.AddDisallowedApplication(item); } else { builder.AddAllowedApplication(item); isAnyAllowed = true; } } catch (Exception e) { Logging.error($"adding package '{item}': {e.Message}"); } } } if (!isAnyAllowed) { builder.AddDisallowedApplication(me); } _pfd = builder.Establish(); _running = 1; Logging.info("VPN established, fd=" + _pfd.Fd); string dnsgw = null; if (VpnConfig.DnsGw.IsNullOrEmpty() == false) { dnsgw = VpnConfig.DnsGw; } else if (VpnConfig.LocalDnsPort > 0) { dnsgw = "127.0.0.1:" + VpnConfig.LocalDnsPort; } StartTun2Socks("127.0.0.1:" + socksInAdapter.listen.Port, dnsgw); }