内网穿透goproxy
概述
为了解决在各个局域网内暴露服务到稳定的主机上,方便其他内网调用
实现拓扑
通过内网穿透把内网服务暴露到稳定的服务器上,从而实现服务的互联
goproxy
docs
- https://snail007.host900.com/goproxy/manual/zh/#/
- https://snail007.host900.com/goproxy/manual/zh/#/?id=_4内网穿透
bridge/server(服务暴露在稳定的主机上)
cd /servyou/proxy-linux-amd64/
./start_proxy.sh 20001 10001 80
解释:
./start_proxy.sh bridge_port server_port local_port
bridge_port 是提供中转的服务端口
server_port 是本地提供服务端口在内网机上映射的端口
local_port 是本地机器提供服务的端口
start_proxy.sh
#!/bin/sh
set -e
## var
bridge_port=${1}
server_port=${2}
local_port=${3}
## judge
if [[ -z $1 || -z $2 || -z $3 ]]; then
echo "bridge $1,server $2, local $3 not allow nil!!!"
echo "+++++++++++++++++++++++++++++++++++++++++++++"
echo "used: $0 bridge_port server_port local_port"
exit 8
fi
## port
if ss -lnt |grep $1 &>/dev/null ; then
echo "bridge_port $1 端口被占用"
exit 9
fi
if ss -lnt |grep $2 &>/dev/null; then
echo "server_port $2 端口被占用"
exit 9
fi
## statr server/bridge
#bridge
nohup ./proxy bridge -p ":${1}" -C .cert/proxy.crt -K .cert/proxy.key &>logs/bridge_${1} &
echo $! >pids/pid_bridge_${1}
#server
nohup ./proxy server -r ":${2}@:${3}" -P "127.0.0.1:${1}" -C .cert/proxy.crt -K .cert/proxy.key &>logs/server_${1} &
echo $! >pids/pid_server_${2}
client(局域网)
./proxy.exe client -P "10.199.x.y:20001" -C .cert/proxy.crt -K .cert/proxy.key
解释:
./proxy.exe client -P "10.199.x.y:20001" -C .cert/proxy.crt -K .cert/proxy.key
-P bridge_server:bridge_port
http://10.199.x.y:10001/xxx
goproxy(内网穿透)
内网穿透由三部分组成:client端,server端,bridge端;client和server主动连接bridge端进行桥接。
//TCP普通用法
背景:
公司机器A提供了web服务80端口
有VPS一个,公网IP:22.22.22.22
需求:
在家里能够通过访问VPS的28080端口访问到公司机器A的80端口
步骤:
在vps上执行
proxy bridge -p ":33080" -C proxy.crt -K proxy.key
proxy server -r ":28080@:80" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key
在公司机器A上面执行
proxy client -P "22.22.22.22:33080" -C proxy.crt -K proxy.key
//UDP普通用法
背景:
公司机器A提供了DNS解析服务,UDP:53端口
有VPS一个,公网IP:22.22.22.22
需求:
在家里能够通过设置本地dns为22.22.22.22,使用公司机器A进行域名解析服务。
步骤:
在vps上执行
proxy bridge -p ":33080" -C proxy.crt -K proxy.key
proxy server --udp -r ":53@:53" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key
在公司机器A上面执行
proxy client -P "22.22.22.22:33080" -C proxy.crt -K proxy.key
完成
//高级用法一
背景:
公司机器A提供了web服务80端口
有VPS一个,公网IP:22.22.22.22
需求:
为了安全,不想在VPS上能够访问到公司机器A,在家里能够通过访问本机的28080端口,
通过加密隧道访问到公司机器A的80端口。
步骤:
在vps上执行
proxy bridge -p ":33080" -C proxy.crt -K proxy.key
在公司机器A上面执行
proxy client -P "22.22.22.22:33080" -C proxy.crt -K proxy.key
在家里电脑上执行
proxy server -r ":28080@:80" -P "22.22.22.22:33080" -C proxy.crt -K proxy.key
//高级用法二
提示:
如果同时有多个client连接到同一个bridge,需要指定不同的key,可以通过--k参数设定,--k可以是任意唯一字符串,
只要在同一个bridge上唯一即可。
server连接到bridge的时候,如果同时有多个client连接到同一个bridge,需要使用--k参数选择client。
暴露多个端口重复-r参数即可.-r格式是:"本地IP:本地端口@clientHOST:client端口"。
背景:
公司机器A提供了web服务80端口,ftp服务21端口
有VPS一个,公网IP:22.22.22.22
需求:
在家里能够通过访问VPS的28080端口访问到公司机器A的80端口
在家里能够通过访问VPS的29090端口访问到公司机器A的21端口
步骤:
在vps上执行
proxy bridge -p ":33080" -C proxy.crt -K proxy.key
proxy server -r ":28080@:80" -r ":29090@:21" --k test -P "127.0.0.1:33080" -C proxy.crt -K proxy.key
在公司机器A上面执行
proxy client --k test -P "22.22.22.22:33080" -C proxy.crt -K proxy.key
//server的-r参数
-r完整格式是:PROTOCOL://LOCAL_IP:LOCAL_PORT@[CLIENT_KEY]CLIENT_LOCAL_HOST:CLIENT_LOCAL_PORT
//协议PROTOCOL:tcp、udp、ptcp、pudp。
比如: -r "udp://:10053@:53" -r "tcp://:10800@:1080" -r ":8080@:80"
如果指定了--udp参数,PROTOCOL默认为udp,那么:-r ":8080@:80"默认为udp;
如果没有指定--udp参数,PROTOCOL默认为tcp,那么:-r ":8080@:80"默认为tcp;
//CLIENT_KEY:默认是default。
比如: -r "udp://:10053@[test1]:53" -r "tcp://:10800@[test2]:1080" -r ":8080@:80"
如果指定了--k参数,比如--k test,那么:-r ":8080@:80"CLIENT_KEY默认为test;
如果没有指定--k参数,那么:-r ":8080@:80"CLIENT_KEY默认为default;
//LOCAL_IP为空默认是:0.0.0.0,CLIENT_LOCAL_HOST为空默认是:127.0.0.1