For #1, support for specified a network interface

This commit is contained in:
wweir
2019-01-16 14:40:06 +08:00
parent 344531c301
commit f6eddb9f96
5 changed files with 24 additions and 23 deletions
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
}
+2 -2
View File
@@ -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
View File
@@ -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
}