Obtain DNS server automatically from VPN service

Demote DNS settings to fallback usages only.
This commit is contained in:
Mygod
2018-02-17 19:52:34 -08:00
parent 2d30b5154b
commit f2d9f25b10
8 changed files with 43 additions and 32 deletions

View File

@@ -3,6 +3,7 @@ package be.mygod.vpnhotspot.net
import android.os.Build
import be.mygod.vpnhotspot.App.Companion.app
import be.mygod.vpnhotspot.R
import be.mygod.vpnhotspot.debugLog
import be.mygod.vpnhotspot.noisySu
import java.io.IOException
import java.net.Inet4Address
@@ -82,8 +83,11 @@ class Routing(val upstream: String?, val downstream: String, ownerAddress: InetA
return this
}
fun dnsRedirect(dns: String): Routing {
fun dnsRedirect(dnses: List<InetAddress>): Routing {
val hostAddress = hostAddress.hostAddress
val dns = dnses.firstOrNull { it is Inet4Address }?.hostAddress
?: app.pref.getString("service.dns", "8.8.8.8")
debugLog("Routing", "Using $dns from ($dnses)")
startScript.add("$IPTABLES -t nat -A PREROUTING -i $downstream -p tcp -d $hostAddress --dport 53 -j DNAT --to-destination $dns")
startScript.add("$IPTABLES -t nat -A PREROUTING -i $downstream -p udp -d $hostAddress --dport 53 -j DNAT --to-destination $dns")
stopScript.addFirst("$IPTABLES -t nat -D PREROUTING -i $downstream -p tcp -d $hostAddress --dport 53 -j DNAT --to-destination $dns")

View File

@@ -7,10 +7,11 @@ import android.net.NetworkCapabilities
import android.net.NetworkRequest
import be.mygod.vpnhotspot.App.Companion.app
import be.mygod.vpnhotspot.debugLog
import java.net.InetAddress
object VpnMonitor : ConnectivityManager.NetworkCallback() {
interface Callback {
fun onAvailable(ifname: String)
fun onAvailable(ifname: String, dns: List<InetAddress>)
fun onLost(ifname: String)
}
@@ -27,13 +28,14 @@ object VpnMonitor : ConnectivityManager.NetworkCallback() {
/**
* Obtaining ifname in onLost doesn't work so we need to cache it in onAvailable.
*/
val available = HashMap<Network, String>()
private val available = HashMap<Network, String>()
override fun onAvailable(network: Network) {
val ifname = manager.getLinkProperties(network)?.interfaceName ?: return
val properties = manager.getLinkProperties(network)
val ifname = properties?.interfaceName ?: return
synchronized(this) {
if (available.put(network, ifname) != null) return
debugLog(TAG, "onAvailable: $ifname")
callbacks.forEach { it.onAvailable(ifname) }
debugLog(TAG, "onAvailable: $ifname, ${properties.dnsServers.joinToString()}")
callbacks.forEach { it.onAvailable(ifname, properties.dnsServers) }
}
}
@@ -55,7 +57,9 @@ object VpnMonitor : ConnectivityManager.NetworkCallback() {
cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
}
} else if (available.isEmpty()) true else {
available.forEach { callback.onAvailable(it.value) }
available.forEach {
callback.onAvailable(it.value, manager.getLinkProperties(it.key)?.dnsServers ?: emptyList())
}
false
}
}) failfast?.invoke()