Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lubyruffy/tcptunnel
将本地内网服务器映射到公网。
https://github.com/lubyruffy/tcptunnel
debug frp go nat ngrok proxy reverse-proxy security tunnel
Last synced: 3 months ago
JSON representation
将本地内网服务器映射到公网。
- Host: GitHub
- URL: https://github.com/lubyruffy/tcptunnel
- Owner: LubyRuffy
- Created: 2018-01-13T06:19:02.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2018-03-18T05:38:10.000Z (over 6 years ago)
- Last Synced: 2024-07-31T13:15:02.270Z (3 months ago)
- Topics: debug, frp, go, nat, ngrok, proxy, reverse-proxy, security, tunnel
- Language: Go
- Homepage:
- Size: 89.8 KB
- Stars: 86
- Watchers: 10
- Forks: 25
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: HISTORY.md
Awesome Lists containing this project
- awesome-network-stuff - **68**星
README
# 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
```