Skip to content

Commit

Permalink
Update android cmd flags
Browse files Browse the repository at this point in the history
  • Loading branch information
coyove committed Sep 25, 2018
1 parent c20047f commit a5fe9d7
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 72 deletions.
45 changes: 19 additions & 26 deletions cmd/goflyway/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ var (
cmdDisableUDP = flag.Bool("disable-udp", false, "[S] Disable UDP relay")
cmdDisableLRP = flag.Bool("disable-localrp", false, "[S] Disable client localrp control request")
cmdProxyPass = flag.String("proxy-pass", "", "[S] Use goflyway as a reverse HTTP proxy")
cmdAnswer = flag.String("answer", "", "[S] Answer client config setup")
cmdLBindWaits = flag.Int64("lbind-timeout", 5, "[S] Local bind timeout in seconds")
cmdLBindCap = flag.Int64("lbind-cap", 100, "[S] Local bind requests buffer")
cmdAutoCert = flag.String("autocert", "www.example.com", "[S] Use autocert to get a valid certificate")
Expand All @@ -65,7 +64,6 @@ var (
cmdVPN = flag.Bool("vpn", false, "[C] VPN mode, used on Android only")
cmdACL = flag.String("acl", "chinalist.txt", "[C] Load ACL file")
cmdMITMDump = flag.String("mitm-dump", "", "[C] Dump HTTPS requests to file")
cmdRemote = flag.Bool("remote", false, "[C] Get config setup from the upstream")
cmdBind = flag.String("bind", "", "[C] Bind to an address at server")
cmdLBind = flag.String("lbind", "", "[C] Bind a local address to server")
cmdLBindConn = flag.Int64("lbind-conns", 1, "[C] Local bind request connections")
Expand Down Expand Up @@ -117,24 +115,32 @@ func loadConfig() {

buf, err := ioutil.ReadFile(path)
if err != nil {
logger.L("Init", "Can't load config file", err)
logger.L("Config", "Error", err)
return
}

if strings.Contains(path, "shadowsocks.conf") {
logger.L("Config", "Read shadowsocks config")
logger.L("Config", "Shadowsocks")

cmds := make(map[string]interface{})
if err := json.Unmarshal(buf, &cmds); err != nil {
logger.L("Config", "Can't parse config file", err)
logger.L("Config", "Parse", err)
return
}

*cmdKey = cmds["password"].(string)
*cmdUpstream = fmt.Sprintf("%v:%v", cmds["server"], cmds["server_port"])
if port := int(cmds["server_port"].(float64)); port > 50000 {
*cmdRemote = true
*cmdUpstream = fmt.Sprintf("%v:%v", cmds["server"], port-50000)
if strings.HasPrefix(*cmdKey, "?") {
switch (*cmdKey)[1] {
case 'w':
*cmdUpstream = "ws://" + *cmdUpstream
case 's':
*cmdUnderlay = "https"
// case 'k':
// *cmdUnderlay = "kcp"
case 'c':
*cmdUpstream = "ws://" + *cmdUpstream + "/" + (*cmdKey)[2:]
}
}
*cmdMux = 10
*cmdLogLevel = "dbg"
Expand All @@ -145,11 +151,11 @@ func loadConfig() {

cf, err := config.ParseConf(string(buf))
if err != nil {
logger.L("Config", "Can't parse config file", err)
logger.L("Config", "Parse", err)
return
}

logger.L("Config", "Reading config section", *cmdSection)
logger.L("Config", "Section", *cmdSection)
func(args ...interface{}) {
for i := 0; i < len(args); i += 2 {
switch f, name := args[i+1], strings.TrimSpace(args[i].(string)); f.(type) {
Expand Down Expand Up @@ -186,10 +192,8 @@ func loadConfig() {
"lbindcap ", cmdLBindCap,
"lbindconns ", cmdLBindConn,
"mitmdump ", cmdMITMDump,
"remote ", cmdRemote,
"answer ", cmdAnswer,
"underlay ", cmdUnderlay,
"acme ", cmdAutoCert,
"autocert ", cmdAutoCert,
)
}

Expand Down Expand Up @@ -342,7 +346,6 @@ func main() {
ProxyPassAddr: *cmdProxyPass,
DisableUDP: *cmdDisableUDP,
DisableLRP: *cmdDisableLRP,
ClientAnswer: *cmdAnswer,
LBindTimeout: *cmdLBindWaits,
LBindCap: *cmdLBindCap,
Logger: logger,
Expand Down Expand Up @@ -401,18 +404,7 @@ func main() {
logger.L("Alias", cipher.Alias)
if *cmdUpstream != "" {
client := proxy.NewClient(localaddr, cc)

if *cmdRemote {
logger.L("Config", "Remote answer", "Get config from the upstream")
cm := client.GetRemoteConfig()
if cm == "" {
logger.F("Config", "Error", "Can't get remote config")
}

parseUpstream(cc, cm)
client = proxy.NewClient(localaddr, cc)
}
logger.L("Final Stage", "Server", client.Upstream)
logger.L("Client", "Dial", client.Upstream)

if method != "" {
curl(client, method, url, nil)
Expand Down Expand Up @@ -471,6 +463,7 @@ func main() {
}

func parseUpstream(cc *proxy.ClientConfig, upstream string) {
logger.L("Upstream", upstream)
if is := func(in string) bool { return strings.HasPrefix(upstream, in) }; is("https://") {
cc.Connect2Auth, cc.Connect2, _, cc.Upstream = parseAuthURL(upstream)
logger.L("HTTPS Proxy", "Auth", cc.Connect2+"@"+cc.Connect2Auth)
Expand Down
32 changes: 1 addition & 31 deletions proxy/acl.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func (proxy *ProxyClient) canDirectConnect(host string) (r byte, ext string) {
defer func() {
if proxy.Policy.IsSet(PolicyGlobal) && !priv {
r = ruleProxy
ext += "Global"
ext = "Global"
} else {
proxy.DNSCache.Add(host, &Rule{ipstr, r, r, rule})
}
Expand Down Expand Up @@ -126,33 +126,3 @@ func (proxy *ProxyClient) canDirectConnect(host string) (r byte, ext string) {
return ruleProxy, "Unknown"
}
}

func (proxy *ProxyClient) GetRemoteConfig() string {
cr := proxy.Cipher.newRequest()
cr.Opt.Set(doDNS)
cr.Auth = proxy.UserAuth
cr.Query = "~"

dnsloc := "http://" + proxy.Upstream
trueloc := "http://" + proxy.genHost() + "/" + proxy.encryptHost("config", cr)

if proxy.URLHeader == "" {
dnsloc = trueloc
}

req, _ := http.NewRequest("GET", dnsloc, nil)

if proxy.URLHeader != "" {
req.Header.Add(proxy.URLHeader, trueloc)
}

resp, err := proxy.tpq.RoundTrip(req)
if err != nil {
proxy.Logger.E("ACL", "Error", err)
return ""
}

tryClose(resp.Body)

return proxy.Cipher.Decrypt(resp.Header.Get(dnsRespHeader), &cr.iv)
}
20 changes: 7 additions & 13 deletions proxy/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ type ServerConfig struct {
DisableLRP bool
HTTPS *tls.Config
ProxyPassAddr string
ClientAnswer string
Logger *logg.Logger
KCP KCPConfig

Expand Down Expand Up @@ -230,20 +229,15 @@ func (proxy *ProxyServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {

if cr.Opt.IsSet(doDNS) {
host := cr.Query
if host == "~" {
w.Header().Add(dnsRespHeader, proxy.Encrypt(proxy.ClientAnswer, &cr.iv))
} else {
ip, err := net.ResolveIPAddr("ip4", host)
if err != nil {
proxy.Logger.W("Dial", "Error", err)
ip = &net.IPAddr{IP: net.IP{127, 0, 0, 1}}
}

proxy.Logger.D("Server", "DNS query", host, ip.String())
w.Header().Add(dnsRespHeader, base64.StdEncoding.EncodeToString([]byte(ip.IP.To4())))
ip, err := net.ResolveIPAddr("ip4", host)
if err != nil {
proxy.Logger.W("Dial", "Error", err)
ip = &net.IPAddr{IP: net.IP{127, 0, 0, 1}}
}
w.WriteHeader(200)

proxy.Logger.D("Server", "DNS query", host, ip.String())
w.Header().Add(dnsRespHeader, base64.StdEncoding.EncodeToString([]byte(ip.IP.To4())))
w.WriteHeader(200)
} else if cr.Opt.IsSet(doLocalRP) {
ioc := proxy.getIOConfig(cr.Auth)
ioc.Partial = cr.Opt.IsSet(doPartial)
Expand Down
4 changes: 2 additions & 2 deletions readme.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# goflyway, transferring data via remote server
# goflyway - an encrypted HTTP server

![](https://raw.githubusercontent.com/coyove/goflyway/gdev/.misc/logo.png)

goflyway is a handy tool that uses a remote server to transfer data with encryption, featuring:
goflyway is a simple HTTP server which serves data over secure connections, featuring:

1. HTTP/SOCKS5 proxy with websocket relay
2. Man-in-the-middle
Expand Down

0 comments on commit a5fe9d7

Please sign in to comment.