|
|
|
@ -4,7 +4,6 @@ import ( |
|
|
|
|
"flag" |
|
|
|
|
"fmt" |
|
|
|
|
"github.com/goccy/go-yaml" |
|
|
|
|
"io/ioutil" |
|
|
|
|
"log" |
|
|
|
|
"net" |
|
|
|
|
"os" |
|
|
|
@ -12,9 +11,9 @@ import ( |
|
|
|
|
"time" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
type Rule struct{ |
|
|
|
|
type Rule struct { |
|
|
|
|
Host string |
|
|
|
|
Ip string |
|
|
|
|
Ip string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type Listener struct { |
|
|
|
@ -25,18 +24,18 @@ type Listener struct { |
|
|
|
|
DefaultIp string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type Settings struct{ |
|
|
|
|
type Settings struct { |
|
|
|
|
Listeners []Listener |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func printExample() { |
|
|
|
|
func printExample() { |
|
|
|
|
settings := Settings{ |
|
|
|
|
Listeners:[]Listener{ |
|
|
|
|
Listeners: []Listener{ |
|
|
|
|
{ |
|
|
|
|
ListenAddress: "0.0.0.0:1443", |
|
|
|
|
Protocol: "tcp", |
|
|
|
|
PacketType: "https", |
|
|
|
|
Rules: []Rule{ |
|
|
|
|
PacketType: "https", |
|
|
|
|
Rules: []Rule{ |
|
|
|
|
{ |
|
|
|
|
Host: "host1.ru", |
|
|
|
|
Ip: "10.10.0.50:443", |
|
|
|
@ -51,8 +50,8 @@ func printExample() { |
|
|
|
|
{ |
|
|
|
|
ListenAddress: "0.0.0.0:1080", |
|
|
|
|
Protocol: "tcp", |
|
|
|
|
PacketType: "http", |
|
|
|
|
Rules: []Rule{ |
|
|
|
|
PacketType: "http", |
|
|
|
|
Rules: []Rule{ |
|
|
|
|
{ |
|
|
|
|
Host: "host1.ru", |
|
|
|
|
Ip: "10.10.0.50:80", |
|
|
|
@ -67,11 +66,13 @@ func printExample() { |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
out, _ := yaml.Marshal(settings) |
|
|
|
|
fmt.Printf("%s",out) |
|
|
|
|
fmt.Printf("%s", out) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var settings Settings |
|
|
|
|
func main(){ |
|
|
|
|
printExampleFlag := flag.Bool("example",false,"") |
|
|
|
|
|
|
|
|
|
func main() { |
|
|
|
|
printExampleFlag := flag.Bool("example", false, "") |
|
|
|
|
ConfigFile := flag.String("i", "none", "/path/to/config/file.yml") |
|
|
|
|
flag.Parse() |
|
|
|
|
|
|
|
|
@ -80,13 +81,13 @@ func main(){ |
|
|
|
|
os.Exit(0) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf, err := ioutil.ReadFile(*ConfigFile) |
|
|
|
|
cf, err := os.ReadFile(*ConfigFile) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatalf("Read configuration error: %s", err.Error()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = yaml.Unmarshal(cf,&settings) |
|
|
|
|
for _, listener := range settings.Listeners{ |
|
|
|
|
err = yaml.Unmarshal(cf, &settings) |
|
|
|
|
for _, listener := range settings.Listeners { |
|
|
|
|
go listen(listener) |
|
|
|
|
} |
|
|
|
|
for { |
|
|
|
@ -94,7 +95,7 @@ func main(){ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func listen(listener Listener){ |
|
|
|
|
func listen(listener Listener) { |
|
|
|
|
log.Println(listener.Protocol, listener.ListenAddress) |
|
|
|
|
ln, err := net.Listen(listener.Protocol, listener.ListenAddress) |
|
|
|
|
if err != nil { |
|
|
|
@ -114,30 +115,31 @@ func listen(listener Listener){ |
|
|
|
|
func handleConnection(conn net.Conn, listener Listener) { |
|
|
|
|
var b = make([]byte, 1024*128) |
|
|
|
|
n, err := conn.Read(b) |
|
|
|
|
if err != nil{ |
|
|
|
|
if err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
var conn2 net.Conn |
|
|
|
|
|
|
|
|
|
finded := false |
|
|
|
|
for _, rule := range listener.Rules{ |
|
|
|
|
if strings.Contains(string(b),rule.Host) { |
|
|
|
|
for _, rule := range listener.Rules { |
|
|
|
|
if strings.Contains(string(b), rule.Host) { |
|
|
|
|
finded = true |
|
|
|
|
conn2, err = net.Dial(listener.Protocol, rule.Ip) |
|
|
|
|
fmt.Println(rule.Host) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if !finded { |
|
|
|
|
conn2, err = net.Dial(listener.Protocol, listener.DefaultIp) |
|
|
|
|
fmt.Println("Default") |
|
|
|
|
} |
|
|
|
|
if err != nil{ |
|
|
|
|
if err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
_, err = conn2.Write(b[:n]) |
|
|
|
|
if err != nil{ |
|
|
|
|
if err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
@ -145,19 +147,19 @@ func handleConnection(conn net.Conn, listener Listener) { |
|
|
|
|
go connToConn(conn2, conn) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func connToConn(conn1 net.Conn,conn2 net.Conn){ |
|
|
|
|
func connToConn(conn1 net.Conn, conn2 net.Conn) { |
|
|
|
|
defer conn1.Close() |
|
|
|
|
defer conn2.Close() |
|
|
|
|
|
|
|
|
|
var b = make([]byte, 1024*128) |
|
|
|
|
for { |
|
|
|
|
n, err := conn1.Read(b) |
|
|
|
|
if err != nil{ |
|
|
|
|
if err != nil { |
|
|
|
|
log.Println(err.Error()) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
_, err = conn2.Write(b[:n]) |
|
|
|
|
if err != nil{ |
|
|
|
|
if err != nil { |
|
|
|
|
log.Println(err.Error()) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|