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