Socket Pipe can forward your socket from one address to anoter without any configs. It supports both tcp and udp, you can simplely make a
Install
npm install -g socket-pipe
Usage
Tcp socket forwarding
The following example shows how to map a remote address (ip=192.168.1.100 port=80) to a local address (ip=127.0.0.1 port=80) via tcp tunnel.socket-pipe -l 127.0.0.1@80 -r 192.168.1.100@80 -t tcp
Udp socket forwarding
The following example shows how to map a remote address (ip=8.8.8.8 port=53) to a local address (ip=127.0.0.1 port=53) via udp tunnel.socket-pipe -l 127.0.0.1@53 -r 8.8.8.8@53 -t udp
(在mac上先运行:sudo networksetup -setdnsservers "Wi-Fi" 127.0.0.1
然后运行:sudo
socket-pipe -l 127.0.0.1@53 -r 8.8.8.8@53 -t udp
这样,
socket-pipe就相当于是一个dns proxy了。
使用例子:
sudo wg-quick up wg0
sudo networksetup -setdnsservers "Wi-Fi" 127.0.0.1
sudo
socket-pipe -l 127.0.0.1@53 -r 8.8.8.8@53 -t udp)
from https://github.com/joyqi/socket-pipe
注意:这个
socket-pipe做成的
dns proxy 并未套上一层代理,所以其robust的程度不高,
没法跟
pingtunnel-by-esrrhs(https://briteming.blogspot.com/2019/10/pingtunnel-by-esrrhsdns.html)
相比。
------------------------------------------
纯手工自制的'内网穿透'瑞士军刀 Socket Pipe
- 需要做端口转发(udp or tcp)又懒得去配置复杂的iptables规则甚至还要用到nginx这种牛刀
- 需要把内网的某个监听端口反向穿透复杂的路由影射到一个固定的外网端口上(我知道有ngork,但是使用上限制较多而且还要收费不是吗)
- 你的茫茫多内网http服务需要在外网也能访问
对了,忘了说如何安装了,这款工具是基于node.js的,所以你要先有它的运行环境,然后直接用npm安装即可
npm install -g socket-pipe
端口转发
这个理解起来很简单,就是把源地址的某个端口映射到当前运行 socket-pipe 这台机器的指定端口上,相当于做了一个透明的网络代理。比如我要把192.168.1.100
的 80
端口映射到本地的 80
端口,那么直接运行socket-pipe -l 127.0.0.1@80 -r 192.168.1.100@80 -t tcp
它同时支持 tcp 和 udp 协议,只要把 -t
参数改成 udp
即可tcp 反向代理
这个在我们平时的开发需求中也很大,比如我们在内网已经开发好了一套网络服务,现在要放到公网上调试,以前你可能还要在公网上搭一套环境,然后运行程序,调试出错起来特别麻烦。而使用 socket-pipe 可以让公网的访问流量直接到达你的本机,并且不需要在路由器上做任何设置首先你需要一个拥有公网ip的服务器(在这里比如 ip 地址是
123.123.123.123
),安装好 socket-pipe 以后,假如我们要求外网访问它的 8888
端口那么socket-pipe -l 123.123.123.123@18888 -r 123.123.123.123@8888 -t tserver
注意这里的 -r
参数指定了能被任意访问的监听地址,而 -l
参数则指定了一个接受局域网里的服务器反向代理网络请求的地址,后面我们会用到这个地址然后我们在本地局域网的服务器上同样运行 socket-pipe,假如本地(
192.168.1.100
)要调试的这个网络服务端口是 7777
那么socket-pipe -l 192.168.1.100@7777 -r 123.123.123.123@18888 -t tclient
这样我们就把本地 192.168.1.100
的 7777
端口,完全透明地映射到远程 123.123.123.123
的 8888
端口上了。http 反向代理
可能你也注意到了,上面的 tcp 反向代理也可以用来代理 http 协议,因为其本身就是基于 tcp 的。确实是可以的,但是你如果只有一台服务器需要代理还好说,如果你有非常多的 http 服务需要暴露在公网上,你可能还要在公网服务器的 socket-pipe 前端加一台 nginx 之类的,把它的每个域名分配给每个连接上来的端口,然后还要启动茫茫多的 socket-pipe 进程来代理每台内网服务器,并且每次新增一台还要手动去改 nginx 配置。这显然成本太高,但
ngork
不就是解决这个问题的么。确实可以解决,但首先 ngork
网络流量不可控,涉及到一些敏感信息的会有泄密的可能,其次它速度比较慢,我们自己有更快的服务器为什么不能用自己的,最后,它的一些高级服务或者更多的数量需要收费。所以 socket-pipe 的最后这一个功能可以彻底干掉 ngork 了,它可以把无限多的内网 http 反向映射到外网去
同样我们先在外网服务器上运行,既然是代理 http 服务,那我们就直接监听
80
端口好了socket-pipe -l 123.123.123.123@10080 -r 123.123.123.123@80 -t hserver
同样我们指定了一个 10080
端口来接受反向代理请求。然后在局域网的服务器上socket-pipe -l 192.168.1.100@80 -r 123.123.123.123@10080 -t hclient -x git.dev.com -s git
在这里多了两个可选参数-x
这个参数可以将外网请求的Host
头转化为指定的地址,比如你在外网访问的域名是www.example.com
,到本地http服务器上的时候就被 socket-pipe 转换为了git.dev.com
。如果你不填这个参数,那么就不会转换任何地址-s
指定了一个外网访问的二级域名。因为我们上面说了,有一堆 http 都被映射到了同一台外网服务器上,那么如何区分并单独访问他们呢,就是二级域名。比如你把*.example.com
的泛域名全部解析到了123.123.123.123
上,那么通过-s git
参数,你访问git.example.com
这个地址,流量就会被转发到当前指定的地址上。如果这个参数不填,socket-pipe 会自动创建一个随机字符串作为二级域名,并且会输出告诉你。
写在最后
目前这个工具已经在我们内部使用了一段时间,使用起来还是非常舒爽的,还有几个小问题需要解决- udp的反向代理,虽然我没有这个需求,但我了解到有人需要这个
- 连接的稳定性,目前我们有心跳和自动重连机制,但是在某些情况下会失效,我正在处理这个问题.