README
¶
Creek
Brook is a cross-platform network tool designed for developers. Creek on the other hand is based on brook (fully compatible), but it offers more features. The aim is to provide a more user-friendly interface and a way to easily manage multiple Brook instances and clients.
Installation
At the moment I'm not providing any pre-built binaries (coming soon). You can however build the project yourself, it's pretty straightforward and fast.
First, you need to have the Go compiler installed. You can download it and install it easily on Windows, Linux and macOS, just follow the instructions on the official website.
Once you have Go installed, you can build the project as easily as running the following commands:
git clone https://github.com/Klaushayan/creek
cd creek/cli/creek
go build .
And a binary named creek
will be created in the cli/creek
directory.
Server
Both the server and the client work the same way they do in the original Brook. The only difference is that a few options have been added.
creek server -l :9999 -p hello
Client
Creek servers are completely compatible with Brook clients.
replace 1.2.3.4 with your server IP
- brook server:
1.2.3.4:9999
- password:
hello
create socks5://127.0.0.1:1080
creek client -s 1.2.3.4:9999 -p hello
Roadmap
- Limit the number of IP addresses that can connect to the server
- Block IP addresses
- Logging into a file
- An API for managing the server
- Session management to manage multiple instances of the server
- Web panel for easier configuration, management and monitoring
Documentation
For more features, please check the Documentation.
Documentation
¶
Index ¶
- Variables
- func BlockAddress(address string, ds map[string]byte, c4, c6 []*net.IPNet, c *cache.Cache, ...) bool
- func EnableDebug()
- func ErrorReply(r *socks5.Request, c *net.TCPConn, e error) error
- func GetAddressFromURL(s string) (string, error)
- func Link(kind, s, username, password string) string
- func LinkExtra(kind, s, username, password string, v url.Values) string
- func ListHasDomain(ds map[string]byte, domain string, c *cache.Cache) bool
- func ListHasIP(c4, c6 []*net.IPNet, i net.IP, c *cache.Cache, geo []string) bool
- func NextNonce(b []byte)
- func ParseLink(link string) (kind, s, username, password string, err error)
- func ParseLinkExtra(link string) (kind, s, username, password string, v url.Values, err error)
- func QR(kind, s, username, password string)
- func ReadCIDRList(url string) ([]*net.IPNet, error)
- func ReadData(url string) ([]byte, error)
- func ReadDomainList(url string) (map[string]byte, error)
- func ReadList(url string) ([]string, error)
- func Resolve4(host string) (string, error)
- func Resolve6(host string) (string, error)
- func Socks5Test(s, u, p, domain, a, ds string) error
- func WaitReadErr(conn net.Conn)
- type Client
- func (x *Client) ListenAndServe() error
- func (x *Client) Shutdown() error
- func (x *Client) TCPHandle(s *socks5.Server, c *net.TCPConn, r *socks5.Request) error
- func (x *Client) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d *socks5.Datagram) error
- func (x *Client) UDPOverTCPHandle(s *socks5.Server, addr *net.UDPAddr, d *socks5.Datagram) error
- type CreekManager
- func (cm *CreekManager) AddRelay(w http.ResponseWriter, r *http.Request)
- func (cm *CreekManager) AddWSServer(w http.ResponseWriter, r *http.Request)
- func (cm *CreekManager) NewCreekManager(port int) (*CreekManager, error)
- func (cm *CreekManager) NewMap(rj *RelayJSON) (*Map, error)
- func (cm *CreekManager) NewWSServer(wsj *WSServerJSON) (*WSServer, error)
- type DNS
- type DNSServer
- type Exchanger
- type Firewall
- func (f *Firewall) Block(ip ...IP)
- func (f *Firewall) BlockIPList(w http.ResponseWriter, r *http.Request)
- func (f *Firewall) ChangeConfig(w http.ResponseWriter, r *http.Request)
- func (f *Firewall) IsBlocked(ip string) bool
- func (f *Firewall) IsConnected(ip string) bool
- func (f *Firewall) ServeBlockedIPs(w http.ResponseWriter, r *http.Request)
- func (f *Firewall) ServeConfig(w http.ResponseWriter, r *http.Request)
- func (f *Firewall) ServeConnectedIPs(w http.ResponseWriter, r *http.Request)
- func (f *Firewall) Unblock(ip string)
- func (f *Firewall) Verify(ip string) bool
- type IP
- type IPList
- type Job
- type Map
- type PAC
- type PacketClient
- func (c *PacketClient) Clean()
- func (c *PacketClient) LocalToServer(dst, d []byte, server net.Conn, timeout int) error
- func (c *PacketClient) RunServerToLocal(server net.Conn, timeout int, tolocal func(dst, d []byte) (int, error)) error
- func (c *PacketClient) ServerToLocal(server net.Conn, timeout int, tolocal func(dst, d []byte) (int, error)) error
- type PacketServer
- type PacketStream
- func (c *PacketStream) Close() error
- func (c *PacketStream) LocalAddr() net.Addr
- func (c *PacketStream) Read(b []byte) (int, error)
- func (c *PacketStream) RemoteAddr() net.Addr
- func (c *PacketStream) SetDeadline(t time.Time) error
- func (c *PacketStream) SetReadDeadline(t time.Time) error
- func (c *PacketStream) SetWriteDeadline(t time.Time) error
- func (c *PacketStream) Write(b []byte) (int, error)
- type Relay
- type RelayJSON
- type Server
- func (s *Server) ListenAndServe() error
- func (s *Server) RunTCPServer() error
- func (s *Server) RunUDPServer() error
- func (s *Server) Shutdown() error
- func (s *Server) TCPHandle(ss Exchanger, dst []byte) error
- func (s *Server) UDPHandle(addr *net.UDPAddr, b []byte) error
- func (s *Server) UDPOverTCPHandle(ss Exchanger, src string, dstb []byte) error
- type SimpleStreamClient
- type SimpleStreamServer
- type Socks5Dial1
- type Socks5Server
- type Socks5ToHTTP
- type StreamClient
- type StreamServer
- type Tproxy
- func (s *Tproxy) ClearAutoScripts() error
- func (s *Tproxy) ListenAndServe() error
- func (s *Tproxy) RunAutoScripts() error
- func (s *Tproxy) RunTCPServer() error
- func (s *Tproxy) RunUDPServer() error
- func (s *Tproxy) Shutdown() error
- func (s *Tproxy) TCPHandle(c *net.TCPConn) error
- func (s *Tproxy) UDPHandle(addr, daddr *net.UDPAddr, b []byte) error
- type UDPExchange
- type WSClient
- func (x *WSClient) DialWebsocket(src string) (net.Conn, error)
- func (x *WSClient) ListenAndServe() error
- func (x *WSClient) Shutdown() error
- func (x *WSClient) TCPHandle(s *socks5.Server, c *net.TCPConn, r *socks5.Request) error
- func (x *WSClient) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d *socks5.Datagram) error
- type WSServer
- type WSServerJSON
- type WriteFunc
- type WriterFunc
Constants ¶
This section is empty.
Variables ¶
var Debug bool = false
var Dial x.Dialer = x.DefaultDial
var Dial1 x.Dialer1
Functions ¶
func BlockAddress ¶
func GetAddressFromURL ¶
func ParseLinkExtra ¶
func Socks5Test ¶
func WaitReadErr ¶
Types ¶
type Client ¶
type Client struct { Server *socks5.Server ServerAddress string Password []byte TCPTimeout int UDPTimeout int UDPOverTCP bool }
Client.
func (*Client) ListenAndServe ¶
ListenAndServe will let client start a socks5 proxy.
type CreekManager ¶
type CreekManager struct { WSServers []WSServerJSON Relays []RelayJSON Port int }
func (*CreekManager) AddRelay ¶
func (cm *CreekManager) AddRelay(w http.ResponseWriter, r *http.Request)
func (*CreekManager) AddWSServer ¶
func (cm *CreekManager) AddWSServer(w http.ResponseWriter, r *http.Request)
func (*CreekManager) NewCreekManager ¶
func (cm *CreekManager) NewCreekManager(port int) (*CreekManager, error)
func (*CreekManager) NewWSServer ¶
func (cm *CreekManager) NewWSServer(wsj *WSServerJSON) (*WSServer, error)
type DNS ¶
type DNS struct { TCPAddr *net.TCPAddr UDPAddr *net.UDPAddr ServerTCPAddr *net.TCPAddr ServerUDPAddr *net.UDPAddr Password []byte BypassDomains map[string]byte DNSServer string DNSServerForBypass string TCPListen *net.TCPListener UDPConn *net.UDPConn UDPExchanges *cache.Cache TCPTimeout int UDPTimeout int RunnerGroup *runnergroup.RunnerGroup UDPSrc *cache.Cache WSClient *WSClient BlockDomain map[string]byte BypassCache *cache.Cache BlockCache *cache.Cache UDPOverTCP bool }
DNS.
type DNSServer ¶
type DNSServer struct { TCPAddr *net.TCPAddr UDPAddr *net.UDPAddr DNS string DisableIPv4Domain map[string]byte DisableIPv6Domain map[string]byte BlockDomain map[string]byte BlockGeo []string DisableIPv4Cache *cache.Cache DisableIPv6Cache *cache.Cache BlockCache *cache.Cache TCPListen *net.TCPListener UDPConn *net.UDPConn UDPExchanges *cache.Cache UDPSrc *cache.Cache TCPTimeout int UDPTimeout int RunnerGroup *runnergroup.RunnerGroup }
func NewDNSServer ¶
func NewDNSServer(addr, dns, disableIPv4DomainList, disableIPv6DomainList, blockDomainList string, blockGeo []string, tcpTimeout, udpTimeout int) (*DNSServer, error)
NewDNS.
func (*DNSServer) RunTCPServer ¶
RunTCPServer starts tcp server.
func (*DNSServer) RunUDPServer ¶
RunUDPServer starts udp server.
type Exchanger ¶
type Firewall ¶
type Firewall struct { MaxConnections int BlockPeriod int64 ConnectionCooldown int64 // contains filtered or unexported fields }
func NewFirewall ¶
func (*Firewall) BlockIPList ¶
func (f *Firewall) BlockIPList(w http.ResponseWriter, r *http.Request)
func (*Firewall) ChangeConfig ¶
func (f *Firewall) ChangeConfig(w http.ResponseWriter, r *http.Request)
func (*Firewall) IsConnected ¶
func (*Firewall) ServeBlockedIPs ¶
func (f *Firewall) ServeBlockedIPs(w http.ResponseWriter, r *http.Request)
func (*Firewall) ServeConfig ¶
func (f *Firewall) ServeConfig(w http.ResponseWriter, r *http.Request)
func (*Firewall) ServeConnectedIPs ¶
func (f *Firewall) ServeConnectedIPs(w http.ResponseWriter, r *http.Request)
type IP ¶
type Job ¶
type Job struct { JobChan chan func() PingChan chan string Quit chan struct{} Started bool // contains filtered or unexported fields }
func NewJobWithArgument ¶
func (*Job) Start ¶
Uses a string channel to get pinged and executes the job function given in the constructor
func (*Job) StartWithArgument ¶
Uses a string channel to get strings and executes the job function given in the constructor with the string value in the channel
func (*Job) StartWithChannel ¶
Uses a func channel as the job channel and does not use the job function given in the constructor
func (*Job) StartWithTicker ¶
Uses a ticker as the job channel based on the interval
type Map ¶
type Map struct { TCPAddr *net.TCPAddr UDPAddr *net.UDPAddr RemoteAddress string ServerTCPAddr *net.TCPAddr ServerUDPAddr *net.UDPAddr Password []byte TCPListen *net.TCPListener UDPConn *net.UDPConn UDPExchanges *cache.Cache TCPTimeout int UDPTimeout int RunnerGroup *runnergroup.RunnerGroup UDPSrc *cache.Cache WSClient *WSClient UDPOverTCP bool }
Map.
type PAC ¶
type PAC struct { Addr string File string Proxy string DomainURL string DomainData []byte HTTPServer *http.Server Body []byte }
func (*PAC) ListenAndServe ¶
func (*PAC) WriteToFile ¶
func (*PAC) WriteToStdout ¶
type PacketClient ¶
type PacketClient struct { Server net.Conn Password []byte RB []byte WB []byte Dst []byte Timeout int RemoteAddress net.Addr }
func NewPacketClient ¶
func NewPacketClient(password []byte) *PacketClient
func (*PacketClient) Clean ¶
func (c *PacketClient) Clean()
func (*PacketClient) LocalToServer ¶
func (*PacketClient) RunServerToLocal ¶
func (*PacketClient) ServerToLocal ¶
type PacketServer ¶
type PacketServer struct {
// contains filtered or unexported fields
}
func NewPacketServer ¶
func NewPacketServer(password []byte) *PacketServer
func (*PacketServer) Clean ¶
func (s *PacketServer) Clean()
func (*PacketServer) RemoteToClient ¶
type PacketStream ¶
type PacketStream struct {
// contains filtered or unexported fields
}
func NewPacketStream ¶
func (*PacketStream) Close ¶
func (c *PacketStream) Close() error
func (*PacketStream) LocalAddr ¶
func (c *PacketStream) LocalAddr() net.Addr
func (*PacketStream) RemoteAddr ¶
func (c *PacketStream) RemoteAddr() net.Addr
func (*PacketStream) SetDeadline ¶
func (c *PacketStream) SetDeadline(t time.Time) error
func (*PacketStream) SetReadDeadline ¶
func (c *PacketStream) SetReadDeadline(t time.Time) error
func (*PacketStream) SetWriteDeadline ¶
func (c *PacketStream) SetWriteDeadline(t time.Time) error
type Relay ¶
type Relay struct { TCPAddr *net.TCPAddr UDPAddr *net.UDPAddr Remote string TCPListen *net.TCPListener UDPConn *net.UDPConn UDPExchanges *cache.Cache TCPTimeout int UDPTimeout int RunnerGroup *runnergroup.RunnerGroup UDPSrc *cache.Cache }
Relay is relay server.
type Server ¶
type Server struct { Password []byte TCPAddr *net.TCPAddr UDPAddr *net.UDPAddr TCPListen *net.TCPListener UDPConn *net.UDPConn UDPExchanges *cache.Cache TCPTimeout int UDPTimeout int RunnerGroup *runnergroup.RunnerGroup UDPSrc *cache.Cache BlockDomain map[string]byte BlockCIDR4 []*net.IPNet BlockCIDR6 []*net.IPNet BlockGeoIP []string BlockCache *cache.Cache BlockLock *sync.RWMutex Done chan byte Dial func(network, laddr, raddr string) (net.Conn, error) }
Server.
func NewServer ¶
func NewServer(addr, password string, tcpTimeout, udpTimeout int, blockDomainList, blockCIDR4List, blockCIDR6List string, updateListInterval int64, blockGeoIP []string) (*Server, error)
NewServer.
type SimpleStreamClient ¶
func NewSimpleStreamClient ¶
func (*SimpleStreamClient) Clean ¶
func (s *SimpleStreamClient) Clean()
func (*SimpleStreamClient) NetworkName ¶
func (s *SimpleStreamClient) NetworkName() string
func (*SimpleStreamClient) SetTimeout ¶
func (s *SimpleStreamClient) SetTimeout(i int)
type SimpleStreamServer ¶
func NewSimpleStreamServer ¶
func (*SimpleStreamServer) Clean ¶
func (s *SimpleStreamServer) Clean()
func (*SimpleStreamServer) NetworkName ¶
func (s *SimpleStreamServer) NetworkName() string
func (*SimpleStreamServer) SetTimeout ¶
func (s *SimpleStreamServer) SetTimeout(i int)
type Socks5Dial1 ¶
func NewSocks5Dial1 ¶
func NewSocks5Dial1(server, username, password string, tcpTimeout, udpTimeout int) (*Socks5Dial1, error)
type Socks5Server ¶
Socks5Server is raw socks5 server.
func NewSocks5Server ¶
func NewSocks5Server(addr, ip, userName, password string, tcpTimeout, udpTimeout int) (*Socks5Server, error)
NewSocks5Server returns a new Socks5Server.
func (*Socks5Server) ListenAndServe ¶
func (x *Socks5Server) ListenAndServe() error
ListenAndServe will let client start to listen and serve.
func (*Socks5Server) Shutdown ¶
func (x *Socks5Server) Shutdown() error
Shutdown used to stop the client.
type Socks5ToHTTP ¶
type Socks5ToHTTP struct { Addr *net.TCPAddr Socks5Address string Socks5Username string Socks5Password string Dial proxy.Dialer TCPTimeout int Listen *net.TCPListener }
func NewSocks5ToHTTP ¶
func NewSocks5ToHTTP(addr, socks5addr, socks5username, socks5password string, tcpTimeout int) (*Socks5ToHTTP, error)
func (*Socks5ToHTTP) ListenAndServe ¶
func (s *Socks5ToHTTP) ListenAndServe() error
func (*Socks5ToHTTP) Shutdown ¶
func (s *Socks5ToHTTP) Shutdown() error
type StreamClient ¶
type StreamClient struct { Server net.Conn RB []byte WB []byte Timeout int Network string RemoteAddress net.Addr Cache []byte // contains filtered or unexported fields }
func NewStreamClient ¶
func (*StreamClient) Clean ¶
func (c *StreamClient) Clean()
func (*StreamClient) NetworkName ¶
func (s *StreamClient) NetworkName() string
func (*StreamClient) ReadL ¶
func (c *StreamClient) ReadL() (int, error)
func (*StreamClient) SetTimeout ¶
func (s *StreamClient) SetTimeout(i int)
func (*StreamClient) WriteL ¶
func (c *StreamClient) WriteL(l int) error
type StreamServer ¶
type StreamServer struct { Client net.Conn RB []byte WB []byte Timeout int Network string // contains filtered or unexported fields }
func NewStreamServer ¶
func (*StreamServer) Clean ¶
func (s *StreamServer) Clean()
func (*StreamServer) NetworkName ¶
func (s *StreamServer) NetworkName() string
func (*StreamServer) Read ¶
func (s *StreamServer) Read() (int, error)
func (*StreamServer) SetTimeout ¶
func (s *StreamServer) SetTimeout(i int)
func (*StreamServer) Write ¶
func (s *StreamServer) Write(l int) error
type Tproxy ¶
type Tproxy struct { TCPAddr *net.TCPAddr UDPAddr *net.UDPAddr ServerTCPAddr *net.TCPAddr ServerUDPAddr *net.UDPAddr Password []byte TCPListen *net.TCPListener UDPConn *net.UDPConn UDPExchanges *cache.Cache UDPSrc *cache.Cache TCPTimeout int UDPTimeout int RunnerGroup *runnergroup.RunnerGroup EnableIPv6 bool Cidr4 []*net.IPNet Cidr6 []*net.IPNet BypassCache *cache.Cache WSClient *WSClient UDPOverTCP bool }
Tproxy.
func NewTproxy ¶
func NewTproxy(addr, s, password string, enableIPv6 bool, cidr4url, cidr6url string, tcpTimeout, udpTimeout int, address string, insecure, withoutbrook bool, roots *x509.CertPool, udpovertcp bool) (*Tproxy, error)
NewTproxy.
func (*Tproxy) ClearAutoScripts ¶
func (*Tproxy) RunAutoScripts ¶
type UDPExchange ¶
type WSClient ¶
type WSClient struct { Server *socks5.Server ServerHost string ServerAddress string TLSConfig *tls.Config Password []byte TCPTimeout int UDPTimeout int TCPListen *net.TCPListener Path string UDPExchanges *cache.Cache WithoutBrook bool PasswordSha256 []byte }
WSClient.
func NewWSClient ¶
NewWSClient.
func (*WSClient) ListenAndServe ¶
ListenAndServe will let client start a socks5 proxy.
type WSServer ¶
type WSServer struct { Password []byte Domain string TCPAddr *net.TCPAddr HTTPServer *http.Server HTTPSServer *http.Server Firewall *Firewall TCPTimeout int UDPTimeout int Path string UDPSrc *cache.Cache BlockDomain map[string]byte BlockCIDR4 []*net.IPNet BlockCIDR6 []*net.IPNet BlockGeoIP []string BlockCache *cache.Cache BlockLock *sync.RWMutex Done chan byte WSSServerPort int64 Cert []byte CertKey []byte WithoutBrook bool PasswordSha256 []byte Dial func(network, laddr, raddr string) (net.Conn, error) }
WSServer.
func NewWSServer ¶
func NewWSServer(addr, password, domain, path string, tcpTimeout, udpTimeout int, blockDomainList, blockCIDR4List, blockCIDR6List string, updateListInterval int64, blockGeoIP []string, maxClients int, connectionCooldown int, blockTimeout int) (*WSServer, error)
NewWSServer.
type WSServerJSON ¶
type WSServerJSON struct { Addr string `json:"addr"` Password string `json:"password"` Domain string `json:"domain"` Path string `json:"path"` TCPTimeout int `json:"tcp_timeout"` UDPTimeout int `json:"udp_timeout"` BlockDomainList string `json:"block_domain_list"` BlockCIDR4List string `json:"block_cidr4_list"` BlockCIDR6List string `json:"block_cidr6_list"` UpdateListInterval int64 `json:"update_list_interval"` BlockGeoIP []string `json:"block_geoip"` MaxClients int `json:"max_clients"` ConnectionCooldown int `json:"connection_cooldown"` BlockTimeout int `json:"block_timeout"` Object *WSServer }
type WriterFunc ¶
func PacketClientToRemote ¶
func PacketClientToRemote(p, b []byte) ([]byte, []byte, WriterFunc, error)
Source Files
¶
- client.go
- creekmanager.go
- dns.go
- dnsserver.go
- exchanger.go
- firewall.go
- firewallserver.go
- init.go
- job.go
- link.go
- list.go
- map.go
- nonce.go
- pac.go
- packetclient.go
- packetserver.go
- packetstream.go
- relay.go
- resolve.go
- server.go
- simplestreamclient.go
- simplestreamserver.go
- socks5.go
- socks5dial1.go
- socks5test.go
- socks5tohttp.go
- streamclient.go
- streamserver.go
- tproxy_linux.go
- util.go
- waitreaderr.go
- wsclient.go
- wsserver.go