mirror of
https://github.com/tailscale/tailscale.git
synced 2025-07-13 00:59:55 +00:00
cmd/lopower: add TCP DNS support
Change-Id: I3288bfd538e2662d644c75e62e6c5cdb24464386 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
b8d9c3bc88
commit
455e926d09
@ -7,6 +7,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
@ -465,6 +466,14 @@ func (lp *lpServer) acceptTCP(r *tcp.ForwarderRequest) {
|
|||||||
defer ep.Close()
|
defer ep.Close()
|
||||||
ep.SocketOptions().SetKeepAlive(true)
|
ep.SocketOptions().SetKeepAlive(true)
|
||||||
|
|
||||||
|
if destPort == 53 && lp.c.IsLocalIP(destIP) {
|
||||||
|
tc := gonet.NewTCPConn(&wq, ep)
|
||||||
|
defer tc.Close()
|
||||||
|
r.Complete(false) // accept TCP connection
|
||||||
|
lp.handleTCPDNSQuery(tc, netip.AddrPortFrom(clientRemoteIP, reqDetails.RemotePort))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
dialCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
dialCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
c, err := lp.tsnet.Dial(dialCtx, "tcp", fmt.Sprintf("%s:%d", destIP, destPort))
|
c, err := lp.tsnet.Dial(dialCtx, "tcp", fmt.Sprintf("%s:%d", destIP, destPort))
|
||||||
cancel()
|
cancel()
|
||||||
@ -477,12 +486,7 @@ func (lp *lpServer) acceptTCP(r *tcp.ForwarderRequest) {
|
|||||||
|
|
||||||
tc := gonet.NewTCPConn(&wq, ep)
|
tc := gonet.NewTCPConn(&wq, ep)
|
||||||
defer tc.Close()
|
defer tc.Close()
|
||||||
r.Complete(false)
|
r.Complete(false) // accept TCP connection
|
||||||
|
|
||||||
if destPort == 53 && lp.c.IsLocalIP(destIP) {
|
|
||||||
// TODO(bradfitz,maisem): do TCP DNS server here.
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
errc := make(chan error, 2)
|
errc := make(chan error, 2)
|
||||||
go func() { _, err := io.Copy(tc, c); errc <- err }()
|
go func() { _, err := io.Copy(tc, c); errc <- err }()
|
||||||
@ -705,6 +709,41 @@ func (lp *lpServer) filteredDNSQuery(ctx context.Context, q []byte, family strin
|
|||||||
return msg.Pack()
|
return msg.Pack()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (lp *lpServer) handleTCPDNSQuery(c net.Conn, src netip.AddrPort) {
|
||||||
|
defer c.Close()
|
||||||
|
var lenBuf [2]byte
|
||||||
|
for {
|
||||||
|
c.SetReadDeadline(time.Now().Add(30 * time.Second))
|
||||||
|
_, err := io.ReadFull(c, lenBuf[:])
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
n := binary.BigEndian.Uint16(lenBuf[:])
|
||||||
|
buf := make([]byte, n)
|
||||||
|
c.SetReadDeadline(time.Now().Add(30 * time.Second))
|
||||||
|
_, err = io.ReadFull(c, buf[:])
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := lp.filteredDNSQuery(context.Background(), buf, "tcp", src)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("TCP DNS query error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
binary.BigEndian.PutUint16(lenBuf[:], uint16(len(res)))
|
||||||
|
c.SetWriteDeadline(time.Now().Add(30 * time.Second))
|
||||||
|
_, err = c.Write(lenBuf[:])
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.SetWriteDeadline(time.Now().Add(30 * time.Second))
|
||||||
|
_, err = c.Write(res)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// caller owns the raw memory.
|
// caller owns the raw memory.
|
||||||
func (lp *lpServer) handleDNSUDPQuery(raw []byte) {
|
func (lp *lpServer) handleDNSUDPQuery(raw []byte) {
|
||||||
var pkt packet.Parsed
|
var pkt packet.Parsed
|
||||||
|
Loading…
x
Reference in New Issue
Block a user