Commit bb6b2d61 authored by Mygod's avatar Mygod

Intercept DNS packets only at 172.19.0.2:53

parent 50056387
...@@ -39,7 +39,6 @@ import com.github.shadowsocks.net.DefaultNetworkListener ...@@ -39,7 +39,6 @@ import com.github.shadowsocks.net.DefaultNetworkListener
import com.github.shadowsocks.net.Subnet import com.github.shadowsocks.net.Subnet
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.Key import com.github.shadowsocks.utils.Key
import com.github.shadowsocks.utils.parseNumericAddress
import com.github.shadowsocks.utils.printLog import com.github.shadowsocks.utils.printLog
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import java.io.Closeable import java.io.Closeable
...@@ -52,8 +51,10 @@ import android.net.VpnService as BaseVpnService ...@@ -52,8 +51,10 @@ import android.net.VpnService as BaseVpnService
class VpnService : BaseVpnService(), LocalDnsService.Interface { class VpnService : BaseVpnService(), LocalDnsService.Interface {
companion object { companion object {
private const val VPN_MTU = 1500 private const val VPN_MTU = 1500
private const val PRIVATE_VLAN = "172.19.0.%s" private const val PRIVATE_VLAN4_CLIENT = "172.19.0.1"
private const val PRIVATE_VLAN6 = "fdfe:dcba:9876::%s" private const val PRIVATE_VLAN4_ROUTER = "172.19.0.2"
private const val PRIVATE_VLAN6_CLIENT = "fdfe:dcba:9876::1"
private const val PRIVATE_VLAN6_ROUTER = "fdfe:dcba:9876::2"
/** /**
* https://android.googlesource.com/platform/prebuilts/runtime/+/94fec32/appcompat/hiddenapi-light-greylist.txt#9466 * https://android.googlesource.com/platform/prebuilts/runtime/+/94fec32/appcompat/hiddenapi-light-greylist.txt#9466
...@@ -136,9 +137,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface { ...@@ -136,9 +137,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
override suspend fun startProcesses() { override suspend fun startProcesses() {
worker = ProtectWorker().apply { start() } worker = ProtectWorker().apply { start() }
super.startProcesses() super.startProcesses()
sendFd(startVpn()) sendFd(startVpn())
} }
...@@ -153,12 +152,11 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface { ...@@ -153,12 +152,11 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
.setConfigureIntent(Core.configureIntent(this)) .setConfigureIntent(Core.configureIntent(this))
.setSession(profile.formattedName) .setSession(profile.formattedName)
.setMtu(VPN_MTU) .setMtu(VPN_MTU)
.addAddress(PRIVATE_VLAN.format(Locale.ENGLISH, "1"), 24) .addAddress(PRIVATE_VLAN4_CLIENT, 30)
.addDnsServer(PRIVATE_VLAN4_ROUTER)
profile.remoteDns.split(",").forEach { builder.addDnsServer(it.trim()) }
if (profile.ipv6) { if (profile.ipv6) {
builder.addAddress(PRIVATE_VLAN6.format(Locale.ENGLISH, "1"), 126) builder.addAddress(PRIVATE_VLAN6_CLIENT, 126)
builder.addRoute("::", 0) builder.addRoute("::", 0)
} }
...@@ -179,14 +177,10 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface { ...@@ -179,14 +177,10 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
when (profile.route) { when (profile.route) {
Acl.ALL, Acl.BYPASS_CHN, Acl.CUSTOM_RULES -> builder.addRoute("0.0.0.0", 0) Acl.ALL, Acl.BYPASS_CHN, Acl.CUSTOM_RULES -> builder.addRoute("0.0.0.0", 0)
else -> { else -> resources.getStringArray(R.array.bypass_private_route).forEach {
resources.getStringArray(R.array.bypass_private_route).forEach {
val subnet = Subnet.fromString(it)!! val subnet = Subnet.fromString(it)!!
builder.addRoute(subnet.address.hostAddress, subnet.prefixSize) builder.addRoute(subnet.address.hostAddress, subnet.prefixSize)
} }
profile.remoteDns.split(",").mapNotNull { it.trim().parseNumericAddress() }
.forEach { builder.addRoute(it, it.address.size shl 3) }
}
} }
active = true // possible race condition here? active = true // possible race condition here?
...@@ -197,7 +191,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface { ...@@ -197,7 +191,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
val fd = conn.fd val fd = conn.fd
val cmd = arrayListOf(File(applicationInfo.nativeLibraryDir, Executable.TUN2SOCKS).absolutePath, val cmd = arrayListOf(File(applicationInfo.nativeLibraryDir, Executable.TUN2SOCKS).absolutePath,
"--netif-ipaddr", PRIVATE_VLAN.format(Locale.ENGLISH, "2"), "--netif-ipaddr", PRIVATE_VLAN4_ROUTER,
"--netif-netmask", "255.255.255.0", "--netif-netmask", "255.255.255.0",
"--socks-server-addr", "${DataStore.listenAddress}:${DataStore.portProxy}", "--socks-server-addr", "${DataStore.listenAddress}:${DataStore.portProxy}",
"--tunfd", fd.toString(), "--tunfd", fd.toString(),
...@@ -207,7 +201,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface { ...@@ -207,7 +201,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
"--loglevel", "3") "--loglevel", "3")
if (profile.ipv6) { if (profile.ipv6) {
cmd += "--netif-ip6addr" cmd += "--netif-ip6addr"
cmd += PRIVATE_VLAN6.format(Locale.ENGLISH, "2") cmd += PRIVATE_VLAN6_ROUTER
} }
cmd += "--enable-udprelay" cmd += "--enable-udprelay"
data.processes!!.start(cmd, onRestartCallback = { data.processes!!.start(cmd, onRestartCallback = {
......
...@@ -325,7 +325,6 @@ TUN2SOCKS_SOURCES := \ ...@@ -325,7 +325,6 @@ TUN2SOCKS_SOURCES := \
flow/PacketProtoDecoder.c \ flow/PacketProtoDecoder.c \
socksclient/BSocksClient.c \ socksclient/BSocksClient.c \
tuntap/BTap.c \ tuntap/BTap.c \
lwip/src/core/timers.c \
lwip/src/core/udp.c \ lwip/src/core/udp.c \
lwip/src/core/memp.c \ lwip/src/core/memp.c \
lwip/src/core/init.c \ lwip/src/core/init.c \
...@@ -334,14 +333,16 @@ TUN2SOCKS_SOURCES := \ ...@@ -334,14 +333,16 @@ TUN2SOCKS_SOURCES := \
lwip/src/core/tcp_out.c \ lwip/src/core/tcp_out.c \
lwip/src/core/netif.c \ lwip/src/core/netif.c \
lwip/src/core/def.c \ lwip/src/core/def.c \
lwip/src/core/ip.c \
lwip/src/core/mem.c \ lwip/src/core/mem.c \
lwip/src/core/tcp_in.c \ lwip/src/core/tcp_in.c \
lwip/src/core/stats.c \ lwip/src/core/stats.c \
lwip/src/core/inet_chksum.c \ lwip/src/core/inet_chksum.c \
lwip/src/core/timeouts.c \
lwip/src/core/ipv4/icmp.c \ lwip/src/core/ipv4/icmp.c \
lwip/src/core/ipv4/igmp.c \ lwip/src/core/ipv4/igmp.c \
lwip/src/core/ipv4/ip4_addr.c \ lwip/src/core/ipv4/ip4_addr.c \
lwip/src/core/ipv4/ip_frag.c \ lwip/src/core/ipv4/ip4_frag.c \
lwip/src/core/ipv4/ip4.c \ lwip/src/core/ipv4/ip4.c \
lwip/src/core/ipv4/autoip.c \ lwip/src/core/ipv4/autoip.c \
lwip/src/core/ipv6/ethip6.c \ lwip/src/core/ipv6/ethip6.c \
......
Subproject commit 4c0050878618423da53e7e335fbb55ec2af6be06 Subproject commit ba4c45d6b4d30fd6b2557e92a770ccae12ec9257
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment