diff --git a/README.en.md b/README.en.md index 7a6302a..87475dd 100644 --- a/README.en.md +++ b/README.en.md @@ -3,6 +3,8 @@ I want to play games with my friends online, and I need to connect to the compan This application can establish tcp and udp tunnels to map local or remote application ports. It does not require a public network. If the two nodes cannot be directly connected, there will be other nodes for relay forwarding, data end-to-end encryption, and relay node Unable to view data. +The underlying transmission can be implemented using quic, tcp, package websocket, and webtransport, using the noise protocol to encrypt the transmission, with its own nat, which can be used in multi-layer combinations. + ## working principle Computer a opens the application and maps a port, computer b opens the application, connects to computer a, and the port of computer a is mapped to the port 127.0.89.1 of this machine. diff --git a/README.md b/README.md index adf5e97..bddf467 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ 本应用可以建立tcp、udp隧道,把本地或者远程应用端口映射出来,不要求有公网,如果双方节点无法进行直连,会有其它节点进行中继转发,数据端对端加密,中继节点无法查看数据。 +底层传输可以使用quic、tcp、package websocket、webtransport实现,使用 noise 协议加密传输,自带nat,可以多层组合使用。 + ## 工作原理 电脑a打开本应用,把一个端口映射出来,电脑b打开本应用,连接电脑a,电脑a的端口映射到本机的127.0.89.1端口下。 @@ -16,6 +18,27 @@ 先下载对于平台的压缩包,解压,然后打开本机的远程桌面。 +### 参数说明 + +| 字段 | 类型 | 说明 | +| ---- | ---- |---- | +|l | ip端口 |转发的本地端口| +|id | multiaddr格式的 | 连接远程服务id| +|p2p_port|ip端口 |p2p使用的端口,也是监听其它节点连接的端口,默认4001,会自动进行nat,但是可能需要您进行端口映射| +|type|网络类型|tcp或者udp| + +### id格式(multiaddr) +| 类型 | 样例|说明 | +| ---- | ---- |---- | +|12D3KooWLHjy7D | 纯id| 只知道id,不知道协议、ip这些 | +|/p2p/12D3KooWLHjy7D|纯id | 只知道id,不知道协议、ip这些| +|/ip4/1.1.1.1/tcp/4001/p2p/12D3KooWLHjy7D| 详细路径|知道ip、协议,使用的tcp | +|/ip4/1.1.1.1/udp/4001/quic-v1/p2p/12D3KooWLHjy7D| 详细路径|知道ip、协议,使用的quic | + +节点启动的时候会输出相应的地址,把里面的 ip 修改成公网ip即可。 + +可以通过路径里面的tcp、quic控制连接行为。 + ### 打开本地端口 ./p2ptunnel -type tcp -l 3389 diff --git a/go.mod b/go.mod index 68234ae..38a7829 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ require ( github.com/libp2p/go-libp2p v0.27.1 //github.com/libp2p/go-libp2p-connmgr v0.4.0 github.com/libp2p/go-libp2p-kad-dht v0.23.0 - github.com/pion/udp/v2 v2.0.1 github.com/sparkymat/appdir v0.0.0-20190803090504-1c2ab64aee87 ) diff --git a/go.sum b/go.sum index a339cf2..25cb284 100644 --- a/go.sum +++ b/go.sum @@ -316,13 +316,11 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/transport/v2 v2.0.0 h1:bsMYyqHCbkvHwj+eNCFBuxtlKndKfyGI2vaQmM3fIE4= github.com/pion/transport/v2 v2.0.0/go.mod h1:HS2MEBJTwD+1ZI2eSXSvHJx/HnzQqRy2/LXxt6eVMHc= github.com/pion/transport/v2 v2.0.2 h1:St+8o+1PEzPT51O9bv+tH/KYYLMNR5Vwm5Z3Qkjsywg= github.com/pion/transport/v2 v2.0.2/go.mod h1:vrz6bUbFr/cjdwbnxq8OdDDzHf7JJfGsIRkxfpZoTA0= github.com/pion/udp v0.1.4 h1:OowsTmu1Od3sD6i3fQUJxJn2fEvJO6L1TidgadtbTI8= github.com/pion/udp v0.1.4/go.mod h1:G8LDo56HsFwC24LIcnT4YIDU5qcB6NepqqjP0keL2us= -github.com/pion/udp/v2 v2.0.1/go.mod h1:B7uvTMP00lzWdyMr/1PVZXtV3wpPIxBRd4Wl6AksXn8= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/main.go b/main.go index 4d634db..9fb1ad1 100644 --- a/main.go +++ b/main.go @@ -17,7 +17,7 @@ var ( ) var ( - version = "0.0.7" + version = "0.0.8" gitRev = "" buildTime = "" ) @@ -32,12 +32,13 @@ func main() { port := flag.Uint("l", 12000, "listen port") ip := flag.String("ip", "127.0.0.1", "forwarder to ip or listen ip") id := flag.String("id", "", "Destination multiaddr id string") + p2p_port := flag.Int("p2p_port", 4001, "p2p use port") networkType := flag.String("type", "tcp", "network type tcp/udp") flag.Parse() var err error - fwr, fwrCancel, err = p2pforwarder.NewForwarder() + fwr, fwrCancel, err = p2pforwarder.NewForwarder(*p2p_port) if err != nil { log.Panicln(err) } diff --git a/p2pforwarder/forwarder.go b/p2pforwarder/forwarder.go index ca2cf7e..2988f71 100644 --- a/p2pforwarder/forwarder.go +++ b/p2pforwarder/forwarder.go @@ -2,7 +2,7 @@ package p2pforwarder import ( "context" - "github.com/libp2p/go-libp2p/core/network" + "fmt" "io/ioutil" "log" "os" @@ -10,6 +10,8 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/routing" routing2 "github.com/libp2p/go-libp2p/p2p/discovery/routing" "github.com/libp2p/go-libp2p/p2p/net/connmgr" @@ -63,7 +65,7 @@ func newOpenPortsStore() *openPortsStore { } // NewForwarder - instances Forwarder and connects it to libp2p network -func NewForwarder() (*Forwarder, context.CancelFunc, error) { +func NewForwarder(p2p_port int) (*Forwarder, context.CancelFunc, error) { priv, err := loadUserPrivKey() if err != nil { return nil, nil, err @@ -71,12 +73,16 @@ func NewForwarder() (*Forwarder, context.CancelFunc, error) { ctx, cancel := context.WithCancel(context.Background()) - h, err := createLibp2pHost(ctx, priv) + h, err := createLibp2pHost(ctx, priv, p2p_port) if err != nil { cancel() return nil, nil, err } + for _, value := range h.Addrs() { + fmt.Println("multiaddr:" + value.String()) + } + f := &Forwarder{ host: h, @@ -154,29 +160,29 @@ func loadUserPrivKey() (priv crypto.PrivKey, err error) { const Protocol = "/p2ptunnel/0.1" -func createLibp2pHost(ctx context.Context, priv crypto.PrivKey) (host.Host, error) { +func createLibp2pHost(ctx context.Context, priv crypto.PrivKey, p2p_port int) (host.Host, error) { var d *dht.IpfsDHT connmgr, _ := connmgr.NewConnManager( - 100, // Lowwater - 400, // HighWater, + 10, // Lowwater + 100, // HighWater, connmgr.WithGracePeriod(time.Minute), ) var h, err = libp2p.New( libp2p.Identity(priv), libp2p.ListenAddrStrings( - "/ip4/0.0.0.0/udp/0/quic", - "/ip6/::/udp/0/quic", + fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", p2p_port), + fmt.Sprintf("/ip6/::/tcp/%d", p2p_port), - "/ip4/0.0.0.0/tcp/0", - "/ip6/::/tcp/0", + fmt.Sprintf("/ip4/0.0.0.0/tcp/%d/ws", p2p_port), + fmt.Sprintf("/ip6/::/tcp/%d/ws", p2p_port), - "/ip4/0.0.0.0/tcp/0/ws", - "/ip6/::/tcp/0/ws", + fmt.Sprintf("/ip4/0.0.0.0/udp/%d/quic-v1", p2p_port), + fmt.Sprintf("/ip6/::/udp/%d/quic-v1", p2p_port), - "/ip4/0.0.0.0/udp/0/quic/webtransport", - "/ip6/::/udp/0/quic/webtransport", + fmt.Sprintf("/ip4/0.0.0.0/udp/%d/quic-v1/webtransport", p2p_port), + fmt.Sprintf("/ip6/::/udp/%d/quic-v1/webtransport", p2p_port), ), libp2p.DefaultTransports,