set dns for tun
This commit is contained in:
@@ -14,4 +14,5 @@ type Config struct {
|
||||
MTU int
|
||||
Gateway net.IP
|
||||
Router router.Router
|
||||
DNS []net.IP
|
||||
}
|
||||
|
||||
+14
-18
@@ -22,30 +22,20 @@ type metadata struct {
|
||||
}
|
||||
|
||||
func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
|
||||
const (
|
||||
name = "name"
|
||||
netKey = "net"
|
||||
peer = "peer"
|
||||
mtu = "mtu"
|
||||
route = "route"
|
||||
routes = "routes"
|
||||
gateway = "gw"
|
||||
)
|
||||
|
||||
config := &tun_util.Config{
|
||||
Name: mdutil.GetString(md, name),
|
||||
Peer: mdutil.GetString(md, peer),
|
||||
MTU: mdutil.GetInt(md, mtu),
|
||||
Router: registry.RouterRegistry().Get(mdutil.GetString(md, "router")),
|
||||
Name: mdutil.GetString(md, "name", "tun.name"),
|
||||
Peer: mdutil.GetString(md, "peer", "tun.peer"),
|
||||
MTU: mdutil.GetInt(md, "mtu", "tun.mtu"),
|
||||
Router: registry.RouterRegistry().Get(mdutil.GetString(md, "router", "tun.router")),
|
||||
}
|
||||
if config.MTU <= 0 {
|
||||
config.MTU = defaultMTU
|
||||
}
|
||||
if gw := mdutil.GetString(md, gateway); gw != "" {
|
||||
if gw := mdutil.GetString(md, "gw", "tun.gw"); gw != "" {
|
||||
config.Gateway = net.ParseIP(gw)
|
||||
}
|
||||
|
||||
for _, s := range strings.Split(mdutil.GetString(md, netKey), ",") {
|
||||
for _, s := range strings.Split(mdutil.GetString(md, "net", "tun.net"), ",") {
|
||||
if s = strings.TrimSpace(s); s == "" {
|
||||
continue
|
||||
}
|
||||
@@ -59,7 +49,7 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
|
||||
})
|
||||
}
|
||||
|
||||
for _, s := range strings.Split(mdutil.GetString(md, route), ",") {
|
||||
for _, s := range strings.Split(mdutil.GetString(md, "route", "tun.route"), ",") {
|
||||
gw := ""
|
||||
if config.Gateway != nil {
|
||||
gw = config.Gateway.String()
|
||||
@@ -69,7 +59,7 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
|
||||
}
|
||||
}
|
||||
|
||||
for _, s := range mdutil.GetStrings(md, routes) {
|
||||
for _, s := range mdutil.GetStrings(md, "routes", "tun.routes") {
|
||||
ss := strings.SplitN(s, " ", 2)
|
||||
if len(ss) == 2 {
|
||||
_, ipNet, _ := net.ParseCIDR(strings.TrimSpace(ss[0]))
|
||||
@@ -94,6 +84,12 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) {
|
||||
}
|
||||
}
|
||||
|
||||
for _, v := range strings.Split(mdutil.GetString(md, "dns", "tun.dns"), ",") {
|
||||
if ip := net.ParseIP(strings.TrimSpace(v)); ip != nil {
|
||||
config.DNS = append(config.DNS, ip)
|
||||
}
|
||||
}
|
||||
|
||||
if config.Router == nil && len(l.routes) > 0 {
|
||||
config.Router = xrouter.NewRouter(
|
||||
xrouter.RoutesOption(l.routes),
|
||||
|
||||
@@ -4,6 +4,8 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/vishvananda/netlink"
|
||||
)
|
||||
@@ -44,6 +46,21 @@ func (l *tunListener) createTun() (dev io.ReadWriteCloser, name string, ip net.I
|
||||
return
|
||||
}
|
||||
|
||||
var dnsServers []string
|
||||
for _, dns := range l.md.config.DNS {
|
||||
dnsServers = append(dnsServers, dns.String())
|
||||
}
|
||||
if len(dnsServers) > 0 {
|
||||
cmd := fmt.Sprintf("resolvectl dns %s %s", name, strings.Join(dnsServers, " "))
|
||||
l.logger.Debug(cmd)
|
||||
|
||||
args := strings.Split(cmd, " ")
|
||||
if er := exec.Command(args[0], args[1:]...).Run(); er != nil {
|
||||
err = fmt.Errorf("%s: %v", cmd, er)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,17 @@ func (l *tunListener) createTun() (ifce io.ReadWriteCloser, name string, ip net.
|
||||
return
|
||||
}
|
||||
|
||||
for _, dns := range l.md.config.DNS {
|
||||
cmd := fmt.Sprintf("netsh interface ip add dnsservers name=%s address=%s validate=no", name, dns.String())
|
||||
l.logger.Debug(cmd)
|
||||
|
||||
args := strings.Split(cmd, " ")
|
||||
if er := exec.Command(args[0], args[1:]...).Run(); er != nil {
|
||||
err = fmt.Errorf("%s: %v", cmd, er)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user