-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathudpserver3.go
90 lines (81 loc) · 1.93 KB
/
udpserver3.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package main
import (
"encoding/binary"
"log"
"net"
)
func main() {
udpAddr := &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: 10053,
}
listener, err := net.ListenUDP("udp", udpAddr)
if err != nil {
log.Fatal(err)
}
log.Println("Now listen")
buf := make([]byte, 512)
for {
l, addr, err := listener.ReadFromUDP(buf)
if err != nil {
log.Fatalln(err)
}
go func() {
if l <= 12 {
log.Printf("From: %s, Data: %x", addr, buf[:l])
return
}
log.Printf("l=%d ln=%d lc=%d", l, len(buf), cap(buf))
// buffer for NAME
tm := make([]byte, 256)
b1 := buf[:11]
b2 := buf[12:l]
// current position in NAME
p := 0
for p < len(b2) && b2[p] != 0 {
// label length
ll := int(b2[p])
p++
tm = append(tm, b2[p:ll+p]...)
tm = append(tm, '.')
log.Printf("p=%3d, label length=%2d, name=%s", p, ll, tm)
p += ll
}
p++
log.Printf("From: %s, Data: %012X , %x , %s", addr, b1, b2, tm)
if len(b2) > p+4 {
log.Printf("QTYPE=%02X, QCLASS=%02X", b2[p:p+2], b2[p+2:p+4])
} else {
return
}
// only for IN A
if binary.BigEndian.Uint16(b2[p:p+2]) == 1 && binary.BigEndian.Uint16(b2[p+2:p+4]) == 1 {
log.Printf("%s\t\t\tIN A", tm)
// Question Data
qd := b2[0 : p+4]
// header
buf := []byte{0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}
// copy question data
buf = append(buf, qd...)
// copy question data
buf = append(buf, qd...)
// TTL 300
buf = append(buf, []byte{0x00, 0x00, 0x01, 0x2c}...)
// Length = 4
buf = append(buf, []byte{0x00, 0x04}...)
// IP 1.1.1.1
buf = append(buf, []byte{0x01, 0x01, 0x01, 01}...)
// replace ID
buf[0] = b1[0]
buf[1] = b1[1]
log.Printf("%x", buf)
wl, err := listener.WriteTo(buf, addr)
if err != nil {
log.Fatalln("WriteTo() error: %s\n", err)
} else {
log.Printf("Wrote %d bytes to socket\n", wl)
}
}
}()
}
}