Skip to content

Commit

Permalink
Merge pull request #35 from synfinatic/wireguard
Browse files Browse the repository at this point in the history
Merge wireguard improvements & hack around DLT_VALUE having the DLT_NAME for Wireguard RAW interfaces.
  • Loading branch information
synfinatic authored Oct 16, 2020
2 parents 1a6a0ba + be08915 commit 05c4d80
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 30 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ GOARCH ?= $(shell uname -m)
BUILDINFOSDET ?=
UDP_PROXY_2020_ARGS ?=

PROJECT_VERSION := 0.0.4
PROJECT_VERSION := 0.0.5
DOCKER_REPO := synfinatic
PROJECT_NAME := udp-proxy-2020
PROJECT_TAG := $(shell git describe --tags 2>/dev/null $(git rev-list --tags --max-count=1))
Expand Down
2 changes: 1 addition & 1 deletion cmd/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func initializeInterface(l *Listen) {
}

if !isValidLayerType(l.handle.LinkType()) {
log.Fatalf("%s: has an invalid layer type: 0x%02x", l.iname, l.handle.LinkType())
log.Fatalf("%s: has an invalid layer type: %s", l.iname, l.handle.LinkType().String())
}

// set our BPF filter
Expand Down
47 changes: 26 additions & 21 deletions cmd/listen.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package main

import (
"encoding/binary"
"encoding/hex"
"net"
"strings"
"sync"
"time"

Expand Down Expand Up @@ -142,17 +144,15 @@ func (l *Listen) sendPackets(sndpkt Send) {

log.Debugf("processing packet from %s on %s", sndpkt.srcif, l.iname)

switch sndpkt.linkType {
case layers.LinkTypeNull:
switch sndpkt.linkType.String() {
case layers.LinkTypeNull.String(), layers.LinkTypeLoop.String():
parser = gopacket.NewDecodingLayerParser(layers.LayerTypeLoopback, &loop, &ip4, &udp, &payload)
case layers.LinkTypeLoop:
parser = gopacket.NewDecodingLayerParser(layers.LayerTypeLoopback, &loop, &ip4, &udp, &payload)
case layers.LinkTypeEthernet:
case layers.LinkTypeEthernet.String():
parser = gopacket.NewDecodingLayerParser(layers.LayerTypeEthernet, &eth, &ip4, &udp, &payload)
case layers.LinkTypeRaw:
case layers.LinkTypeRaw.String():
parser = gopacket.NewDecodingLayerParser(layers.LayerTypeIPv4, &ip4, &udp, &payload)
default:
log.Fatalf("Unsupported source linktype: 0x%02x", sndpkt.linkType)
log.Fatalf("Unsupported source linktype: %s", sndpkt.linkType.String())
}

// try decoding our packet
Expand Down Expand Up @@ -187,6 +187,9 @@ func (l *Listen) sendPackets(sndpkt Send) {
}
} else {
// sent packet to every client
if len(l.clients) == 0 {
log.Debugf("%s: Unable to send packet; no discovered clients", l.iname)
}
for ip, _ := range l.clients {
dstip := net.ParseIP(ip).To4()
if err, bytes := l.sendPacket(dstip, eth, loop, ip4, udp, payload); err != nil {
Expand Down Expand Up @@ -250,17 +253,15 @@ func (l *Listen) sendPacket(dstip net.IP, eth layers.Ethernet, loop layers.Loopb
}

// Add our L2 header to the buffer
switch l.handle.LinkType() {
case layers.LinkTypeNull, layers.LinkTypeLoop:
switch l.handle.LinkType().String() {
case layers.LinkTypeNull.String(), layers.LinkTypeLoop.String():
loop := layers.Loopback{
Family: layers.ProtocolFamilyIPv4,
}
if err := loop.SerializeTo(buffer, opts); err != nil {
log.Fatalf("can't serialize Loop header: %v", loop)
}
case layers.LinkTypeRaw:
// nothing
case layers.LinkTypeEthernet:
case layers.LinkTypeEthernet.String():
// build a new ethernet header
new_eth := layers.Ethernet{
BaseLayer: layers.BaseLayer{},
Expand All @@ -271,10 +272,15 @@ func (l *Listen) sendPacket(dstip net.IP, eth layers.Ethernet, loop layers.Loopb
if err := new_eth.SerializeTo(buffer, opts); err != nil {
log.Fatalf("can't serialize Eth header: %v", new_eth)
}
case layers.LinkTypeRaw.String():
// no L2 header
default:
log.Warnf("Unsupported linktype: %s", l.handle.LinkType().String())
}

outgoingPacket := buffer.Bytes()
log.Debugf("%s => %s: packet len: %d: %v", l.iname, dstip.String(), len(outgoingPacket), outgoingPacket)
log.Debugf("%s => %s: packet len: %d: %s",
l.iname, dstip.String(), len(outgoingPacket), hex.EncodeToString(outgoingPacket))
return l.handle.WritePacketData(outgoingPacket), len(outgoingPacket)
}

Expand All @@ -286,17 +292,15 @@ func (l *Listen) learnClientIP(packet gopacket.Packet) {
var payload gopacket.Payload
var parser *gopacket.DecodingLayerParser

switch l.handle.LinkType() {
case layers.LinkTypeNull:
parser = gopacket.NewDecodingLayerParser(layers.LayerTypeLoopback, &loop, &ip4, &udp, &payload)
case layers.LinkTypeLoop:
switch l.handle.LinkType().String() {
case layers.LinkTypeNull.String(), layers.LinkTypeLoop.String():
parser = gopacket.NewDecodingLayerParser(layers.LayerTypeLoopback, &loop, &ip4, &udp, &payload)
case layers.LinkTypeEthernet:
case layers.LinkTypeEthernet.String():
parser = gopacket.NewDecodingLayerParser(layers.LayerTypeEthernet, &eth, &ip4, &udp, &payload)
case layers.LinkTypeRaw:
case layers.LinkTypeRaw.String():
parser = gopacket.NewDecodingLayerParser(layers.LayerTypeIPv4, &ip4, &udp, &payload)
default:
log.Fatalf("Unsupported source linktype: 0x%02x", l.handle.LinkType())
log.Fatalf("Unsupported source linktype: %s", l.handle.LinkType().String())
}

decoded := []gopacket.LayerType{}
Expand All @@ -314,14 +318,15 @@ func (l *Listen) learnClientIP(packet gopacket.Packet) {
}

if found_ipv4 {
log.Debugf("%s: Learned client IP: %s", l.iname, ip4.SrcIP.String())
l.clients[ip4.SrcIP.String()] = time.Now().Add(l.clientTTL)
}
}

// Returns if the provided layertype is valid
func isValidLayerType(layertype layers.LinkType) bool {
for _, b := range validLinkTypes {
if b == layertype {
if strings.Compare(b.String(), layertype.String()) == 0 {
return true
}
}
Expand Down
10 changes: 3 additions & 7 deletions cmd/send.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,15 @@ type SendPktFeed struct {

// Send is a function to send a packet out all the other interfaces other than srcif
func (s *SendPktFeed) Send(p gopacket.Packet, srcif string, linkType layers.LinkType) {
log.Debugf("Lock()???")
s.lock.Lock()
log.Debugf("Lock() achieved. Sending out %d interfaces", len(s.senders)-1)
for key, send := range s.senders {
if strings.Compare(key, srcif) == 0 {
for thisif, send := range s.senders {
if strings.Compare(thisif, srcif) == 0 {
continue
}
log.Debugf("%s: sending out because we're not %s", srcif, key)
log.Debugf("%s: sending out because we're not %s", thisif, srcif)
send <- Send{packet: p, srcif: srcif, linkType: linkType}
log.Debugf("%s: sent", srcif)
}
s.lock.Unlock()
log.Debugf("Unlock()")
}

// RegisterSender registers a channel to recieve packet data we want to send
Expand Down

0 comments on commit 05c4d80

Please sign in to comment.