use comzyh/add-water
This commit is contained in:
13 files changed
+189
-238
No files matched your search
@@ -0,0 +1,3 @@
|
||||
[submodule "core/src/main/golang/clash"]
|
||||
path = core/src/main/golang/clash
|
||||
url = https://github.com/Kr328/Clash
|
||||
Submodule
+1
Submodule core/src/main/golang/clash added at 791a7cd647.
@@ -1,11 +1,11 @@
|
||||
module github.com/kr328/clash
|
||||
module github.com/kr328/cfa
|
||||
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/Dreamacro/clash v0.16.1-0.20191112020912-8e10e67b8925
|
||||
github.com/google/btree v1.0.0 // indirect
|
||||
github.com/google/netstack v0.0.0-20191116005144-95bf25ab4723
|
||||
golang.org/x/sys v0.0.0-20191118133127-cf1e2d577169
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
|
||||
github.com/Dreamacro/clash v0.0.0 // local
|
||||
github.com/google/netstack v0.0.0-20191031000057-4787376a6744
|
||||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe
|
||||
)
|
||||
|
||||
replace github.com/Dreamacro/clash v0.0.0 => ./clash
|
||||
@@ -1,6 +1,3 @@
|
||||
github.com/Dreamacro/clash v0.16.0 h1:ZvV9apOrDHC0s5ff4YCHTRANd/XyOuLWvpyLWOkwS6U=
|
||||
github.com/Dreamacro/clash v0.16.1-0.20191112020912-8e10e67b8925 h1:MukeaV6O94OWvqzcd3C635+xQNa8spHqKEI0E+ovXnA=
|
||||
github.com/Dreamacro/clash v0.16.1-0.20191112020912-8e10e67b8925/go.mod h1:4ZBtABBmIGqISniBtu9fpYORrE5mKqIP8SMCTrNNVNY=
|
||||
github.com/Dreamacro/go-shadowsocks2 v0.1.5-0.20191012162057-46254afc8b68 h1:UBDLpj1IGVkUcUBuZWE6DmZApPTZcnmcV6AfyDN/yhg=
|
||||
github.com/Dreamacro/go-shadowsocks2 v0.1.5-0.20191012162057-46254afc8b68/go.mod h1:Y8obOtHDOqxMGHjPglfCiXZBKExOA9VL6I6sJagOwYM=
|
||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
|
||||
@@ -9,21 +6,17 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
|
||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||
github.com/go-chi/chi v4.0.2+incompatible h1:maB6vn6FqCxrpz4FqWdh4+lwpyZIQS7YEAUcHlgXVRs=
|
||||
github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
|
||||
github.com/go-chi/cors v1.0.0 h1:e6x8k7uWbUwYs+aXDoiUzeQFT6l0cygBYyNhD7/1Tg0=
|
||||
github.com/go-chi/cors v1.0.0/go.mod h1:K2Yje0VW/SJzxiyMYu6iPQYa7hMjQX2i/F491VChg1I=
|
||||
github.com/go-chi/render v1.0.1 h1:4/5tis2cKaNdnv9zFLfXzcquC9HbeZgCnxGnKrltBS8=
|
||||
github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns=
|
||||
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
|
||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/netstack v0.0.0-20191116005144-95bf25ab4723 h1:z92yYpQg57ql9n96PBLFhT+N5X44uQ2f3+CNp9Osmu8=
|
||||
github.com/google/netstack v0.0.0-20191116005144-95bf25ab4723/go.mod h1:r/rILWg3r1Qy9G1IFMhsqWLq2GjwuYoTuPgG7ckMAjk=
|
||||
github.com/google/netstack v0.0.0-20191031000057-4787376a6744 h1:wKeh74w+ydKcE1Eo44WDzIOcPHWmxxmtAzkAL0Mlspc=
|
||||
github.com/google/netstack v0.0.0-20191031000057-4787376a6744/go.mod h1:r/rILWg3r1Qy9G1IFMhsqWLq2GjwuYoTuPgG7ckMAjk=
|
||||
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/miekg/dns v1.1.22 h1:Jm64b3bO9kP43ddLjL2EY3Io6bmy1qGb9Xxz6TqS6rc=
|
||||
github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
|
||||
@@ -56,8 +49,6 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe h1:6fAMxZRR6sl1Uq8U61gxU+kPTs2tR8uOySCbBP7BN/M=
|
||||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191118133127-cf1e2d577169 h1:LPLFLulk2vyM7yI3CwNW64O6e8AxBmr9opfv14yI7HI=
|
||||
golang.org/x/sys v0.0.0-20191118133127-cf1e2d577169/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
|
||||
"github.com/Dreamacro/clash/constant"
|
||||
|
||||
"github.com/kr328/clash/profile"
|
||||
"github.com/kr328/clash/server"
|
||||
"github.com/kr328/cfa/profile"
|
||||
"github.com/kr328/cfa/server"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
adapters "github.com/Dreamacro/clash/adapters/outbound"
|
||||
"github.com/Dreamacro/clash/component/auth"
|
||||
trie "github.com/Dreamacro/clash/component/domain-trie"
|
||||
"github.com/Dreamacro/clash/component/socks5"
|
||||
"github.com/Dreamacro/clash/config"
|
||||
"github.com/Dreamacro/clash/constant"
|
||||
"github.com/Dreamacro/clash/dns"
|
||||
@@ -15,7 +14,7 @@ import (
|
||||
"github.com/Dreamacro/clash/log"
|
||||
"github.com/Dreamacro/clash/tunnel"
|
||||
|
||||
"github.com/kr328/clash/tun"
|
||||
"github.com/kr328/cfa/tun"
|
||||
)
|
||||
|
||||
// LoadDefault - load default configure
|
||||
@@ -83,10 +82,12 @@ func LoadFromFile(path string) error {
|
||||
addr = strings.ReplaceAll(addr, "0.0.0.0", "127.0.0.1")
|
||||
addr = strings.ReplaceAll(addr, "::", "::1")
|
||||
|
||||
if err == nil {
|
||||
listen := socks5.ParseAddr(addr)
|
||||
tun.SetDNSRedirect(&listen)
|
||||
listen, err := net.ResolveUDPAddr("udp", addr)
|
||||
if err != nil {
|
||||
log.Errorln("Unable to parse dns address" + err.Error())
|
||||
}
|
||||
|
||||
tun.SetDNSRedirect(listen)
|
||||
} else {
|
||||
tun.SetDNSRedirect(nil)
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"net"
|
||||
|
||||
"github.com/Dreamacro/clash/log"
|
||||
"github.com/kr328/clash/profile"
|
||||
"github.com/kr328/cfa/profile"
|
||||
)
|
||||
|
||||
func handleProfileDefault(client *net.UnixConn) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net"
|
||||
|
||||
"github.com/Dreamacro/clash/log"
|
||||
"github.com/kr328/clash/tun"
|
||||
"github.com/kr328/cfa/tun"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
@@ -45,7 +45,9 @@ func handleTunStart(client *net.UnixConn) {
|
||||
return
|
||||
}
|
||||
|
||||
tun.StartTunProxy(fds[0], int(mtu))
|
||||
if err := tun.StartTunProxy(fds[0], int(mtu)); err != nil {
|
||||
log.Errorln("Open tun device failure" + err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func handleTunStop(client *net.UnixConn) {
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
package tun
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"github.com/google/netstack/tcpip/link/fdbased"
|
||||
"github.com/google/netstack/tcpip/stack"
|
||||
|
||||
"github.com/Dreamacro/clash/log"
|
||||
)
|
||||
|
||||
type tunDevice struct {
|
||||
mtu int
|
||||
fd int
|
||||
linkCache *stack.LinkEndpoint
|
||||
}
|
||||
|
||||
func openTunDevice(fd int, mtu int) (*tunDevice, error) {
|
||||
var ifr struct {
|
||||
name [16]byte
|
||||
flags uint16
|
||||
_ [22]byte
|
||||
}
|
||||
|
||||
_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), syscall.TUNGETIFF, uintptr(unsafe.Pointer(&ifr)))
|
||||
if errno != 0 {
|
||||
return nil, errno
|
||||
}
|
||||
|
||||
if ifr.flags&syscall.IFF_TUN == 0 || ifr.flags&syscall.IFF_NO_PI == 0 {
|
||||
return nil, errors.New("Only tun device and no pi mode supported")
|
||||
}
|
||||
|
||||
log.Infoln("Open tun fd = %d mtu = %d", fd, mtu)
|
||||
|
||||
return &tunDevice{
|
||||
fd: fd,
|
||||
mtu: mtu,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (t tunDevice) asLinkEndpoint() (result stack.LinkEndpoint, err error) {
|
||||
if t.linkCache != nil {
|
||||
return *t.linkCache, nil
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, errors.New("Unable to get device mtu")
|
||||
}
|
||||
|
||||
result, err = fdbased.New(&fdbased.Options{
|
||||
FDs: []int{t.fd},
|
||||
MTU: uint32(t.mtu),
|
||||
EthernetHeader: false,
|
||||
})
|
||||
|
||||
t.linkCache = &result
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (t tunDevice) close() {
|
||||
syscall.Close(t.fd)
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
package tun
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/google/netstack/tcpip/adapters/gonet"
|
||||
"github.com/google/netstack/tcpip/buffer"
|
||||
"github.com/google/netstack/tcpip/stack"
|
||||
"github.com/google/netstack/tcpip/transport/udp"
|
||||
"github.com/google/netstack/waiter"
|
||||
)
|
||||
|
||||
const defaultTimeout = 5
|
||||
const defaultDNS = "8.8.8.8"
|
||||
|
||||
type DnsRedirectEndpoint struct {
|
||||
stack *stack.Stack
|
||||
udpForwarder *udp.Forwarder
|
||||
targetAddr *net.UDPAddr
|
||||
}
|
||||
|
||||
func NewDnsRedirect(s *stack.Stack) *DnsRedirectEndpoint {
|
||||
result := &DnsRedirectEndpoint{
|
||||
stack: s,
|
||||
udpForwarder: nil,
|
||||
targetAddr: &net.UDPAddr{IP: net.ParseIP("8.8.8.8"), Port: 53},
|
||||
}
|
||||
|
||||
result.udpForwarder = udp.NewForwarder(s, func(request *udp.ForwarderRequest) {
|
||||
var wq waiter.Queue
|
||||
ep, err := request.CreateEndpoint(&wq)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
conn := gonet.NewConn(&wq, ep)
|
||||
|
||||
targetConn, udpErr := net.DialUDP("udp", &net.UDPAddr{IP: net.IPv4zero, Port: 0}, result.targetAddr)
|
||||
if udpErr != nil {
|
||||
conn.Close()
|
||||
return
|
||||
}
|
||||
|
||||
// send
|
||||
go func() {
|
||||
var buffer [128]byte
|
||||
|
||||
defer targetConn.Close()
|
||||
defer conn.Close()
|
||||
|
||||
for {
|
||||
conn.SetDeadline(time.Now().Add(defaultTimeout * time.Second))
|
||||
|
||||
n, err := conn.Read(buffer[:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
_, err = targetConn.Write(buffer[:n])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// recive
|
||||
go func() {
|
||||
var buffer [128]byte
|
||||
|
||||
defer targetConn.Close()
|
||||
defer conn.Close()
|
||||
|
||||
for {
|
||||
conn.SetDeadline(time.Now().Add(defaultTimeout * time.Second))
|
||||
|
||||
n, err := targetConn.Read(buffer[:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
_, err = conn.Write(buffer[:n])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func (d *DnsRedirectEndpoint) SetTargetAddress(addr *net.UDPAddr) {
|
||||
d.targetAddr = addr
|
||||
}
|
||||
|
||||
func (d *DnsRedirectEndpoint) UniqueID() uint64 {
|
||||
return 999
|
||||
}
|
||||
|
||||
func (d *DnsRedirectEndpoint) HandlePacket(r *stack.Route, id stack.TransportEndpointID, pkt buffer.VectorisedView) {
|
||||
d.udpForwarder.HandlePacket(r, id, nil, pkt)
|
||||
}
|
||||
|
||||
func (d *DnsRedirectEndpoint) HandleControlPacket(id stack.TransportEndpointID, typ stack.ControlType, extra uint32, pkt buffer.VectorisedView) {
|
||||
// Unsupported
|
||||
}
|
||||
|
||||
func (d *DnsRedirectEndpoint) Close() {
|
||||
// Unsupported
|
||||
}
|
||||
|
||||
func (d *DnsRedirectEndpoint) Wait() {
|
||||
// Unsupported
|
||||
}
|
||||
+45
-130
@@ -1,166 +1,81 @@
|
||||
// Package tun from https://github.com/comzyh/clash/tree/add-water/proxy/tun
|
||||
package tun
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
"strconv"
|
||||
|
||||
adapters "github.com/Dreamacro/clash/adapters/inbound"
|
||||
"github.com/Dreamacro/clash/component/socks5"
|
||||
C "github.com/Dreamacro/clash/constant"
|
||||
"github.com/Dreamacro/clash/log"
|
||||
T "github.com/Dreamacro/clash/tunnel"
|
||||
|
||||
"encoding/binary"
|
||||
"github.com/Dreamacro/clash/proxy/tun"
|
||||
|
||||
"github.com/google/netstack/tcpip"
|
||||
"github.com/google/netstack/tcpip/adapters/gonet"
|
||||
"github.com/google/netstack/tcpip/network/ipv4"
|
||||
"github.com/google/netstack/tcpip/network/ipv6"
|
||||
"github.com/google/netstack/tcpip/stack"
|
||||
"github.com/google/netstack/tcpip/transport/tcp"
|
||||
"github.com/google/netstack/tcpip/transport/udp"
|
||||
"github.com/google/netstack/waiter"
|
||||
)
|
||||
|
||||
type tun struct {
|
||||
device *tunDevice
|
||||
ipstack *stack.Stack
|
||||
type handler struct {
|
||||
tunAdapter *tun.TunAdapter
|
||||
dnsRedirect *DnsRedirectEndpoint
|
||||
}
|
||||
|
||||
var (
|
||||
tunnel = T.Instance()
|
||||
instance *tun
|
||||
dnsRedirectAddr *socks5.Addr
|
||||
instance *handler
|
||||
dnsRedirectAddr *net.UDPAddr
|
||||
)
|
||||
|
||||
// StartTunProxy - start
|
||||
func StartTunProxy(fd, mtu int) error {
|
||||
if instance != nil {
|
||||
instance.close()
|
||||
}
|
||||
StopTunProxy()
|
||||
|
||||
var err error
|
||||
instance, err = newTunProxy(fd, mtu)
|
||||
adapter, err := tun.NewTunProxy("fd://" + strconv.Itoa(fd) + "?mtu=" + strconv.Itoa(mtu))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s := adapter.Stack()
|
||||
|
||||
endpoint := NewDnsRedirect(s)
|
||||
|
||||
id := &stack.TransportEndpointID{
|
||||
LocalAddress: "",
|
||||
LocalPort: 53,
|
||||
RemotePort: 0,
|
||||
RemoteAddress: "",
|
||||
}
|
||||
|
||||
if err := s.RegisterTransportEndpoint(1,
|
||||
[]tcpip.NetworkProtocolNumber{
|
||||
ipv4.ProtocolNumber,
|
||||
},
|
||||
udp.ProtocolNumber,
|
||||
*id,
|
||||
endpoint,
|
||||
true,
|
||||
1); err != nil {
|
||||
log.Errorln("Unable to set dns redirect" + err.String())
|
||||
}
|
||||
|
||||
instance = &handler{
|
||||
tunAdapter: &adapter,
|
||||
dnsRedirect: endpoint,
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// StopTunProxy - stop
|
||||
func StopTunProxy() {
|
||||
log.Infoln("Tun Device Stopped")
|
||||
|
||||
instance.close()
|
||||
instance = nil
|
||||
if instance != nil {
|
||||
(*instance.tunAdapter).Close()
|
||||
instance = nil
|
||||
}
|
||||
}
|
||||
|
||||
// SetDNSRedirect - set dns
|
||||
func SetDNSRedirect(addr *socks5.Addr) {
|
||||
dnsRedirectAddr = addr
|
||||
}
|
||||
|
||||
func newTunProxy(fd int, mtu int) (*tun, error) {
|
||||
tundev, err := openTunDevice(fd, mtu)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can't open tun: %v", err)
|
||||
}
|
||||
|
||||
ipstack := stack.New(stack.Options{
|
||||
NetworkProtocols: []stack.NetworkProtocol{ipv4.NewProtocol(), ipv6.NewProtocol()},
|
||||
TransportProtocols: []stack.TransportProtocol{tcp.NewProtocol(), udp.NewProtocol()},
|
||||
})
|
||||
|
||||
linkEP, err := tundev.asLinkEndpoint()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Unable to create virtual endpoint: %v", err)
|
||||
}
|
||||
|
||||
if err := ipstack.CreateNIC(1, linkEP); err != nil {
|
||||
return nil, fmt.Errorf("Fail to create NIC in ipstack: %v", err)
|
||||
}
|
||||
|
||||
// IPv4 0.0.0.0/0
|
||||
subnet, _ := tcpip.NewSubnet(tcpip.Address(strings.Repeat("\x00", 4)), tcpip.AddressMask(strings.Repeat("\x00", 4)))
|
||||
ipstack.AddAddressRange(1, ipv4.ProtocolNumber, subnet)
|
||||
|
||||
// IPv6 [::]/0
|
||||
subnet, _ = tcpip.NewSubnet(tcpip.Address(strings.Repeat("\x00", 16)), tcpip.AddressMask(strings.Repeat("\x00", 16)))
|
||||
ipstack.AddAddressRange(1, ipv6.ProtocolNumber, subnet)
|
||||
|
||||
// TCP handler
|
||||
tcpFwd := tcp.NewForwarder(ipstack, 0, 16, func(r *tcp.ForwarderRequest) {
|
||||
var wq waiter.Queue
|
||||
ep, err := r.CreateEndpoint(&wq)
|
||||
if err != nil {
|
||||
log.Warnln("Can't create TCP Endpoint in ipstack: %v", err)
|
||||
return
|
||||
}
|
||||
r.Complete(false)
|
||||
|
||||
conn := gonet.NewConn(&wq, ep)
|
||||
target := getAddr(ep.Info().(*tcp.EndpointInfo).ID, false)
|
||||
tunnel.Add(adapters.NewSocket(target, conn, C.REDIR, C.TCP))
|
||||
|
||||
})
|
||||
ipstack.SetTransportProtocolHandler(tcp.ProtocolNumber, tcpFwd.HandlePacket)
|
||||
|
||||
// UDP handler
|
||||
udpFwd := udp.NewForwarder(ipstack, func(r *udp.ForwarderRequest) {
|
||||
var wq waiter.Queue
|
||||
ep, err := r.CreateEndpoint(&wq)
|
||||
if err != nil {
|
||||
log.Warnln("Can't create UDP Endpoint in ipstack: %v", err)
|
||||
}
|
||||
|
||||
conn := gonet.NewConn(&wq, ep)
|
||||
target := getAddr(ep.Info().(*stack.TransportEndpointInfo).ID, true)
|
||||
tunnel.Add(adapters.NewSocket(target, conn, C.REDIR, C.UDP))
|
||||
|
||||
})
|
||||
ipstack.SetTransportProtocolHandler(udp.ProtocolNumber, udpFwd.HandlePacket)
|
||||
|
||||
tl := &tun{
|
||||
device: tundev,
|
||||
ipstack: ipstack,
|
||||
}
|
||||
|
||||
log.Infoln("Tun Adapter ready", fd, mtu)
|
||||
|
||||
return tl, nil
|
||||
}
|
||||
|
||||
// Close close the TunAdapter
|
||||
func (t *tun) close() {
|
||||
t.device.close()
|
||||
t.ipstack.Close()
|
||||
}
|
||||
|
||||
func getAddr(id stack.TransportEndpointID, dnsRedirect bool) socks5.Addr {
|
||||
ipv4 := id.LocalAddress.To4()
|
||||
|
||||
if id.LocalPort == 53 && dnsRedirectAddr != nil && dnsRedirect {
|
||||
return *dnsRedirectAddr
|
||||
}
|
||||
|
||||
// get the big-endian binary represent of port
|
||||
port := make([]byte, 2)
|
||||
binary.BigEndian.PutUint16(port, id.LocalPort)
|
||||
|
||||
if ipv4 != "" {
|
||||
addr := make([]byte, 1+net.IPv4len+2)
|
||||
addr[0] = socks5.AtypIPv4
|
||||
copy(addr[1:1+net.IPv4len], []byte(ipv4))
|
||||
addr[1+net.IPv4len], addr[1+net.IPv4len+1] = port[0], port[1]
|
||||
return addr
|
||||
func SetDNSRedirect(addr *net.UDPAddr) {
|
||||
if instance == nil {
|
||||
return
|
||||
}
|
||||
|
||||
addr := make([]byte, 1+net.IPv6len+2)
|
||||
addr[0] = socks5.AtypIPv6
|
||||
copy(addr[1:1+net.IPv6len], []byte(id.LocalAddress))
|
||||
addr[1+net.IPv6len], addr[1+net.IPv6len+1] = port[0], port[1]
|
||||
return addr
|
||||
instance.dnsRedirect.SetTargetAddress(addr)
|
||||
}
|
||||
@@ -15,7 +15,9 @@ class TunService : VpnService(), IClashEventObserver {
|
||||
// from https://github.com/shadowsocks/shadowsocks-android/blob/master/core/src/main/java/com/github/shadowsocks/bg/VpnService.kt
|
||||
private const val VPN_MTU = 1500
|
||||
private const val PRIVATE_VLAN4_CLIENT = "172.19.0.1"
|
||||
private const val PRIVATE_VLAN4_DNS = "172.19.0.2"
|
||||
private const val PRIVATE_VLAN6_CLIENT = "fdfe:dcba:9876::1"
|
||||
private const val PRIVATE_VLAN6_DNS = "fdfe:dcba:9876::2"
|
||||
}
|
||||
|
||||
private var start = true
|
||||
@@ -56,7 +58,8 @@ class TunService : VpnService(), IClashEventObserver {
|
||||
fileDescriptor = Builder()
|
||||
.addAddress(PRIVATE_VLAN4_CLIENT, 30)
|
||||
.addAddress(PRIVATE_VLAN6_CLIENT, 126)
|
||||
.addDefaultDns()
|
||||
.addDnsServer(PRIVATE_VLAN4_DNS)
|
||||
.addDnsServer(PRIVATE_VLAN6_DNS)
|
||||
.addBypassApplications()
|
||||
.addBypassPrivateRoute()
|
||||
.setMtu(VPN_MTU)
|
||||
@@ -128,13 +131,6 @@ class TunService : VpnService(), IClashEventObserver {
|
||||
return this
|
||||
}
|
||||
|
||||
private fun Builder.addDefaultDns(): Builder {
|
||||
resources.getStringArray(R.array.default_dns).forEach {
|
||||
addDnsServer(it)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
private fun Builder.addBypassApplications(): Builder {
|
||||
resources.getStringArray(R.array.default_bypass_application)
|
||||
.forEach {
|
||||
|
||||
@@ -160,13 +160,6 @@
|
||||
<item>208.0.0.0/4</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="default_dns" translatable="false">
|
||||
<item>119.29.29.29</item>
|
||||
<item>223.5.5.5</item>
|
||||
<item>1.1.1.1</item>
|
||||
<item>8.8.8.8</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="default_bypass_application">
|
||||
<item>com.github.kr328.clash</item>
|
||||
<item>com.android.networkstack</item>
|
||||
|
||||
Reference in new issue
Block a user