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