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