mirror of https://github.com/cbeuw/Cloak
When dialing a localhost connection, set a small send and receive buffer on the socket to 32 KB to avoid bufferbloat in TCP relays.
This commit is contained in:
parent
3a941f29b9
commit
786607d31e
|
|
@ -0,0 +1,8 @@
|
||||||
|
//go:build linux
|
||||||
|
// +build linux
|
||||||
|
|
||||||
|
package server
|
||||||
|
|
||||||
|
func platformfd(fd uintptr) int {
|
||||||
|
return int(fd)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package server
|
||||||
|
|
||||||
|
import "syscall"
|
||||||
|
|
||||||
|
func platformfd(fd uintptr) syscall.Handle {
|
||||||
|
return syscall.Handle(fd)
|
||||||
|
}
|
||||||
|
|
@ -7,10 +7,12 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/cbeuw/Cloak/internal/common"
|
"github.com/cbeuw/Cloak/internal/common"
|
||||||
"github.com/cbeuw/Cloak/internal/server/usermanager"
|
"github.com/cbeuw/Cloak/internal/server/usermanager"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -155,10 +157,40 @@ func InitState(preParse RawConfig, worldState common.WorldState) (sta *State, er
|
||||||
sta.Panel = MakeUserPanel(manager)
|
sta.Panel = MakeUserPanel(manager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialerControl := func(network, address string, c syscall.RawConn) error {
|
||||||
|
if !strings.HasPrefix(network, "tcp") {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ips, err := net.LookupHost(strings.Split(address, ":")[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ipString := range ips {
|
||||||
|
ip := net.ParseIP(ipString)
|
||||||
|
if !ip.IsLoopback() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Control(func(fd uintptr) {
|
||||||
|
err := syscall.SetsockoptInt(platformfd(fd), syscall.SOL_SOCKET, syscall.SO_SNDBUF, 32*1024)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("setsocketopt SO_SNDBUF: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = syscall.SetsockoptInt(platformfd(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, 32*1024)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("setsocketopt SO_RCVBUF: ", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if preParse.KeepAlive <= 0 {
|
if preParse.KeepAlive <= 0 {
|
||||||
sta.ProxyDialer = &net.Dialer{KeepAlive: -1}
|
sta.ProxyDialer = &net.Dialer{KeepAlive: -1, Control: dialerControl}
|
||||||
} else {
|
} else {
|
||||||
sta.ProxyDialer = &net.Dialer{KeepAlive: time.Duration(preParse.KeepAlive) * time.Second}
|
sta.ProxyDialer = &net.Dialer{KeepAlive: time.Duration(preParse.KeepAlive) * time.Second, Control: dialerControl}
|
||||||
}
|
}
|
||||||
|
|
||||||
sta.RedirHost, sta.RedirPort, err = parseRedirAddr(preParse.RedirAddr)
|
sta.RedirHost, sta.RedirPort, err = parseRedirAddr(preParse.RedirAddr)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue