mirror of
https://github.com/fosrl/olm.git
synced 2026-02-19 03:16:46 +00:00
Basic dns proxy working
This commit is contained in:
BIN
olm-binary
Executable file
BIN
olm-binary
Executable file
Binary file not shown.
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user