Comments (1)
I wrote an example of DNS proxy through ss client and server for your reference.
package main
import (
"context"
"log"
"net"
"os"
"time"
"github.com/wzshiming/shadowsocks"
_ "github.com/wzshiming/shadowsocks/init"
)
func main() {
ctx := context.Background()
// Start remote server of Shadowsocks
ssServer, err := shadowsocks.NewSimplePacketServer("ss://aes-128-cfb:[email protected]:0")
if err != nil {
log.Println("NewSimplePacketServer", err)
os.Exit(1)
}
// Print remote listening address
ssServer.ProxyPacket = func(ctx context.Context, network, address string) (net.PacketConn, error) {
pc, err := net.ListenPacket(network, address)
if err != nil {
return nil, err
}
log.Println("ss server to target address", pc.LocalAddr())
return pc, nil
}
err = ssServer.Start(ctx)
if err != nil {
log.Println("Start", err)
os.Exit(1)
}
// Create local client of Shadowsocks
ssClient, err := shadowsocks.NewPacketClient(ssServer.ProxyURL())
if err != nil {
log.Println("NewPacketClient", err)
os.Exit(1)
}
// Print local listening address
ssClient.ProxyPacket = func(ctx context.Context, network, address string) (net.PacketConn, error) {
pc, err := net.ListenPacket(network, address)
if err != nil {
return nil, err
}
log.Println("ss client to server", pc.LocalAddr())
return pc, nil
}
// Create DNS client
resolverClient := net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
// Use local client of Shadowsocks to connect to remote DNS server
client, err := ssClient.ListenPacket(context.Background(), "udp", ":0")
if err != nil {
return nil, err
}
addr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
return nil, err
}
return &wrap{PacketConn: client, remoteAddr: addr}, nil
},
}
// Send DNS query
for i := 0; i != 3; i++ {
time.Sleep(1 * time.Second)
addresses, err := resolverClient.LookupHost(ctx, "google.com")
if err != nil {
log.Println("LookupHost", err)
os.Exit(1)
}
log.Println(addresses)
}
}
type wrap struct {
net.PacketConn
remoteAddr net.Addr
}
func (t wrap) RemoteAddr() net.Addr {
return t.remoteAddr
}
func (t *wrap) Write(b []byte) (n int, err error) {
return t.PacketConn.WriteTo(b, t.remoteAddr)
}
func (t *wrap) Read(b []byte) (n int, err error) {
n, addr, err := t.PacketConn.ReadFrom(b)
if err != nil {
return 0, err
}
if addr.String() == t.remoteAddr.String() {
return n, nil
}
return t.Read(b)
}
from shadowsocks.
Related Issues (1)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from shadowsocks.