内网:家里或者公司的机器
公网:云服务器
外网:需要访问内网的机器
修改sshd配置/etc/ssh/sshd_config
GatewayPorts yes
除了开放sshd用的端口,还需要开放一个[公网服务器开放端口],用作转发数据
为了能够断开自动重连,安装autossh(ubuntu)
sudo apt-get install autossh
与公网服务器建立连接通道
autossh -M [内网任意未使用端口] -NR [公网服务器开放端口]:127.0.0.1:[本地sshd端口] [公网服务器用户名]@[公网ip]
//提示输入公网服务器密码
-M 后面的这个参数端口貌似用echo service做监听重连的,没太看明白
-N Do not execute a remote command. This is useful for just forwarding ports
-R Specifies that connections to the given TCP port or Unix socket on the remote (server) host are to be forwarded to the local side
这样配置好以后,外网连上的[公网服务器开放端口]的数据就会转发到内网的[本地sshd端口]
上面两部配置完成之后就可以远程ssh到内网了
ssh [内网用户名]@[公网ip] -p [公网服务器开放端口]
//提示输入内网服务器密码
使用ssh开启隧道代理:
ssh -nNTf -D [本地上网代理端口] [内网用户名]@[公网ip] -p [公网服务器开放端口]
同样,可以使用autossh断连之后自动重连。需要把-nNTf参数放到后面,否则会将-f误认为是autossh的参数,无法提示输入密码:
autossh -M 0 -D [本地上网代理端口] [内网用户名]@[公网ip] -p [公网服务器开放端口] -nNTf
有时候使用autossh也会断开,可以在/etc/ssh/config加上
ServerAliveInterval 60
那么就会每隔60s,就会发一次消息,确保在线。如果还想继续处理其他未知的情况,使用暴力不断重连的命令
while true; do [ssh链接命令]; sleep 5;done
这样就开启了socket5协议代理,将浏览器或应用的代理设置为sockets://127.0.0.1:[本地上网代理端口], 就可以成功穿透到内网了!
发现有时候不稳定的时候ssh老是断开导致公网的服务器转发端口有时候监听失败,看了下Frp配置也比较简单,目前看来比较稳定。
首先去Frp项目下载release软件,不同的操作系统都有包含,服务端和客户端都在一个包里面。
下载之后解压,配置服务端的配置文件 frps.ini
[common]
bind_port = {frp监听端口}
dashboard_port = {控制台端口,用作http协议访问}
dashboard_user = {控制台用户名}
dashboard_pwd = {控制台密码}
authentication_method = token
token = {用于frp客户端访问验证}
之后直接运行可执行文件frps即可
客户端配置文件frpc.ini:
[common]
server_addr = {frp服务端公网ip}
server_port = {frp服务端监听端口}
token= {frp服务端访问令牌}
[ssh-mac] {不同的客户端需要有不同的名字}
type = tcp
local_ip = 127.0.0.1
local_port = {sshd监听端口}
remote_port = {用于转发数据的端口}
use_encryption = true
use_compression = true
之后直接运行可执行文件frpc即可
上面两部配置好之后,就可以通过remote_port ssh到内网了,按照前面的命令配置ssh隧道代理!