pingtunnel/cmd/main.go
2018-12-22 18:20:58 +08:00

89 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"flag"
"fmt"
"github.com/esrrhs/pingtunnel"
)
var usage = `
通过伪造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.
Usage:
pingtunnel -type server
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
-timeout 本地记录连接超时的时间单位是秒默认60s
The time when the local record connection timed out, in seconds, 60 seconds by default
-sproto 客户端发送ping协议的协议默认是8
The protocol that the client sends the ping. The default is 8.
-rproto 客户端接收ping协议的协议默认是0
The protocol that the client receives the ping. The default is 0.
`
func main() {
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")
sproto := flag.Int("sproto", 8, "send ping proto")
rproto := flag.Int("rproto", 0, "recv ping proto")
flag.Usage = func() {
fmt.Printf(usage)
}
flag.Parse()
if (*t != "client" && *t != "server") || (*t == "client" && (len(*listen) == 0 || len(*target) == 0 || len(*server) == 0)) {
flag.Usage()
return
}
fmt.Println("start...")
if *t == "server" {
s, err := pingtunnel.NewServer(*timeout)
if err != nil {
fmt.Printf("ERROR: %s\n", err.Error())
return
}
fmt.Printf("Server start\n")
s.Run()
}
if *t == "client" {
fmt.Printf("type %s\n", *t)
fmt.Printf("listen %s\n", *listen)
fmt.Printf("server %s\n", *server)
fmt.Printf("target %s\n", *target)
c, err := pingtunnel.NewClient(*listen, *server, *target, *timeout, *sproto, *rproto)
if err != nil {
fmt.Printf("ERROR: %s\n", err.Error())
return
}
fmt.Printf("Client Listen %s (%s) Server %s (%s) TargetPort %s:\n", c.Addr(), c.IPAddr(),
c.ServerAddr(), c.ServerIPAddr(), c.TargetAddr())
c.Run()
}
}