正向代理
ssh -fCNL
反向代理
ssh -fCNR
参数含义
-f 后台执行
-C 允许数据压缩
-N 不执行远程执行
-R 将远程主机的端口转发到本地机器的端口
-L 将本地机器的端口转发到远程主机的端口
-p 指定要连接的远程主机端口
A: 本地机器,可访问代理机器B
B: 代理机器,可访问远程数据库C
C: 远程数据库,限制由代理机器B访问
ssh -fCNL <portA>:<hostC>:<portC> userB@hostB
mysql -h 127.0.0.1 -P <portA> -u <dbUser> -p # NOTE: 这里的127.0.0.1一般不能用localhost代替
portA: 本地未占用的某个端口
hostC: C服务器IP或域名
portC: C服务器数据库端口
userB: B服务器用户
hostB: B服务器IP或域名
如果C是一台内网的服务器,只能由B访问,可通过将本地端口通过B映射到C的ssh端口(22或其他)建立ssh隧道
ssh -fCNL <portA>:<hostC>:22 user@hostB
ssh -p <portA> localhost # 从A登录C(localhost和127.0.0.1均可)
scp -P <portA> <fileA> localhost:<pathC> # 拷贝本地文件到C
A: 局域网内的机器,可访问公网,但没绑定公网IP
B: 公网机器
在局域网机器A上面安装并运行ssh-server服务(如openssh-server),然后执行
ssh -fCNR <portB>:localhost:22 <userB>@<hostB>
公网机器B上执行
ssh <userA>@localhost -p <portB>
即可连接到内网机器A
在完成公网跳转配置的基础上,在公网机器B上面执行
ssh -fgNL <portBB>:localhost:<portB> localhost
将<portBB>
端口映射到B本地的<portB>
端口,即代理局域网机器A的反向隧道端口。
接下来就可以直接在任意一台公网机器C上执行
ssh <userB>@<hostB> -p <portBB>
就可以直接登录到内网机器A
在公网跳转设置环节,将命令
ssh -fCNR <portB>:localhost:22 <userB>@<hostB> -p22
修改为
autossh -M <portA> -fCNR <portB>:localhost:22 <userB>@<hostB>
即可, 上面的是autossh
的监视进程,当通道端口时,会自动执行重连
将上述autossh
命令daemon加入内网机器的系统启动项。
脚本的写法有两种,一是 类似ssh,通过autossh指定用户.ssh的路径,二是以用户的方式执行daemon。
方式二脚本如下:
/bin/su -c '/usr/bin/autossh -M <portA> -fCNR <portB>:localhost:22 <userB>@<hostB>' - userA
将脚本autossh.sh
放入/etc/init.d/
,执行
sudo chmod +x /etc/init.d/autossh.sh
sudo update-rc.d autossh.sh defaults
完成自启动服务的添加