Basic dns proxy working

This commit is contained in:
Owen
2025-11-21 15:07:19 -05:00
parent 04f7778765
commit f0886d5ac6
2 changed files with 28 additions and 14 deletions

BIN
olm-binary Executable file

Binary file not shown.

View File

@@ -42,8 +42,6 @@ type DNSProxy struct {
ctx context.Context ctx context.Context
cancel context.CancelFunc cancel context.CancelFunc
wg sync.WaitGroup wg sync.WaitGroup
mutex sync.RWMutex
} }
// NewDNSProxy creates a new DNS proxy // NewDNSProxy creates a new DNS proxy
@@ -264,6 +262,10 @@ func (p *DNSProxy) queryUpstream(server string, query []byte, timeout time.Durat
func (p *DNSProxy) runPacketSender() { func (p *DNSProxy) runPacketSender() {
defer p.wg.Done() defer p.wg.Done()
// MessageTransportHeaderSize is the offset used by WireGuard device
// for reading/writing packets to the TUN interface
const offset = 16
for { for {
select { select {
case <-p.ctx.Done(): case <-p.ctx.Done():
@@ -279,20 +281,32 @@ func (p *DNSProxy) runPacketSender() {
continue continue
} }
// Convert packet to bytes // Extract packet data as slices
view := pkt.ToView() slices := pkt.AsSlices()
packetData := view.AsSlice() if len(slices) > 0 {
// Flatten all slices into a single packet buffer
var totalSize int
for _, slice := range slices {
totalSize += len(slice)
}
// Make a copy and write directly back to the TUN device // Allocate buffer with offset space for WireGuard transport header
// This bypasses WireGuard - the packet goes straight back to the host // The first 'offset' bytes are reserved for the transport header
buf := make([]byte, len(packetData)) buf := make([]byte, offset+totalSize)
copy(buf, packetData)
// Write packet back to TUN device // Copy packet data after the offset
bufs := [][]byte{buf} pos := offset
_, err := p.tunDevice.Write(bufs, 0) for _, slice := range slices {
if err != nil { copy(buf[pos:], slice)
logger.Error("Failed to write DNS response to TUN: %v", err) pos += len(slice)
}
// Write packet to TUN device
// offset=16 indicates packet data starts at position 16 in the buffer
_, err := p.tunDevice.Write([][]byte{buf}, offset)
if err != nil {
logger.Error("Failed to write DNS response to TUN: %v", err)
}
} }
pkt.DecRef() pkt.DecRef()