mirror of
https://github.com/gravitl/netmaker.git
synced 2024-09-21 07:46:04 +08:00
get wg listen interface addr from the interface
This commit is contained in:
parent
d0463628d1
commit
4e55242cb1
|
@ -22,8 +22,11 @@ import (
|
||||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var IsHostNetwork bool
|
||||||
|
|
||||||
const (
|
const (
|
||||||
NmProxyPort = 51722
|
NmProxyPort = 51722
|
||||||
|
DefaultCIDR = "127.0.0.1/8"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Conn struct {
|
type Conn struct {
|
||||||
|
|
|
@ -47,7 +47,7 @@ func StartProxyManager(manageChan chan *ManagerAction) {
|
||||||
case UpdatePeer:
|
case UpdatePeer:
|
||||||
mI.UpdatePeerProxy()
|
mI.UpdatePeerProxy()
|
||||||
case DeletePeer:
|
case DeletePeer:
|
||||||
|
mI.DeletePeers()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,9 @@ package nmproxy
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/gravitl/netmaker/nm-proxy/common"
|
||||||
"github.com/gravitl/netmaker/nm-proxy/manager"
|
"github.com/gravitl/netmaker/nm-proxy/manager"
|
||||||
"github.com/gravitl/netmaker/nm-proxy/server"
|
"github.com/gravitl/netmaker/nm-proxy/server"
|
||||||
"github.com/gravitl/netmaker/nm-proxy/stun"
|
"github.com/gravitl/netmaker/nm-proxy/stun"
|
||||||
|
@ -17,6 +19,7 @@ import (
|
||||||
*/
|
*/
|
||||||
func Start(mgmChan chan *manager.ManagerAction) {
|
func Start(mgmChan chan *manager.ManagerAction) {
|
||||||
log.Println("Starting Proxy...")
|
log.Println("Starting Proxy...")
|
||||||
|
common.IsHostNetwork = (os.Getenv("HOST_NETWORK") == "" || os.Getenv("HOST_NETWORK") == "on")
|
||||||
go manager.StartProxyManager(mgmChan)
|
go manager.StartProxyManager(mgmChan)
|
||||||
hInfo := stun.GetHostInfo()
|
hInfo := stun.GetHostInfo()
|
||||||
stun.Host = hInfo
|
stun.Host = hInfo
|
||||||
|
|
|
@ -10,12 +10,10 @@ import (
|
||||||
|
|
||||||
var udpHeaderLen = 8
|
var udpHeaderLen = 8
|
||||||
|
|
||||||
func ProcessPacketBeforeSending(buf []byte, srckey string, n, dstPort int) ([]byte, int, error) {
|
func ProcessPacketBeforeSending(buf []byte, srckey string, n, dstPort int) ([]byte, int, string, error) {
|
||||||
log.Println("@###### DST Port: ", dstPort)
|
|
||||||
portbuf := new(bytes.Buffer)
|
portbuf := new(bytes.Buffer)
|
||||||
binary.Write(portbuf, binary.BigEndian, uint16(dstPort))
|
binary.Write(portbuf, binary.BigEndian, uint16(dstPort))
|
||||||
hmd5 := md5.Sum([]byte(srckey))
|
hmd5 := md5.Sum([]byte(srckey))
|
||||||
log.Printf("---> HASH: %x ", hmd5)
|
|
||||||
if n > len(buf)-18 {
|
if n > len(buf)-18 {
|
||||||
buf = append(buf, portbuf.Bytes()[0])
|
buf = append(buf, portbuf.Bytes()[0])
|
||||||
buf = append(buf, portbuf.Bytes()[1])
|
buf = append(buf, portbuf.Bytes()[1])
|
||||||
|
@ -29,7 +27,7 @@ func ProcessPacketBeforeSending(buf []byte, srckey string, n, dstPort int) ([]by
|
||||||
n += 2
|
n += 2
|
||||||
n += len(hmd5)
|
n += len(hmd5)
|
||||||
|
|
||||||
return buf, n, nil
|
return buf, n, fmt.Sprintf("%x", hmd5), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExtractInfo(buffer []byte, n int) (int, int, string, error) {
|
func ExtractInfo(buffer []byte, n int) (int, int, string, error) {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
|
"github.com/gravitl/netmaker/nm-proxy/common"
|
||||||
"github.com/gravitl/netmaker/nm-proxy/wg"
|
"github.com/gravitl/netmaker/nm-proxy/wg"
|
||||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||||
)
|
)
|
||||||
|
@ -58,3 +59,46 @@ func GetInterfaceIpv4Addr(interfaceName string) (addr string, err error) {
|
||||||
}
|
}
|
||||||
return ipv4Addr.String(), nil
|
return ipv4Addr.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetInterfaceListenAddr(port int) (*net.UDPAddr, error) {
|
||||||
|
locallistenAddr := "127.0.0.1"
|
||||||
|
udpAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", locallistenAddr, port))
|
||||||
|
if err != nil {
|
||||||
|
return udpAddr, err
|
||||||
|
}
|
||||||
|
if !common.IsHostNetwork {
|
||||||
|
addrs, err := getBoardCastAddress()
|
||||||
|
if err != nil {
|
||||||
|
return udpAddr, err
|
||||||
|
}
|
||||||
|
for _, addr := range addrs {
|
||||||
|
if liAddr := addr.(*net.IPNet).IP; liAddr != nil {
|
||||||
|
udpAddr.IP = liAddr
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return udpAddr, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getBoardCastAddress() ([]net.Addr, error) {
|
||||||
|
localnets, err := net.Interfaces()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
ief net.Interface
|
||||||
|
addrs []net.Addr
|
||||||
|
)
|
||||||
|
for _, ief = range localnets {
|
||||||
|
if ief.Flags&net.FlagBroadcast != 0 && ief.Flags&net.FlagUp != 0 {
|
||||||
|
addrs, err = ief.Addrs()
|
||||||
|
if err == nil {
|
||||||
|
return addrs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, errors.New("couldn't obtain the broadcast addr")
|
||||||
|
}
|
||||||
|
|
|
@ -58,17 +58,18 @@ func (p *Proxy) ProxyToRemote() {
|
||||||
}
|
}
|
||||||
peers := common.WgIFaceMap[p.Config.WgInterface.Name]
|
peers := common.WgIFaceMap[p.Config.WgInterface.Name]
|
||||||
if peerI, ok := peers[p.Config.RemoteKey]; ok {
|
if peerI, ok := peers[p.Config.RemoteKey]; ok {
|
||||||
log.Println("PROCESSING PKT BEFORE SENDING")
|
var srcPeerHash string
|
||||||
|
buf, n, srcPeerHash, err = packet.ProcessPacketBeforeSending(buf, peerI.Config.LocalKey, n, peerI.Config.RemoteWgPort)
|
||||||
buf, n, err = packet.ProcessPacketBeforeSending(buf, peerI.Config.LocalKey, n, peerI.Config.RemoteWgPort)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("failed to process pkt before sending: ", err)
|
log.Println("failed to process pkt before sending: ", err)
|
||||||
}
|
}
|
||||||
|
log.Printf("PROXING TO REMOTE!!!---> %s >>>>> %s [[ DstPort: %d, SrcPeerHash: %x ]]\n",
|
||||||
|
server.NmProxyServer.Server.LocalAddr().String(), p.RemoteConn.String(), peerI.Config.RemoteWgPort, srcPeerHash)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("Peer: %s not found in config\n", p.Config.RemoteKey)
|
log.Printf("Peer: %s not found in config\n", p.Config.RemoteKey)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
// test(n, buf)
|
// test(n, buf)
|
||||||
log.Printf("PROXING TO REMOTE!!!---> %s >>>>> %s\n", server.NmProxyServer.Server.LocalAddr().String(), p.RemoteConn.String())
|
|
||||||
|
|
||||||
_, err = server.NmProxyServer.Server.WriteToUDP(buf[:n], p.RemoteConn)
|
_, err = server.NmProxyServer.Server.WriteToUDP(buf[:n], p.RemoteConn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -83,8 +84,8 @@ func (p *Proxy) updateEndpoint() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Println("--------> UDPADDR: ", udpAddr)
|
|
||||||
// add local proxy connection as a Wireguard peer
|
// add local proxy connection as a Wireguard peer
|
||||||
|
log.Printf("---> ## Updating Peer: %+v\n", p.Config)
|
||||||
err = p.Config.WgInterface.UpdatePeer(p.Config.RemoteKey, p.Config.AllowedIps, wg.DefaultWgKeepAlive,
|
err = p.Config.WgInterface.UpdatePeer(p.Config.RemoteKey, p.Config.AllowedIps, wg.DefaultWgKeepAlive,
|
||||||
udpAddr, p.Config.PreSharedKey)
|
udpAddr, p.Config.PreSharedKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -109,23 +110,24 @@ func (p *Proxy) Start(remoteConn *net.UDPAddr) error {
|
||||||
// return err
|
// return err
|
||||||
// }
|
// }
|
||||||
log.Printf("----> WGIFACE: %+v\n", p.Config.WgInterface)
|
log.Printf("----> WGIFACE: %+v\n", p.Config.WgInterface)
|
||||||
addr, err := GetFreeIp("127.0.0.1/8", p.Config.WgInterface.Port)
|
addr, err := GetFreeIp(common.DefaultCIDR, p.Config.WgInterface.Port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Failed to get freeIp: ", err)
|
log.Println("Failed to get freeIp: ", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
wgAddr := "127.0.0.1"
|
wgListenAddr, err := GetInterfaceListenAddr(p.Config.WgInterface.Port)
|
||||||
if runtime.GOOS == "darwin" {
|
if err != nil {
|
||||||
wgAddr = addr
|
log.Println("failed to get wg listen addr: ", err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
if runtime.GOOS == "darwin" {
|
||||||
|
wgListenAddr.IP = net.ParseIP(addr)
|
||||||
|
}
|
||||||
|
log.Println("--------->#### Wg Listen Addr: ", wgListenAddr.String())
|
||||||
p.LocalConn, err = net.DialUDP("udp", &net.UDPAddr{
|
p.LocalConn, err = net.DialUDP("udp", &net.UDPAddr{
|
||||||
IP: net.ParseIP(addr),
|
IP: net.ParseIP(addr),
|
||||||
Port: common.NmProxyPort,
|
Port: common.NmProxyPort,
|
||||||
}, &net.UDPAddr{
|
}, wgListenAddr)
|
||||||
IP: net.ParseIP(wgAddr),
|
|
||||||
Port: p.Config.WgInterface.Port,
|
|
||||||
})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("failed dialing to local Wireguard port,Err: %v\n", err)
|
log.Printf("failed dialing to local Wireguard port,Err: %v\n", err)
|
||||||
return err
|
return err
|
||||||
|
@ -172,7 +174,8 @@ func GetFreeIp(cidrAddr string, dstPort int) (string, error) {
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("----> GetFreeIP ERR: ", err)
|
log.Println("----> GetFreeIP ERR: ", err)
|
||||||
if strings.Contains(err.Error(), "can't assign requested address") || strings.Contains(err.Error(), "address already in use") {
|
if strings.Contains(err.Error(), "can't assign requested address") ||
|
||||||
|
strings.Contains(err.Error(), "address already in use") || strings.Contains(err.Error(), "cannot assign requested address") {
|
||||||
var nErr error
|
var nErr error
|
||||||
newAddrs, nErr = net4.NextIP(newAddrs)
|
newAddrs, nErr = net4.NextIP(newAddrs)
|
||||||
if nErr != nil {
|
if nErr != nil {
|
||||||
|
|
|
@ -16,14 +16,13 @@ var (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
defaultBodySize = 10000
|
defaultBodySize = 10000
|
||||||
defaultPort = 51722
|
defaultPort = common.NmProxyPort
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Port int
|
Port int
|
||||||
BodySize int
|
BodySize int
|
||||||
Addr net.Addr
|
Addr net.Addr
|
||||||
LocalWgInterfaces []string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProxyServer struct {
|
type ProxyServer struct {
|
||||||
|
@ -50,13 +49,14 @@ func (p *ProxyServer) Listen() {
|
||||||
log.Println("failed to extract info: ", err)
|
log.Println("failed to extract info: ", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
log.Printf("--------> RECV PKT [DSTPORT: %d], [SRCKEYHASH: %s], SourceIP: [%s] \n", localWgPort, srcPeerKeyHash, source.IP.String())
|
// log.Printf("--------> RECV PKT [DSTPORT: %d], [SRCKEYHASH: %s], SourceIP: [%s] \n", localWgPort, srcPeerKeyHash, source.IP.String())
|
||||||
if peerInfo, ok := common.PeerKeyHashMap[srcPeerKeyHash]; ok {
|
if peerInfo, ok := common.PeerKeyHashMap[srcPeerKeyHash]; ok {
|
||||||
if peers, ok := common.WgIFaceMap[peerInfo.Interface]; ok {
|
if peers, ok := common.WgIFaceMap[peerInfo.Interface]; ok {
|
||||||
if peerI, ok := peers[peerInfo.PeerKey]; ok {
|
if peerI, ok := peers[peerInfo.PeerKey]; ok {
|
||||||
// if peerI.Config.LocalWgPort == int(localWgPort) {
|
// if peerI.Config.LocalWgPort == int(localWgPort) {
|
||||||
log.Printf("PROXING TO LOCAL!!!---> %s <<<< %s <<<<<<<< %s\n", peerI.Proxy.LocalConn.RemoteAddr(),
|
log.Printf("PROXING TO LOCAL!!!---> %s <<<< %s <<<<<<<< %s [[ RECV PKT [DSTPORT: %d], [SRCKEYHASH: %s], SourceIP: [%s] ]]\n",
|
||||||
peerI.Proxy.LocalConn.LocalAddr(), fmt.Sprintf("%s:%d", source.IP.String(), source.Port))
|
peerI.Proxy.LocalConn.RemoteAddr(), peerI.Proxy.LocalConn.LocalAddr(),
|
||||||
|
fmt.Sprintf("%s:%d", source.IP.String(), source.Port), localWgPort, srcPeerKeyHash, source.IP.String())
|
||||||
_, err = peerI.Proxy.LocalConn.Write(buffer[:n])
|
_, err = peerI.Proxy.LocalConn.Write(buffer[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Failed to proxy to Wg local interface: ", err)
|
log.Println("Failed to proxy to Wg local interface: ", err)
|
||||||
|
|
Loading…
Reference in a new issue