Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dns #23

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open

dns #23

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
fetch-depth: 0
- uses: actions/setup-go@v5
with:
go-version: stable
go-version: '1.23.1'
- run: sudo apt-get install -y libpcap-dev
- run: go mod tidy
- run: go test -v ./...
Expand Down
10 changes: 10 additions & 0 deletions cfg/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ func Load(filePath string) (*Config, error) {
type Config struct {
ExecuteOnStart []string `json:"executeOnStart"`
PCAP PCAP `json:"pcap"`
DNS DNS `json:"dns"`
Routing struct {
Rules []Rule `json:"rules"`
} `json:"routing"`
Expand Down Expand Up @@ -84,6 +85,7 @@ type Outbound struct {
Direct *OutboundDirect `json:"direct,omitempty"`
Socks *OutboundSocks `json:"socks,omitempty"`
Reject *OutboundReject `json:"reject,omitempty"`
DNS *OutboundDNS `json:"dns,omitempty"`
Tag string `json:"tag,omitempty"`
}

Expand All @@ -96,6 +98,14 @@ type OutboundSocks struct {
Password string `json:"password"`
}

type OutboundDNS struct{}

type DNS struct {
Servers []struct {
Address string `json:"address"`
}
}

func mustToNetIP(addrs []string) []net.IPNet {
ips := make([]net.IPNet, 0, len(addrs))

Expand Down
29 changes: 23 additions & 6 deletions config.json.fullsample → config_full_sample.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
{
"executeOnStart": ["C:\\Users\\Danox\\Desktop\\GOPCAP\\out.exe"],
"executeOnStart": [
"C:\\Users\\Danox\\Desktop\\GOPCAP\\out.exe"
],
"pcap": {
"interfaceGateway": "",
"interfaceGateway": "192.168.1.42",
"mtu": 0,
"network": "172.24.0.0/16",
"localIP": "172.24.2.1",
"localMAC": ""
},
"dns": {
"servers": [
{
"address": "1.1.1.1:53"
}
]
},
"routing": {
"rules": [
{
"srcPort": "80,443,53,3544,1985,55960,4500,500,3075,1900,5355,5353",
"srcPort": "80,443,3544,1985,55960,4500,500,3075,1900,5355,5353",
"dstPort": "3074",
"outboundTag": "sout"
"outboundTag": "socks-out"
},
{
"srcIP": [
Expand All @@ -24,7 +33,11 @@
"40.74.0.0/16",
"192.168.0.0/16"
],
"outboundTag": "sout"
"outboundTag": "socks-out"
},
{
"dstPort": "53",
"outboundTag": "dns-out"
}
]
},
Expand All @@ -33,10 +46,14 @@
"direct": {}
},
{
"tag": "sout",
"tag": "socks-out",
"socks": {
"address": "127.0.0.1:1080"
}
},
{
"tag": "dns-out",
"dns": {}
}
]
}
4 changes: 2 additions & 2 deletions core/device/pcap.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ func (t *PCAP) Read() []byte {
defer t.rMux.Unlock()
data, _, err := t.handle.ZeroCopyReadPacketData()
if err != nil {
slog.Error("read packet error: %w", err)
slog.Error("read packet error: %w", slog.Any("err", err))
return nil
}

Expand Down Expand Up @@ -218,7 +218,7 @@ func (t *PCAP) Read() []byte {
func (t *PCAP) Write(p []byte) (n int, err error) {
err = t.handle.WritePacketData(p)
if err != nil {
slog.Error("write packet error: %w", err)
slog.Error("write packet error: %w", slog.Any("err", err))
return 0, nil
}

Expand Down
6 changes: 3 additions & 3 deletions core/udpforwarder.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func (h handler) NewPacketConnection(ctx context.Context, conn N.PacketConn, met
}

func (h handler) NewError(ctx context.Context, err error) {
slog.Error("udp PacketConnection proxy error: ", err)
slog.Error("udp PacketConnection proxy error: ", slog.Any("err", err))
}

func CreateProxyHandler(a func(adapter.UDPConn)) Handler {
Expand All @@ -64,7 +64,7 @@ func (ph proxyHandler) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
buffer := buf.With(p)
destination, err := ph.conn.ReadPacket(buffer)
if err != nil {
slog.Error("udp read packet error: ", err)
slog.Error("udp read packet error: ", slog.Any("err", err))
return
}
n = buffer.Len()
Expand All @@ -80,7 +80,7 @@ func (ph proxyHandler) WriteTo(p []byte, addr net.Addr) (n int, err error) {
common.Must1(bf.Write(p))
err = ph.conn.WritePacket(bf, M.SocksaddrFromNet(addr).Unwrap())
if err != nil {
slog.Error("udp write packet error: ", err)
slog.Error("udp write packet error: ", slog.Any("err", err))
return 0, err
}

Expand Down
16 changes: 10 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,23 +1,27 @@
module github.com/DaniilSokolyuk/go-pcap2socks

go 1.22.1
go 1.23.1

require (
github.com/gopacket/gopacket v1.2.0
github.com/gopacket/gopacket v1.3.0
github.com/jackpal/gateway v1.0.15
github.com/miekg/dns v1.1.62
github.com/sagernet/sing v0.4.2
github.com/stretchr/testify v1.9.0
go.uber.org/atomic v1.11.0
golang.org/x/sys v0.22.0
golang.org/x/time v0.5.0
gvisor.dev/gvisor v0.0.0-20240726212243-a2b0498dbe7d
golang.org/x/sys v0.25.0
golang.org/x/time v0.6.0
gvisor.dev/gvisor v0.0.0-20240912010154-1243db29d375
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/google/btree v1.1.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/mod v0.21.0 // indirect
golang.org/x/net v0.29.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/tools v0.25.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
30 changes: 20 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
github.com/gopacket/gopacket v1.2.0 h1:eXbzFad7f73P1n2EJHQlsKuvIMJjVXK5tXoSca78I3A=
github.com/gopacket/gopacket v1.2.0/go.mod h1:BrAKEy5EOGQ76LSqh7DMAr7z0NNPdczWm2GxCG7+I8M=
github.com/gopacket/gopacket v1.3.0 h1:MouZCc+ej0vnqzB0WeiaO/6+tGvb+KU7UczxoQ+X0Yc=
github.com/gopacket/gopacket v1.3.0/go.mod h1:WnFrU1Xkf5lWKV38uKNR9+yYtppn+ZYzOyNqMeH4oNE=
github.com/jackpal/gateway v1.0.15 h1:yb4Gltgr8ApHWWnSyybnDL1vURbqw7ooo7IIL5VZSeg=
github.com/jackpal/gateway v1.0.15/go.mod h1:dbyEDcDhHUh9EmjB9ung81elMUZfG0SoNc2TfTbcj4c=
github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sagernet/sing v0.4.2 h1:jzGNJdZVRI0xlAfFugsIQUPvyB9SuWvbJK7zQCXc4QM=
Expand All @@ -16,15 +20,21 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gvisor.dev/gvisor v0.0.0-20240726212243-a2b0498dbe7d h1:nF+dSOz0u0DLrhnOmGp3ocPAylsgpim29DGIt/oxNR4=
gvisor.dev/gvisor v0.0.0-20240726212243-a2b0498dbe7d/go.mod h1:sxc3Uvk/vHcd3tj7/DHVBoR5wvWT/MmRq2pj7HRJnwU=
gvisor.dev/gvisor v0.0.0-20240912010154-1243db29d375 h1:wLcac6WGtl2F79rF0Rr0uHbwxfPry99Nuqp1cEo4JQo=
gvisor.dev/gvisor v0.0.0-20240912010154-1243db29d375/go.mod h1:sxc3Uvk/vHcd3tj7/DHVBoR5wvWT/MmRq2pj7HRJnwU=
14 changes: 8 additions & 6 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func main() {
} else {
executable, err := os.Executable()
if err != nil {
slog.Error("get executable error", "error", err)
slog.Error("get executable error", slog.Any("err", err))
return
}

Expand All @@ -44,14 +44,14 @@ func main() {
//path to near executable file
err := os.WriteFile(cfgFile, []byte(configData), 0666)
if err != nil {
slog.Error("write config error", "file", cfgFile, "error", err)
slog.Error("write config error", slog.Any("file", cfgFile), slog.Any("err", err))
return
}
}

config, err := cfg.Load(cfgFile)
if err != nil {
slog.Error("load config error", "file", cfgFile, "error", err)
slog.Error("load config error", slog.Any("file", cfgFile), slog.Any("err", err))
return
}
slog.Info("Config loaded", "file", cfgFile)
Expand All @@ -72,7 +72,7 @@ func main() {
go func() {
err := cmd.Start()
if err != nil {
slog.Error("execute command error", "error", err)
slog.Error("execute command error", slog.Any("err", err))
}

err = cmd.Wait()
Expand All @@ -84,7 +84,7 @@ func main() {

err = run(config)
if err != nil {
slog.Error("run error", "error", err)
slog.Error("run error", slog.Any("err", err))
return
}

Expand All @@ -109,6 +109,8 @@ func run(cfg *cfg.Config) error {
}
case outbound.Reject != nil:
p = proxy.NewReject()
case outbound.DNS != nil:
p = proxy.NewDNS(cfg.DNS)
default:
return fmt.Errorf("invalid outbound: %+v", outbound)
}
Expand All @@ -132,7 +134,7 @@ func run(cfg *cfg.Config) error {
MulticastGroups: []net.IP{},
Options: []option.Option{},
}); err != nil {
slog.Error("create stack error: %w", err)
slog.Error("create stack error", slog.Any("err", err))
}

return nil
Expand Down
Loading
Loading