Skip to content

Commit

Permalink
Fix missing bypass and update README
Browse files Browse the repository at this point in the history
  • Loading branch information
serverwentdown committed Sep 4, 2019
1 parent 089bc9c commit eefbd63
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 29 deletions.
10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,17 @@ A simple TCP proxy. Currently used in [AppVenture](https://appventure.nushigh.ed
$ ./forward -help
Usage of ./forward:
-connect string
forward to ip and port (default ":8080")
forward to address
-listen string
listen on ip and port (default ":8081")
listen on address (default ":8000")
-ssh string
if set, will do basic introspection to forward SSH traffic to this address
```
### Usage with SSH
You can use `forward` to do multiplexing of SSH and HTTP in a quick and dirty way, using very simple protocol introspection. A more robust solution would be [sshttp](https://github.com/stealth/sshttp)
## Usage on Windows
`forward` is wrapped with [go-svc](https://github.com/judwhite/go-svc), enabling it to be run as a Windows service. To add with PowerShell:
Expand Down
70 changes: 43 additions & 27 deletions server.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,37 +70,53 @@ var magic = []byte{'S', 'S', 'H', '-'}
var magicLen = len(magic)

func handle(c net.Conn, count int) {
// read first four characters
readMagic := make([]byte, magicLen, magicLen)
n, err := c.Read(readMagic)
if n != magicLen {
log.Printf("warning! could not read header")
return
}
opError, ok := err.(*net.OpError)
if err != nil && (!ok || opError.Op != "readfrom") {
log.Printf("warning! %v", err)
return
}
if connSSH != nil {

connTo := conn
// if the header looks like SSH, forward to SSH connection
if bytes.Equal(readMagic, magic) {
connTo = connSSH
}
// read first four characters
readMagic := make([]byte, magicLen, magicLen)
n, err := c.Read(readMagic)
if n != magicLen {
log.Printf("warning! could not read header")
return
}
opError, ok := err.(*net.OpError)
if err != nil && (!ok || opError.Op != "readfrom") {
log.Printf("warning! %v", err)
return
}

cn, err := net.DialTCP("tcp", nil, connTo)
if err != nil {
c.Close()
log.Print(err)
return
}
connTo := conn
// if the header looks like SSH, forward to SSH connection
if bytes.Equal(readMagic, magic) {
connTo = connSSH
}

// write the first four characters
cn.Write(readMagic)
cn, err := net.DialTCP("tcp", nil, connTo)
if err != nil {
c.Close()
log.Print(err)
return
}

// write the first four characters
cn.Write(readMagic)

go pipe(c, cn, count)
go pipe(cn, c, count)

} else {

go pipe(c, cn, count)
go pipe(cn, c, count)
cn, err := net.DialTCP("tcp", nil, conn)
if err != nil {
c.Close()
log.Print(err)
return
}

go pipe(c, cn, count)
go pipe(cn, c, count)

}
}

func pipe(w io.WriteCloser, r io.ReadCloser, count int) {
Expand Down

0 comments on commit eefbd63

Please sign in to comment.