|
|
|
@ -100,7 +100,7 @@ func (h *Handler) processWireGuard(ctx context.Context, dialer internet.Dialer)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// bind := conn.NewStdNetBind() // TODO: conn.Bind wrapper for dialer
|
|
|
|
|
bind := &netBindClient{ |
|
|
|
|
h.bind = &netBindClient{ |
|
|
|
|
netBind: netBind{ |
|
|
|
|
dns: h.dns, |
|
|
|
|
dnsOption: dns.IPOption{ |
|
|
|
@ -115,15 +115,14 @@ func (h *Handler) processWireGuard(ctx context.Context, dialer internet.Dialer)
|
|
|
|
|
} |
|
|
|
|
defer func() { |
|
|
|
|
if err != nil { |
|
|
|
|
_ = bind.Close() |
|
|
|
|
_ = h.bind.Close() |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
h.net, err = h.makeVirtualTun(bind) |
|
|
|
|
h.net, err = h.makeVirtualTun() |
|
|
|
|
if err != nil { |
|
|
|
|
return errors.New("failed to create virtual tun interface").Base(err) |
|
|
|
|
} |
|
|
|
|
h.bind = bind |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -238,16 +237,16 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// creates a tun interface on netstack given a configuration
|
|
|
|
|
func (h *Handler) makeVirtualTun(bind *netBindClient) (Tunnel, error) { |
|
|
|
|
func (h *Handler) makeVirtualTun() (Tunnel, error) { |
|
|
|
|
t, err := h.conf.createTun()(h.endpoints, int(h.conf.Mtu), nil) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bind.dnsOption.IPv4Enable = h.hasIPv4 |
|
|
|
|
bind.dnsOption.IPv6Enable = h.hasIPv6 |
|
|
|
|
h.bind.dnsOption.IPv4Enable = h.hasIPv4 |
|
|
|
|
h.bind.dnsOption.IPv6Enable = h.hasIPv6 |
|
|
|
|
|
|
|
|
|
if err = t.BuildDevice(h.createIPCRequest(bind, h.conf), bind); err != nil { |
|
|
|
|
if err = t.BuildDevice(h.createIPCRequest(), h.bind); err != nil { |
|
|
|
|
_ = t.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
@ -255,17 +254,17 @@ func (h *Handler) makeVirtualTun(bind *netBindClient) (Tunnel, error) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// serialize the config into an IPC request
|
|
|
|
|
func (h *Handler) createIPCRequest(bind *netBindClient, conf *DeviceConfig) string { |
|
|
|
|
func (h *Handler) createIPCRequest() string { |
|
|
|
|
var request strings.Builder |
|
|
|
|
|
|
|
|
|
request.WriteString(fmt.Sprintf("private_key=%s\n", conf.SecretKey)) |
|
|
|
|
request.WriteString(fmt.Sprintf("private_key=%s\n", h.conf.SecretKey)) |
|
|
|
|
|
|
|
|
|
if !conf.IsClient { |
|
|
|
|
if !h.conf.IsClient { |
|
|
|
|
// placeholder, we'll handle actual port listening on Xray
|
|
|
|
|
request.WriteString("listen_port=1337\n") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, peer := range conf.Peers { |
|
|
|
|
for _, peer := range h.conf.Peers { |
|
|
|
|
if peer.PublicKey != "" { |
|
|
|
|
request.WriteString(fmt.Sprintf("public_key=%s\n", peer.PublicKey)) |
|
|
|
|
} |
|
|
|
@ -280,7 +279,7 @@ func (h *Handler) createIPCRequest(bind *netBindClient, conf *DeviceConfig) stri
|
|
|
|
|
} |
|
|
|
|
addr := net.ParseAddress(address) |
|
|
|
|
if addr.Family().IsDomain() { |
|
|
|
|
dialerIp := bind.dialer.DestIpAddress() |
|
|
|
|
dialerIp := h.bind.dialer.DestIpAddress() |
|
|
|
|
if dialerIp != nil { |
|
|
|
|
addr = net.ParseAddress(dialerIp.String()) |
|
|
|
|
errors.LogInfo(h.bind.ctx, "createIPCRequest use dialer dest ip: ", addr) |
|
|
|
|