mirror of
https://github.com/M66B/NetGuard.git
synced 2025-02-23 23:00:56 +00:00
Replace local DNS servers by Google DNS servers when not routing LAN
This commit is contained in:
parent
f63449fbe4
commit
fb8199ca67
2 changed files with 72 additions and 10 deletions
|
@ -80,6 +80,7 @@ import java.io.File;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.math.BigInteger;
|
||||||
import java.net.Inet4Address;
|
import java.net.Inet4Address;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.InterfaceAddress;
|
import java.net.InterfaceAddress;
|
||||||
|
@ -972,18 +973,12 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
||||||
List<InetAddress> listDns = new ArrayList<>();
|
List<InetAddress> listDns = new ArrayList<>();
|
||||||
List<String> sysDns = Util.getDefaultDNS(context);
|
List<String> sysDns = Util.getDefaultDNS(context);
|
||||||
|
|
||||||
|
// Get custom DNS servers
|
||||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
String vpnDns1 = prefs.getString("dns", null);
|
String vpnDns1 = prefs.getString("dns", null);
|
||||||
String vpnDns2 = prefs.getString("dns2", null);
|
String vpnDns2 = prefs.getString("dns2", null);
|
||||||
Log.i(TAG, "DNS system=" + TextUtils.join(",", sysDns) + " VPN1=" + vpnDns1 + " VPN2=" + vpnDns2);
|
Log.i(TAG, "DNS system=" + TextUtils.join(",", sysDns) + " VPN1=" + vpnDns1 + " VPN2=" + vpnDns2);
|
||||||
|
|
||||||
boolean lan = prefs.getBoolean("lan", false);
|
|
||||||
if (lan) {
|
|
||||||
// Force external DNS servers
|
|
||||||
vpnDns1 = "8.8.8.8";
|
|
||||||
vpnDns2 = "8.8.8.4";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vpnDns1 != null)
|
if (vpnDns1 != null)
|
||||||
try {
|
try {
|
||||||
InetAddress dns = InetAddress.getByName(vpnDns1);
|
InetAddress dns = InetAddress.getByName(vpnDns1);
|
||||||
|
@ -997,9 +992,11 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
||||||
InetAddress dns = InetAddress.getByName(vpnDns2);
|
InetAddress dns = InetAddress.getByName(vpnDns2);
|
||||||
if (!(dns.isLoopbackAddress() || dns.isAnyLocalAddress()))
|
if (!(dns.isLoopbackAddress() || dns.isAnyLocalAddress()))
|
||||||
listDns.add(dns);
|
listDns.add(dns);
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ex) {
|
||||||
|
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use system DNS servers only when no two custom DNS servers specified
|
||||||
if (listDns.size() <= 1)
|
if (listDns.size() <= 1)
|
||||||
for (String def_dns : sysDns)
|
for (String def_dns : sysDns)
|
||||||
try {
|
try {
|
||||||
|
@ -1007,9 +1004,73 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
||||||
if (!listDns.contains(ddns) &&
|
if (!listDns.contains(ddns) &&
|
||||||
!(ddns.isLoopbackAddress() || ddns.isAnyLocalAddress()))
|
!(ddns.isLoopbackAddress() || ddns.isAnyLocalAddress()))
|
||||||
listDns.add(ddns);
|
listDns.add(ddns);
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ex) {
|
||||||
|
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove local DNS servers when not routing LAN
|
||||||
|
boolean lan = prefs.getBoolean("lan", false);
|
||||||
|
if (lan) {
|
||||||
|
List<InetAddress> listLocal = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
|
||||||
|
if (nis != null)
|
||||||
|
while (nis.hasMoreElements()) {
|
||||||
|
NetworkInterface ni = nis.nextElement();
|
||||||
|
if (ni != null && ni.isUp() && !ni.isLoopback()) {
|
||||||
|
List<InterfaceAddress> ias = ni.getInterfaceAddresses();
|
||||||
|
if (ias != null)
|
||||||
|
for (InterfaceAddress ia : ias) {
|
||||||
|
InetAddress hostAddress = ia.getAddress();
|
||||||
|
BigInteger host = new BigInteger(1, hostAddress.getAddress());
|
||||||
|
|
||||||
|
int prefix = ia.getNetworkPrefixLength();
|
||||||
|
BigInteger mask = BigInteger.valueOf(-1).shiftLeft(hostAddress.getAddress().length * 8 - prefix);
|
||||||
|
|
||||||
|
for (InetAddress dns : listDns)
|
||||||
|
if (hostAddress.getAddress().length == dns.getAddress().length) {
|
||||||
|
BigInteger ip = new BigInteger(1, dns.getAddress());
|
||||||
|
|
||||||
|
if (host.and(mask).equals(ip.and(mask))) {
|
||||||
|
Log.i(TAG, "Local DNS server host=" + hostAddress + "/" + prefix + " dns=" + dns);
|
||||||
|
listLocal.add(dns);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<InetAddress> listDns4 = new ArrayList<>();
|
||||||
|
List<InetAddress> listDns6 = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
listDns4.add(InetAddress.getByName("8.8.8.8"));
|
||||||
|
listDns4.add(InetAddress.getByName("8.8.4.4"));
|
||||||
|
listDns6.add(InetAddress.getByName("2001:4860:4860::8888"));
|
||||||
|
listDns6.add(InetAddress.getByName("2001:4860:4860::8844"));
|
||||||
|
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (InetAddress dns : listLocal) {
|
||||||
|
listDns.remove(dns);
|
||||||
|
if (dns instanceof Inet4Address) {
|
||||||
|
if (listDns4.size() > 0) {
|
||||||
|
listDns.add(listDns4.get(0));
|
||||||
|
listDns4.remove(0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (listDns6.size() > 0) {
|
||||||
|
listDns.add(listDns6.get(0));
|
||||||
|
listDns6.remove(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Prefer IPv4 addresses
|
// Prefer IPv4 addresses
|
||||||
Collections.sort(listDns, new Comparator<InetAddress>() {
|
Collections.sort(listDns, new Comparator<InetAddress>() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -671,7 +671,7 @@ public class Util {
|
||||||
if (nis != null)
|
if (nis != null)
|
||||||
while (nis.hasMoreElements()) {
|
while (nis.hasMoreElements()) {
|
||||||
NetworkInterface ni = nis.nextElement();
|
NetworkInterface ni = nis.nextElement();
|
||||||
if (ni != null && !"lo".equals(ni.getName())) {
|
if (ni != null && !ni.isLoopback()) {
|
||||||
List<InterfaceAddress> ias = ni.getInterfaceAddresses();
|
List<InterfaceAddress> ias = ni.getInterfaceAddresses();
|
||||||
if (ias != null)
|
if (ias != null)
|
||||||
for (InterfaceAddress ia : ias)
|
for (InterfaceAddress ia : ias)
|
||||||
|
@ -679,6 +679,7 @@ public class Util {
|
||||||
.append(' ').append(ia.getAddress().getHostAddress())
|
.append(' ').append(ia.getAddress().getHostAddress())
|
||||||
.append('/').append(ia.getNetworkPrefixLength())
|
.append('/').append(ia.getNetworkPrefixLength())
|
||||||
.append(' ').append(ni.getMTU())
|
.append(' ').append(ni.getMTU())
|
||||||
|
.append(' ').append(ni.isUp() ? '^' : 'v')
|
||||||
.append("\r\n");
|
.append("\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue