commit
2494a21d4f
@ -0,0 +1,8 @@ |
||||
# Default ignored files |
||||
/shelf/ |
||||
/workspace.xml |
||||
# Datasource local storage ignored files |
||||
/dataSources/ |
||||
/dataSources.local.xml |
||||
# Editor-based HTTP Client requests |
||||
/httpRequests/ |
@ -0,0 +1,9 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<module type="WEB_MODULE" version="4"> |
||||
<component name="Go" enabled="true" /> |
||||
<component name="NewModuleRootManager"> |
||||
<content url="file://$MODULE_DIR$" /> |
||||
<orderEntry type="inheritedJdk" /> |
||||
<orderEntry type="sourceFolder" forTests="false" /> |
||||
</component> |
||||
</module> |
@ -0,0 +1,20 @@ |
||||
<component name="InspectionProjectProfileManager"> |
||||
<profile version="1.0"> |
||||
<option name="myName" value="Project Default" /> |
||||
<inspection_tool class="GoUnhandledErrorResult" enabled="true" level="WARNING" enabled_by_default="true"> |
||||
<methods> |
||||
<method importPath="hash" receiver="Hash" name="Write" /> |
||||
<method importPath="strings" receiver="*Builder" name="Write" /> |
||||
<method importPath="strings" receiver="*Builder" name="WriteByte" /> |
||||
<method importPath="bytes" receiver="*Buffer" name="WriteRune" /> |
||||
<method importPath="bytes" receiver="*Buffer" name="Write" /> |
||||
<method importPath="bytes" receiver="*Buffer" name="WriteString" /> |
||||
<method importPath="strings" receiver="*Builder" name="WriteString" /> |
||||
<method importPath="bytes" receiver="*Buffer" name="WriteByte" /> |
||||
<method importPath="strings" receiver="*Builder" name="WriteRune" /> |
||||
<method importPath="math/rand" receiver="*Rand" name="Read" /> |
||||
<method importPath="net" receiver="Conn" name="Close" /> |
||||
</methods> |
||||
</inspection_tool> |
||||
</profile> |
||||
</component> |
@ -0,0 +1,6 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project version="4"> |
||||
<component name="JavaScriptSettings"> |
||||
<option name="languageLevel" value="ES6" /> |
||||
</component> |
||||
</project> |
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project version="4"> |
||||
<component name="ProjectModuleManager"> |
||||
<modules> |
||||
<module fileurl="file://$PROJECT_DIR$/.idea/HttpsBalancer.iml" filepath="$PROJECT_DIR$/.idea/HttpsBalancer.iml" /> |
||||
</modules> |
||||
</component> |
||||
</project> |
@ -0,0 +1,13 @@ |
||||
listeners: |
||||
- listenaddress: 0.0.0.0:1443 |
||||
protocol: tcp |
||||
rules: |
||||
- host: test0.yourdomain.com |
||||
ip: 10.1.1.115:1443 |
||||
defaultip: 127.0.0.1:443 |
||||
- listenaddress: 0.0.0.0:1080 |
||||
protocol: tcp |
||||
rules: |
||||
- host: test3.yourdomain.com |
||||
ip: 10.1.1.115:80 |
||||
defaultip: 127.0.0.1:80 |
@ -0,0 +1,35 @@ |
||||
# Regela HTTPS Balancer |
||||
|
||||
### Lightweght SSL redirector |
||||
### Written by Elizar [@Regela](https://sources.krechet.tech/Regela) |
||||
|
||||
#### Example .yml config included |
||||
#### Usage: |
||||
``` |
||||
~> ./HttpsBalancer/main --help |
||||
Usage of ./HttpsBalancer/main: |
||||
-example |
||||
-i string |
||||
/path/to/config/file.yml (default "none") |
||||
|
||||
~> ./HttpsBalancer/main -example |
||||
listeners: |
||||
- listenaddress: 0.0.0.0:1443 |
||||
protocol: tcp |
||||
packettype: https |
||||
rules: |
||||
- host: host1.ru |
||||
ip: 10.10.0.50:443 |
||||
- host: host2.ru |
||||
ip: 10.10.0.51:443 |
||||
defaultip: 127.0.0.1:443 |
||||
- listenaddress: 0.0.0.0:1080 |
||||
protocol: tcp |
||||
packettype: http |
||||
rules: |
||||
- host: host1.ru |
||||
ip: 10.10.0.50:80 |
||||
- host: host2.ru |
||||
ip: 10.10.0.51:80 |
||||
defaultip: 127.0.0.1:80 |
||||
``` |
@ -0,0 +1,165 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"flag" |
||||
"fmt" |
||||
"github.com/goccy/go-yaml" |
||||
"io/ioutil" |
||||
"log" |
||||
"net" |
||||
"os" |
||||
"strings" |
||||
"time" |
||||
) |
||||
|
||||
type Rule struct{ |
||||
Host string |
||||
Ip string |
||||
} |
||||
|
||||
type Listener struct { |
||||
ListenAddress string |
||||
Protocol string |
||||
PacketType string |
||||
Rules []Rule |
||||
DefaultIp string |
||||
} |
||||
|
||||
type Settings struct{ |
||||
Listeners []Listener |
||||
} |
||||
|
||||
func printExample() { |
||||
settings := Settings{ |
||||
Listeners:[]Listener{ |
||||
{ |
||||
ListenAddress: "0.0.0.0:1443", |
||||
Protocol: "tcp", |
||||
PacketType: "https", |
||||
Rules: []Rule{ |
||||
{ |
||||
Host: "host1.ru", |
||||
Ip: "10.10.0.50:443", |
||||
}, |
||||
{ |
||||
Host: "host2.ru", |
||||
Ip: "10.10.0.51:443", |
||||
}, |
||||
}, |
||||
DefaultIp: "127.0.0.1:443", |
||||
}, |
||||
{ |
||||
ListenAddress: "0.0.0.0:1080", |
||||
Protocol: "tcp", |
||||
PacketType: "http", |
||||
Rules: []Rule{ |
||||
{ |
||||
Host: "host1.ru", |
||||
Ip: "10.10.0.50:80", |
||||
}, |
||||
{ |
||||
Host: "host2.ru", |
||||
Ip: "10.10.0.51:80", |
||||
}, |
||||
}, |
||||
DefaultIp: "127.0.0.1:80", |
||||
}, |
||||
}, |
||||
} |
||||
out, _ := yaml.Marshal(settings) |
||||
fmt.Printf("%s",out) |
||||
} |
||||
var settings Settings |
||||
func main(){ |
||||
printExampleFlag := flag.Bool("example",false,"") |
||||
ConfigFile := flag.String("i", "none", "/path/to/config/file.yml") |
||||
flag.Parse() |
||||
|
||||
if *printExampleFlag { |
||||
printExample() |
||||
os.Exit(0) |
||||
} |
||||
|
||||
cf, err := ioutil.ReadFile(*ConfigFile) |
||||
if err != nil { |
||||
log.Fatalf("Read configuration error: %s", err.Error()) |
||||
} |
||||
|
||||
err = yaml.Unmarshal(cf,&settings) |
||||
for _, listener := range settings.Listeners{ |
||||
go listen(listener) |
||||
} |
||||
for { |
||||
time.Sleep(time.Hour) |
||||
} |
||||
} |
||||
|
||||
func listen(listener Listener){ |
||||
log.Println(listener.Protocol, listener.ListenAddress) |
||||
ln, err := net.Listen(listener.Protocol, listener.ListenAddress) |
||||
if err != nil { |
||||
log.Fatal(err) |
||||
} |
||||
defer ln.Close() |
||||
|
||||
for { |
||||
conn, err := ln.Accept() |
||||
if err != nil { |
||||
// handle error
|
||||
} |
||||
go handleConnection(conn, listener) |
||||
} |
||||
} |
||||
|
||||
func handleConnection(conn net.Conn, listener Listener) { |
||||
var b = make([]byte, 1024*128) |
||||
n, err := conn.Read(b) |
||||
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) { |
||||
finded = true |
||||
conn2, err = net.Dial(listener.Protocol, rule.Ip) |
||||
fmt.Println(rule.Host) |
||||
} |
||||
} |
||||
if !finded { |
||||
conn2, err = net.Dial(listener.Protocol, listener.DefaultIp) |
||||
fmt.Println("Default") |
||||
} |
||||
if err != nil{ |
||||
log.Println(err) |
||||
return |
||||
} |
||||
_, err = conn2.Write(b[:n]) |
||||
if err != nil{ |
||||
log.Println(err) |
||||
return |
||||
} |
||||
go connToConn(conn, conn2) |
||||
go connToConn(conn2, 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{ |
||||
log.Println(err.Error()) |
||||
break |
||||
} |
||||
_, err = conn2.Write(b[:n]) |
||||
if err != nil{ |
||||
log.Println(err.Error()) |
||||
break |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue