支持自定义p2p端口
降低默认连接节点数
This commit is contained in:
chenjia404 2023-05-02 17:24:01 +08:00
parent 805a17130a
commit 0861d112d8
6 changed files with 48 additions and 19 deletions

View File

@ -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.

View File

@ -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

1
go.mod
View File

@ -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
)

2
go.sum
View File

@ -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=

View File

@ -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)
}

View File

@ -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,