diff --git a/Makefile b/Makefile index d80a875..d879c3d 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/conf/sower.toml b/conf/sower.toml index 75c287f..025d7a9 100644 --- a/conf/sower.toml +++ b/conf/sower.toml @@ -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", diff --git a/dns/dns.go b/dns/dns.go index 1854a0b..9b585de 100644 --- a/dns/dns.go +++ b/dns/dns.go @@ -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 } diff --git a/main.go b/main.go index f09de39..f7236bb 100644 --- a/main.go +++ b/main.go @@ -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) } } diff --git a/proxy/client.go b/proxy/client.go index ad64f7c..84824b2 100644 --- a/proxy/client.go +++ b/proxy/client.go @@ -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 }