Skip to content

Commit 7c9587e

Browse files
authored
Update client.go
1 parent 3c84d35 commit 7c9587e

1 file changed

Lines changed: 43 additions & 169 deletions

File tree

client.go

Lines changed: 43 additions & 169 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,32 @@ package main
33
import (
44
"flag"
55
"fmt"
6-
"github.com/sirupsen/logrus"
76
"net"
87
"os"
8+
"os/exec"
99
"sync"
1010
"time"
11-
11+
"github.com/sirupsen/logrus"
1212
"github.com/songgao/water"
13-
"github.com/Azumi67/LocalTun_TCP/tcp_no_delay_client"
14-
"github.com/Azumi67/LocalTun_TCP/smux_client"
13+
"github.com/Azumi67/LocalTun_TCP/tcp_no_delay_server"
1514
"github.com/Azumi67/LocalTun_TCP/client"
15+
"github.com/Azumi67/LocalTun_TCP/smux_client"
1616
)
1717

1818
var log = logrus.New()
1919

2020
func main() {
21-
kharejAddr := flag.String("server-addr", "SERVER_IP", "Server IP address")
21+
kharejAddr := flag.String("server-addr", "SERVER_IP", "Server Public IP address")
2222
serverPort := flag.Int("server-port", 800, "Server port")
23-
tunIP := flag.String("client-private", "2001:db8::2", "Client Private IP address")
23+
clientTunIP := flag.String("client-private", "2001:db8::2", "Client Private IP address")
2424
serverTunIP := flag.String("server-private", "2001:db8::1", "Server Private IP address")
25-
subnetMask := flag.String("subnet", "64", "Subnet mask (e.g : 24 or 64)")
25+
subnetMask := flag.String("subnet", "64", "Subnet mask (e.g: 24 or 64)")
2626
tunName := flag.String("device", "tun2", "TUN device name")
2727
secretKey := flag.String("key", "azumi", "Secret key for authentication")
2828
mtu := flag.Int("mtu", 1480, "MTU for TUN device")
2929
verbose := flag.Bool("verbose", false, "Enable logging")
3030
useSmux := flag.Bool("smux", false, "Enable smux multiplexing")
31+
tcpNoDelay := flag.Bool("tcp-nodelay", false, "Enable TCP_NODELAY")
3132

3233
flag.Parse()
3334

@@ -38,182 +39,55 @@ func main() {
3839
log.SetLevel(logrus.InfoLevel)
3940
}
4041

41-
config := water.Config{
42-
DeviceType: water.TUN,
43-
}
44-
config.Name = *tunName
45-
tun, err := water.New(config)
42+
tun, err := tunclient.tunUp(*tunName, *clientTunIP, *serverTunIP, *subnetMask, *mtu)
4643
if err != nil {
47-
log.Fatalf("Couldn't create TUN device: %v", err)
44+
log.Fatalf("Couldn't setup TUN device: %v", err)
4845
}
4946
defer tun.Close()
5047

51-
tunclient.TunUp(tun, *tunIP, *serverTunIP, *subnetMask, *mtu, *tunName)
52-
53-
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", *kharejAddr, *serverPort))
54-
if err != nil {
55-
log.Fatalf("Couldn't connect to server: %v", err)
56-
}
57-
defer conn.Close()
58-
59-
log.Info("Connected to server")
60-
61-
tcpConn, ok := conn.(*net.TCPConn)
62-
if !ok {
63-
log.Warn("Converting to TCPConn failed")
64-
return
65-
}
66-
67-
if err := tcpnodelayclient.noDelay(tcpConn); err != nil {
68-
log.Warnf("Setting up TCP no delay failed: %v", err)
69-
return
70-
}
71-
72-
stop := make(chan struct{})
73-
var wg sync.WaitGroup
74-
75-
wg.Add(1)
76-
go func() {
77-
defer wg.Done()
78-
if *useSmux {
79-
smuxclient.HandleSmux(conn, tun, *verbose, stop)
80-
} else {
81-
handleServer(conn, tun, *secretKey, *verbose, stop)
82-
}
83-
}()
84-
85-
for {
86-
time.Sleep(10 * time.Second)
87-
if !ping(*serverTunIP) {
88-
log.Warn("Server is unreachable, azumi is reconnecting..")
89-
close(stop)
90-
conn.Close()
91-
wg.Wait()
92-
break
93-
}
94-
}
95-
}
96-
97-
func handleServer(conn net.Conn, tun *water.Interface, secretKey string, verbose bool, stop chan struct{}) {
98-
if _, err := conn.Write([]byte(secretKey)); err != nil {
99-
log.Warnf("Couldn't send authentication key: %v", err)
100-
return
101-
}
102-
103-
clientToTun := make(chan []byte, 100)
104-
tunToClient := make(chan []byte, 100)
105-
106-
var wg sync.WaitGroup
107-
108-
wg.Add(1)
109-
go func() {
110-
defer wg.Done()
111-
fromServer(conn, tun, clientToTun, verbose, stop)
112-
}()
113-
114-
wg.Add(1)
115-
go func() {
116-
defer wg.Done()
117-
toTun(tun, clientToTun, verbose, stop)
118-
}()
119-
120-
wg.Add(1)
121-
go func() {
122-
defer wg.Done()
123-
fromTun(tun, tunToClient, verbose, stop)
124-
}()
125-
126-
wg.Add(1)
127-
go func() {
128-
defer wg.Done()
129-
toServer(conn, tunToClient, verbose, stop)
130-
}()
131-
132-
wg.Wait()
133-
}
134-
135-
func fromServer(conn net.Conn, tun *water.Interface, clientToTun chan []byte, verbose bool, stop chan struct{}) {
13648
for {
137-
select {
138-
case <-stop:
139-
return
140-
default:
141-
pcktLength := make([]byte, 2)
142-
if _, err := conn.Read(pcktLength); err != nil {
143-
log.Warnf("Couldn't read packet length from server: %v", err)
144-
close(clientToTun)
145-
return
146-
}
147-
148-
length := binary.BigEndian.Uint16(pcktLength)
149-
buff := make([]byte, length)
150-
151-
_, err := data(conn, buff)
152-
if err != nil {
153-
log.Warnf("Couldn't read data from server: %v", err)
154-
close(clientToTun)
155-
return
156-
}
157-
158-
clientToTun <- buff
49+
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", *kharejAddr, *serverPort))
50+
if err != nil {
51+
log.Warnf("Couldn't connect to server: %v", err)
52+
time.Sleep(5 * time.Second)
53+
continue
15954
}
160-
}
161-
}
55+
defer conn.Close()
16256

163-
func toTun(tun *water.Interface, clientToTun chan []byte, verbose bool, stop chan struct{}) {
164-
for {
165-
select {
166-
case <-stop:
167-
return
168-
case buff := <-clientToTun:
169-
if _, err := tun.Write(buff); err != nil {
170-
log.Warnf("Couldn't write to TUN device: %v", err)
171-
}
57+
if err := tcpnodelayclient.NoDelay(conn, *tcpNoDelay); err != nil {
58+
log.Warnf("Couldn't set TCP_NODELAY: %v", err)
17259
}
173-
}
174-
}
17560

176-
func fromTun(tun *water.Interface, tunToClient chan []byte, verbose bool, stop chan struct{}) {
177-
for {
178-
select {
179-
case <-stop:
180-
return
181-
default:
182-
buff := make([]byte, 1500)
183-
n, err := tun.Read(buff)
184-
if err != nil {
185-
log.Warnf("Couldn't read from TUN device: %v", err)
186-
continue
187-
}
61+
log.Info("Connected to server")
18862

189-
packet := make([]byte, 2+n)
190-
binary.BigEndian.PutUint16(packet[:2], uint16(n))
191-
copy(packet[2:], buff[:n])
63+
stop := make(chan struct{})
64+
var wg sync.WaitGroup
19265

193-
tunToClient <- packet
194-
}
195-
}
196-
}
197-
198-
func toServer(conn net.Conn, tunToClient chan []byte, verbose bool, stop chan struct{}) {
199-
for {
200-
select {
201-
case <-stop:
202-
return
203-
case packet := <-tunToClient:
204-
if _, err := conn.Write(packet); err != nil {
205-
log.Warnf("Couldn't write to server: %v", err)
206-
return
66+
wg.Add(1)
67+
go func() {
68+
defer wg.Done()
69+
if *useSmux {
70+
smuxclient.HandleSmux(conn, tun, *verbose, stop)
71+
} else {
72+
tunclient.HandleServer(conn, tun, *secretKey, *verbose, *useSmux, stop)
73+
}
74+
}()
75+
76+
for {
77+
time.Sleep(10 * time.Second)
78+
if !ping(*serverTunIP) {
79+
log.Warn("Server is unreachable, Azumi is reconnecting..")
80+
close(stop)
81+
conn.Close()
82+
wg.Wait()
83+
break
20784
}
20885
}
20986
}
21087
}
21188

212-
func data(conn net.Conn, buff []byte) (int, error) {
213-
return conn.Read(buff)
214-
}
215-
216-
func ping(ip string) bool {
217-
// later it will be added or in script i will make a keepalive ping service
218-
return true
89+
func ping(address string) bool {
90+
cmd := exec.Command("ping", "-c1", "-w1", address)
91+
err := cmd.Run()
92+
return err == nil
21993
}

0 commit comments

Comments
 (0)