2018-12-16 08:56:40 +03:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"flag"
|
|
|
|
|
"fmt"
|
2018-12-18 10:47:45 +03:00
|
|
|
|
"github.com/esrrhs/pingtunnel"
|
2018-12-16 08:56:40 +03:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var usage = `
|
2018-12-18 10:36:59 +03:00
|
|
|
|
通过伪造ping,把udp流量通过远程服务器转发到目的服务器上。用于突破某些运营商封锁UDP流量。
|
|
|
|
|
By forging ping, the udp traffic is forwarded to the destination server through the remote server. Used to break certain operators to block UDP traffic.
|
|
|
|
|
|
2018-12-16 08:56:40 +03:00
|
|
|
|
Usage:
|
|
|
|
|
|
2018-12-18 06:39:16 +03:00
|
|
|
|
pingtunnel -type server
|
2018-12-16 08:56:40 +03:00
|
|
|
|
|
2018-12-18 10:36:59 +03:00
|
|
|
|
pingtunnel -type client -l LOCAL_IP:4455 -s SERVER_IP -t SERVER_IP:4455
|
|
|
|
|
|
|
|
|
|
-type 服务器或者客户端
|
|
|
|
|
client or server
|
|
|
|
|
|
|
|
|
|
-l 本地的地址,发到这个端口的流量将转发到服务器
|
|
|
|
|
Local address, traffic sent to this port will be forwarded to the server
|
|
|
|
|
|
|
|
|
|
-s 服务器的地址,流量将通过隧道转发到这个服务器
|
|
|
|
|
The address of the server, the traffic will be forwarded to this server through the tunnel
|
|
|
|
|
|
|
|
|
|
-t 远端服务器转发的目的地址,流量将转发到这个地址
|
|
|
|
|
Destination address forwarded by the remote server, traffic will be forwarded to this address
|
2018-12-16 08:56:40 +03:00
|
|
|
|
|
2018-12-19 06:48:48 +03:00
|
|
|
|
-timeout 本地记录连接超时的时间,单位是秒,默认60s
|
|
|
|
|
The time when the local record connection timed out, in seconds, 60 seconds by default
|
|
|
|
|
|
2018-12-20 09:12:17 +03:00
|
|
|
|
-sproto 客户端发送ping协议的协议,默认是8
|
|
|
|
|
The protocol that the client sends the ping. The default is 8.
|
2018-12-19 09:38:44 +03:00
|
|
|
|
|
2018-12-20 09:12:17 +03:00
|
|
|
|
-rproto 客户端接收ping协议的协议,默认是0
|
|
|
|
|
The protocol that the client receives the ping. The default is 0.
|
2018-12-23 02:02:57 +03:00
|
|
|
|
|
2018-12-23 02:09:25 +03:00
|
|
|
|
-catch 主动抓模式,每秒从服务器主动抓多少个reply包,默认0
|
|
|
|
|
Active capture mode, how many reply packets are actively captured from the server per second, default 0
|
2019-01-08 05:43:31 +03:00
|
|
|
|
|
|
|
|
|
-key 设置的密码,默认0
|
|
|
|
|
Set password, default 0
|
2019-10-16 16:09:21 +03:00
|
|
|
|
|
|
|
|
|
-tcp 设置是否转发tcp,默认false
|
|
|
|
|
Set the switch to forward tcp, the default is false
|
2018-12-16 08:56:40 +03:00
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
|
2018-12-18 10:36:59 +03:00
|
|
|
|
t := flag.String("type", "", "client or server")
|
|
|
|
|
listen := flag.String("l", "", "listen addr")
|
|
|
|
|
target := flag.String("t", "", "target addr")
|
|
|
|
|
server := flag.String("s", "", "server addr")
|
|
|
|
|
timeout := flag.Int("timeout", 60, "conn timeout")
|
2018-12-20 09:12:17 +03:00
|
|
|
|
sproto := flag.Int("sproto", 8, "send ping proto")
|
|
|
|
|
rproto := flag.Int("rproto", 0, "recv ping proto")
|
2019-01-08 05:32:26 +03:00
|
|
|
|
catch := flag.Int("catch", 0, "catch mode")
|
|
|
|
|
key := flag.Int("key", 0, "key")
|
2019-10-20 11:27:03 +03:00
|
|
|
|
tcpmode := flag.Int("tcp", 0, "tcp mode")
|
2018-12-16 08:56:40 +03:00
|
|
|
|
flag.Usage = func() {
|
|
|
|
|
fmt.Printf(usage)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
flag.Parse()
|
|
|
|
|
|
2018-12-18 10:36:59 +03:00
|
|
|
|
if (*t != "client" && *t != "server") || (*t == "client" && (len(*listen) == 0 || len(*target) == 0 || len(*server) == 0)) {
|
2018-12-16 08:56:40 +03:00
|
|
|
|
flag.Usage()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-18 10:36:59 +03:00
|
|
|
|
fmt.Println("start...")
|
2019-01-08 05:32:26 +03:00
|
|
|
|
fmt.Printf("key %d\n", *key)
|
2018-12-16 08:56:40 +03:00
|
|
|
|
|
|
|
|
|
if *t == "server" {
|
2019-01-08 05:32:26 +03:00
|
|
|
|
s, err := pingtunnel.NewServer(*timeout, *key)
|
2018-12-16 08:56:40 +03:00
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Printf("ERROR: %s\n", err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
2018-12-18 06:39:16 +03:00
|
|
|
|
fmt.Printf("Server start\n")
|
2018-12-16 08:56:40 +03:00
|
|
|
|
s.Run()
|
|
|
|
|
}
|
|
|
|
|
if *t == "client" {
|
2018-12-18 10:36:59 +03:00
|
|
|
|
|
|
|
|
|
fmt.Printf("type %s\n", *t)
|
|
|
|
|
fmt.Printf("listen %s\n", *listen)
|
|
|
|
|
fmt.Printf("server %s\n", *server)
|
|
|
|
|
fmt.Printf("target %s\n", *target)
|
|
|
|
|
|
2019-10-19 17:36:17 +03:00
|
|
|
|
c, err := pingtunnel.NewClient(*listen, *server, *target, *timeout, *sproto, *rproto, *catch, *key,
|
|
|
|
|
*tcpmode)
|
2018-12-16 08:56:40 +03:00
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Printf("ERROR: %s\n", err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
2018-12-18 10:36:59 +03:00
|
|
|
|
fmt.Printf("Client Listen %s (%s) Server %s (%s) TargetPort %s:\n", c.Addr(), c.IPAddr(),
|
|
|
|
|
c.ServerAddr(), c.ServerIPAddr(), c.TargetAddr())
|
2018-12-17 10:21:15 +03:00
|
|
|
|
c.Run()
|
2018-12-16 08:56:40 +03:00
|
|
|
|
}
|
|
|
|
|
}
|