eycorsican / kitsunebi-android

A fully-featured V2Ray client for Android.
MIT License
1.78k stars 315 forks source link

could you consider partly open source? #174

Closed rurirei closed 4 years ago

rurirei commented 4 years ago

great thanks for if could you open source the implementation of Local DNS of go-tun2socks @eycorsican https://github.com/eycorsican/kitsunebi-android/blob/6bccc618029eb9cd87235c15f868bda82ba1b1de/app/src/main/java/fun/kitsunebi/kitsunebi4android/service/SimpleVpnService.kt#L289-L292

eycorsican commented 4 years ago
    protectFd := func(s VpnService, fd int) error {
        if s.Protect(fd) {
            return nil
        } else {
            return errors.New(fmt.Sprintf("failed to protect fd %v", fd))
        }
    }
    netCtlr := func(network, address string, fd uintptr) error {
        return protectFd(vpnService, int(fd))
    }

    net.DefaultResolver = &net.Resolver{
        PreferGo: true,
        Dial: func(ctx context.Context, network, addr string) (net.Conn, error) {
            dialer := &net.Dialer{
                DualStack: true,
                Control: func(network, address string, c syscall.RawConn) error {
                    return c.Control(func(fd uintptr) {
                        netCtlr(network, address, fd)
                    })
                },
            }
            return dialer.DialContext(ctx, network, localDNS)
        },
    }
rurirei commented 4 years ago

great thanks. https://github.com/rurirei/go-libv2ray/commit/9f1e33e

rurirei commented 4 years ago

great thanks. rurirei/go-libv2ray@9f1e33e

sorry for asking. how do i forward dns traffic to v2ray inbound from tun2socks? i set net.defaultResolver with addr 127.0.0.1:10088 (localDns string) and set Dokodemo-Door inbound (listen on port 10088, address 8.8.8.8 port 53)

PrepareDomain err: lookup server.address.domain on [::1]:53: read udp 127.0.0.1:48822->127.0.0.1:10088: read: connection refused
eycorsican commented 4 years ago

I don't remember the details, but I never use dokodemo-door to handle DNS, instead you could route DNS traffic to a DNS outbound:

            {
                "inboundTag": ["tun2socks"],
                "network": "udp",
                "port": 53,
                "outboundTag": "dns-out",
                "type": "field"
            },
rurirei commented 4 years ago

though what is inbound tun2socks, i did thought it to Dokodemo inbound.

eycorsican commented 4 years ago

You attach a ctx with a "tun2socks" tag when dialing connections with a V instance, then v2ray will recognize those traffic are coming from "tun2socks":

    ctx = vsession.ContextWithInbound(ctx, &vsession.Inbound{Tag: "tun2socks"})
c, err := vcore.Dial(ctx, h.v, dest)
rurirei commented 4 years ago

You attach a ctx with a "tun2socks" tag when dialing connections with a V instance, then v2ray will recognize those traffic are coming from "tun2socks":

    ctx = vsession.ContextWithInbound(ctx, &vsession.Inbound{Tag: "tun2socks"})
c, err := vcore.Dial(ctx, h.v, dest)

thanks for reply, how to handle dns traffic from net.DefaultResolver with vcore.Dial(ctx, h.v, dest) then?

eycorsican commented 4 years ago

The fd is protected as you can see in the code snippet above, protected traffic won't go into v2ray, that's why it's called local dns.

rurirei commented 4 years ago

so i was thought meanings of local dns on anything wrong.

rurirei commented 4 years ago

android:defaultValue="223.5.5.5" android:key="@string/local_dns" android:summary="The DNS server that will be used by the freedom outbound (in case you are using AsIs as the freedom outbound's domain strategy) or for resolving domain names of outbound servers, and these DNS requests won't be logged to proxy log. Moreover, non A/AAAA DNS queries from the OS will also be sent to this DNS server, they will be treated as normal UDP traffic." android:title="Local DNS"

sorry but could you give some more function explaination of Local DNS?

rurirei commented 4 years ago

i was misunderstood this to the similar to tun2socks --dnsgw 127.0.0.1:10088.

so i was thought meanings of local dns on anything wrong.

rurirei commented 4 years ago

I don't remember the details, but I never use dokodemo-door to handle DNS, instead you could route DNS traffic to a DNS outbound:

            {
                "inboundTag": ["tun2socks"],
                "network": "udp",
                "port": 53,
                "outboundTag": "dns-out",
                "type": "field"
            },

but local dns traffic won't into v2ray..

eycorsican commented 4 years ago

It means DNS traffic initiated from this resolver will definitely go into the internet directly, no proxying, that's it.

    net.DefaultResolver = &net.Resolver{

I think what you missed here is only the VPN itself (only the Go code) will use this resolver. And you still need to handle DNS traffic coming from other applications, those traffic should be routed to a DNS outbound.

rurirei commented 4 years ago

only the VPN itself (only the Go code) will use this resolver

this is exactly i missed.

need to handle DNS traffic coming from other applications

i dont know how should to done this

those traffic should be routed to a DNS outbound

v2ray dns handle its dns-outbound if IP query. is this "Moreover, non A/AAAA DNS queries from the OS will also be sent to this DNS server"?

eycorsican commented 4 years ago

v2ray dns handle its dns-outbound if IP query. is this "Moreover, non A/AAAA DNS queries from the OS will also be sent to this DNS server"?

I forgot, I'm not sure about this without looking into the code.

rurirei commented 4 years ago

gave this up.