Skip to content

Instantly share code, notes, and snippets.

@karthick18
Created July 13, 2016 23:53
Show Gist options
  • Save karthick18/4f40002461a75bc9670ab93a09790d5f to your computer and use it in GitHub Desktop.
Save karthick18/4f40002461a75bc9670ab93a09790d5f to your computer and use it in GitHub Desktop.
nanosec tcp proxy server with verification
package main
import (
"github.com/karthick18/nanoclient/nanoproxy/nanotcpproxy"
"github.com/karthick18/nanoclient/nanoproxy/virtualconn"
"net"
"time"
"fmt"
"log"
)
const (
LOCAL_ADDR = "10.15.3.35:23333"
REMOTE_ADDR = "10.15.3.91:9999"
)
func main() {
laddr, err := net.ResolveTCPAddr("tcp", LOCAL_ADDR)
if err != nil {
log.Fatalf("Error %v resolving tcp address %s\n", err, LOCAL_ADDR)
}
l, err := net.ListenTCP("tcp", laddr)
if err != nil {
log.Fatalf("Error %v on tcp listen\n", err)
}
for {
tc, err := l.AcceptTCP()
if err != nil {
log.Fatalf("Error %v on tcp accept\n", err)
}
tc.SetKeepAlive(true)
tc.SetKeepAlivePeriod(3 * time.Minute)
//1. Get Orig Addr
//2. Detect Protocol
//3. Return if HTTP or HTTPS?
//fmt.Println("New tcp conn - local addr : ",tc.LocalAddr())
//fmt.Println("New tcp conn - remote addr :",tc.RemoteAddr())
newConnFile, err := tc.File()
if err != nil {
return
} else {
tc.Close()
}
newConn, err := net.FileConn(newConnFile)
//newTCPConn, ok := newConn.(*net.TCPConn)
//fmt.Println("New file conn - local addr : %v",newConn.LocalAddr())
//fmt.Println("New file conn - remote addr : %v",newConn.RemoteAddr())
if err != nil {
if newConn != nil {
newConn.Close()
}
return
} else {
newConnFile.Close()
}
vconn, proto, err := virtualconn.DetectProtocol(newConn)
//fmt.Println("New vconn conn - local addr : %v",vconn.LocalAddr())
//fmt.Println("New vconn conn - remote addr : %v",vconn.RemoteAddr())
if proto == "HTTPS" {
return
}
//vTCPConn := vconn.(net.TCPConn)
//if err != nil {
// return nil, err
//}
tcpaddr, err := net.ResolveTCPAddr("tcp", REMOTE_ADDR)
if err != nil {
log.Fatalf("Error %v resolving remote tcp addr\n", err)
}
verified := nanotcpproxy.VerifyTCP(vconn.LocalAddr().String(), tcpaddr)
if verified == true {
fmt.Println("TCP connection has been verified")
go nanotcpproxy.ServeTCP(vconn, tcpaddr)
}
//TODO: handle tcp
//TODO: Loop until next accept??
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment