set dns for tun

This commit is contained in:
ginuerzh
2025-02-25 20:39:33 +08:00
parent 69a0aa8853
commit 04d1587a77
4 changed files with 43 additions and 18 deletions
+1
View File
@@ -14,4 +14,5 @@ type Config struct {
MTU int
Gateway net.IP
Router router.Router
DNS []net.IP
}
+14 -18
View File
@@ -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),
+17
View File
@@ -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
}
+11
View File
@@ -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
}