-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
64 lines (56 loc) · 1.43 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package main // import "github.com/Yaser-Amiri/abghand"
import (
"flag"
"io/ioutil"
"log"
"strconv"
"strings"
"github.com/google/tcpproxy"
"gopkg.in/yaml.v2"
)
type HostConfig struct {
Hostname string
Port_set []struct {
Type string
PortNumber int `yaml:"port_number"`
}
}
var Config []HostConfig
func init() {
var configFilePath string
flag.StringVar(&configFilePath, "c", "config.yml", "Path of Abghand config file.")
flag.Parse()
configFileContent, err := ioutil.ReadFile(configFilePath)
if err != nil {
log.Fatal(err)
}
Config = make([]HostConfig, 0)
if err := yaml.Unmarshal(configFileContent, &Config); err != nil {
log.Fatal(err)
}
}
func main() {
var server tcpproxy.Proxy
for _, host := range Config {
if len(host.Port_set) == 0 {
server.AddHTTPHostRoute(":80", host.Hostname, tcpproxy.To(host.Hostname+":80"))
server.AddSNIRoute(":443", host.Hostname, tcpproxy.To(host.Hostname+":443"))
} else {
for _, port := range host.Port_set {
switch strings.ToLower(port.Type) {
case "http":
server.AddHTTPHostRoute(
":"+strconv.Itoa(port.PortNumber),
host.Hostname,
tcpproxy.To(host.Hostname+":"+strconv.Itoa(port.PortNumber)))
case "https":
server.AddSNIRoute(":"+strconv.Itoa(port.PortNumber),
host.Hostname,
tcpproxy.To(host.Hostname+":"+strconv.Itoa(port.PortNumber)))
}
}
}
}
log.Println("Starting Abghand ...")
log.Fatal(server.Run())
}