@@ -3,31 +3,32 @@ package main
33import (
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
1818var log = logrus .New ()
1919
2020func 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