mirror of
https://github.com/wweir/sower.git
synced 2024-04-21 12:42:15 +00:00
For #1, support for specified a network interface
This commit is contained in:
@@ -15,10 +15,10 @@ client: build kill
|
||||
sudo $(PWD)/sower -f conf/sower.toml -logtostderr
|
||||
|
||||
server: build kill
|
||||
$(PWD)/sower -n QUIC -logtostderr -v 1
|
||||
$(PWD)/sower -n TCP -logtostderr -v 1
|
||||
|
||||
run: build kill
|
||||
$(PWD)/sower -n QUIC -logtostderr -v 1 &
|
||||
$(PWD)/sower -n TCP -logtostderr -v 1 &
|
||||
sudo $(PWD)/sower -f conf/sower.toml -logtostderr &
|
||||
@sleep 1
|
||||
curl 127.0.0.1
|
||||
|
||||
+5
-4
@@ -1,10 +1,11 @@
|
||||
net_type="QUIC"
|
||||
net_type="TCP"
|
||||
cipher="AES_128_GCM"
|
||||
password="12345678"
|
||||
server_port="5533"
|
||||
server_addr="remote-server:5533" # replce it to remote server
|
||||
dns_server="114.114.114.114"
|
||||
# client_ip="192.168.0.1"
|
||||
# clear_dns_cache="sudo killall -HUP mDNSResponder"
|
||||
dns_server="223.5.5.5" # Alibaba public dns
|
||||
client_ip="127.0.0.1"
|
||||
# clear_dns_cache="killall -HUP mDNSResponder"
|
||||
blocklist=[
|
||||
"*.google.com", # google
|
||||
"*.google.com.hk",
|
||||
|
||||
+10
-10
@@ -12,7 +12,7 @@ import (
|
||||
|
||||
const colon = byte(':')
|
||||
|
||||
func StartDNS(dnsServer string) {
|
||||
func StartDNS(dnsServer, listenIP string, ipNet net.IP) {
|
||||
dns.HandleFunc(".", func(w dns.ResponseWriter, r *dns.Msg) {
|
||||
// *Msg r has an TSIG record and it was validated
|
||||
if r.IsTsig() != nil && w.TsigStatus() == nil {
|
||||
@@ -30,17 +30,17 @@ func StartDNS(dnsServer string) {
|
||||
}
|
||||
|
||||
if len(conf.Conf.BlockList) == 0 {
|
||||
bestTry(w, r, domain, dnsServer)
|
||||
bestTry(w, r, domain, dnsServer, ipNet)
|
||||
} else {
|
||||
manual(w, r, domain, dnsServer)
|
||||
manual(w, r, domain, dnsServer, ipNet)
|
||||
}
|
||||
})
|
||||
|
||||
server := &dns.Server{Addr: ":53", Net: "udp"}
|
||||
server := &dns.Server{Addr: listenIP + ":53", Net: "udp"}
|
||||
glog.Fatalln(server.ListenAndServe())
|
||||
}
|
||||
|
||||
func bestTry(w dns.ResponseWriter, r *dns.Msg, domain, dnsServer string) {
|
||||
func bestTry(w dns.ResponseWriter, r *dns.Msg, domain, dnsServer string, ipNet net.IP) {
|
||||
msg, _ := dns.Exchange(r, dnsServer+":53")
|
||||
if msg == nil {
|
||||
return
|
||||
@@ -63,16 +63,16 @@ func bestTry(w dns.ResponseWriter, r *dns.Msg, domain, dnsServer string) {
|
||||
|
||||
if _, err := net.DialTimeout("tcp", ip+":http", time.Second); err != nil {
|
||||
glog.V(2).Infoln(ip+":80", err)
|
||||
w.WriteMsg(localA(r, domain))
|
||||
w.WriteMsg(localA(r, domain, ipNet))
|
||||
return
|
||||
}
|
||||
w.WriteMsg(msg)
|
||||
}
|
||||
|
||||
func manual(w dns.ResponseWriter, r *dns.Msg, domain, dnsServer string) {
|
||||
func manual(w dns.ResponseWriter, r *dns.Msg, domain, dnsServer string, ipNet net.IP) {
|
||||
if rule.Match(strings.TrimSuffix(domain, ".")) {
|
||||
glog.V(2).Infof("match %s suss", domain)
|
||||
w.WriteMsg(localA(r, domain))
|
||||
w.WriteMsg(localA(r, domain, ipNet))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -100,12 +100,12 @@ func manual(w dns.ResponseWriter, r *dns.Msg, domain, dnsServer string) {
|
||||
}
|
||||
}
|
||||
|
||||
func localA(r *dns.Msg, domain string) *dns.Msg {
|
||||
func localA(r *dns.Msg, domain string, localIP net.IP) *dns.Msg {
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.Answer = []dns.RR{&dns.A{
|
||||
Hdr: dns.RR_Header{Name: domain, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 20},
|
||||
A: conf.Conf.ClientIPNet,
|
||||
A: localIP,
|
||||
}}
|
||||
return m
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ func main() {
|
||||
if conf.ServerAddr == "" {
|
||||
proxy.StartServer(conf.NetType, conf.ServerPort, conf.Cipher, conf.Password)
|
||||
} else {
|
||||
go dns.StartDNS(conf.DnsServer)
|
||||
proxy.StartClient(conf.NetType, conf.ServerAddr, conf.Cipher, conf.Password)
|
||||
go dns.StartDNS(conf.DnsServer, conf.ClientIP, conf.ClientIPNet)
|
||||
proxy.StartClient(conf.NetType, conf.ServerAddr, conf.Cipher, conf.Password, conf.ClientIP)
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -14,8 +14,8 @@ type Client interface {
|
||||
Dial(server string) (net.Conn, error)
|
||||
}
|
||||
|
||||
func StartClient(netType, server, cipher, password string) {
|
||||
var connCh = listenLocal([]string{":80", ":443"})
|
||||
func StartClient(netType, server, cipher, password, listenIP string) {
|
||||
var connCh = listenLocal(listenIP, []string{":80", ":443"})
|
||||
|
||||
var client Client
|
||||
switch netType {
|
||||
@@ -47,11 +47,11 @@ func StartClient(netType, server, cipher, password string) {
|
||||
}
|
||||
}
|
||||
|
||||
func listenLocal(ports []string) <-chan net.Conn {
|
||||
func listenLocal(listenIP string, ports []string) <-chan net.Conn {
|
||||
connCh := make(chan net.Conn, 10)
|
||||
for i := range ports {
|
||||
go func(port string) {
|
||||
ln, err := net.Listen("tcp", port)
|
||||
ln, err := net.Listen("tcp", listenIP+port)
|
||||
if err != nil {
|
||||
glog.Fatalln(err)
|
||||
}
|
||||
@@ -59,7 +59,7 @@ func listenLocal(ports []string) <-chan net.Conn {
|
||||
for {
|
||||
conn, err := ln.Accept()
|
||||
if err != nil {
|
||||
glog.Errorln("accept", port, "fail:", err)
|
||||
glog.Errorln("accept", listenIP+port, "fail:", err)
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user