GithubHelp home page GithubHelp logo

tcptunnel's Introduction

tcptunnel

用于两种场景:

  1. 直接的端口转发,这个好理解
  2. 做内网服务器到公网的映射访问,用于解决内网服务器没有公网IP或者无法进行端口映射的场景

想要完成ngrok和lcx等类似的功能,对于lcx定义的slave啊,listen啊,tran啊我觉得很大歧义,半天理解不了。所以我发明了三个简单易懂的连接方式:

  • 公网服务器: publicserver,用于做转发的,监听一个对外开放的端口就行(对,我这里只要一个端口就行)
  • 内网服务器:natserver,也就是实际希望被外网访问的局域网服务器(或者是局域网代理)
  • 客户端:client,连接客户端,这个很好理解,实际的访问者,本地启动后,通过其他客户端连接本地监听的端口就相当于访问内网服务器

是不是更容易理解?是的话直接夸我。

注意:没有经过大量实际测试,请谨慎用于生产环境。

编译

由于用到了1.9才有的sync.Map, 所以编译环境必须是1.9+,见谅见谅 ;)

git clone https://github.com/LubyRuffy/tcptunnel
go get
go build

生成tcptunnel文件

跨平台编译,比如到NAS服务器或者树莓派等ARM平台,执行:

GOOS=linux GOARCH=arm GOARM=5 go build

运行

直接执行是读取config.toml配置文件中的内容,最主要的是Mode和对应的配置内容,后续在配置文件中说明。

./tcptunnel 

作为内网映射运行:

  • 作为publciserver执行,放到公网服务器
./tcptunnel -m publicserver
  • 作为natserver执行,放到内网的服务器
./tcptunnel -m natserver
  • 作为client执行,放到需要访问内网服务器的客户端
./tcptunnel -m client

然后连接本地端口就相当于连接natserver里面对应的服务器了

natserver 和 client 通信是通过约定好一致的唯一ID来进行。

作为tcpproxy执行,也就是端口转发

./tcptunnel -m tcpproxy

配置文件说明

默认读取config.toml文件,

# 模式: 支持publicserver,natserver,client,tcpproxy。可以通过命令行的-m参数覆盖
Mode = "publicserver"

# 连接公网服务器的地址,格式为 host:port
# 在Mode为 natserver 和 clientconnect 时有效
PublicServerAddr = "127.0.0.1:10011"

# 端口转发模式,仅仅在Mode为 tcpproxy 时有效
[TcpProxies]
    # 数组,可以多个映射关系
    [TcpProxies.proxy80]
    LocalBindAddr = "127.0.0.1:1234"
    RemoteServerAddr = "192.168.1.1:80"
    Type = "http"

    [TcpProxies.proxy22]
    LocalBindAddr = "127.0.0.1:1235"
    RemoteServerAddr = "192.168.1.1:22"

# 公网服务器监听的地址,仅仅在Mode为 publicserver 时有效,格式为 ip:port
[PublicServer]
LocalBindAddr = "127.0.0.1:10011"

# 端口转发模式,仅仅在Mode为 natserver 时有效
[NatServer]
    # 数组,可以多个映射关系,ID用于注册,客户端连接的时候直接通过ID来进行查找
    [NatServer.test]
    RemoteServerAddr = "192.168.1.1:80"
    ID = "test"
    Type = "http"

    [NatServer.test1]
    RemoteServerAddr = "192.168.1.1:22"
    ID = "test1"
    
# 端口转发模式,仅仅在Mode为 client 时有效
[ClientConnect]
    # 数组,可以多个映射关系,ID用于标示连接时指定NAT后的服务器对象
    [ClientConnect.test]
    LocalBindAddr = "127.0.0.1:1234"
    ID = "test"

流程说明

natserver    REGISTER   -> publicserver
                           publicserver <- CONNECT client <- application tcp connect
natserver NEWDATASTREAM <- publicserver
natserver   DATASTREAM  -> publicserver
                           publicserver -> 200 OK client <-> application tcp connect

tcptunnel's People

Contributors

lubyruffy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tcptunnel's Issues

相同ID出现的踢掉的问题

如果A注册了一个ID,这时候B注册了同一个ID,那么B会把A给踢掉。导致客户端连接不上。

提出几个改进需求:
1,如果已经存在了ID,要提示不能注册的报错信息
2,如果一个注册通道断开连接,注册的ID要释放

http有问题

ssh可以长期运行,连接http好像不行,请求前几个文件可以,后续的就全部超时了。

ID不存在也不报错

至少需要给一个提示,让client知道ID不存在(可能是暂时natserver掉线了,也有可能是id错误了)

跟我想的一样,不过配置复杂了

因为ngrok的外网监听端口是随机端口, 我需要的固定的端口的内网穿透, 需求并不复杂, 打算自己写一个, 自己写了个小demo, 然后想到会不会有人已经开发过了呢, 一搜果然有一堆, 您这个跟我的想法几乎一样, 连项目名称都一样,哈哈。。。不过配置略复杂啊, 还是通过命令行参数简单配置就能快速启动比较好。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.