一、前言
网络上有很多强大的内网穿透软件,但对于某些很简单的需求来说可以通过SSH来实现更为方便。
二、配置
配置思路:在 A 机器上做到 B 机器的反向代理;在 B 机器上做正向代理本地端口转发。
主机编号 | IP地址 | 用户名 | 备注 |
---|---|---|---|
A | A.A.A.A | usera | 客户端 |
B | B.B.B.B | userb | 服务器 |
- 建立客户端A到服务器B的反向代理(在客户端A上操作) ``` ssh -CNR 8081:localhost:80 userb@B.B.B.B
8081为服务器B端口,用来与客户端A的80端口绑定。
可通过 -f 参数实现后台运行
1. <br />到这里客户端A的80端口已经映射到服务器B的8081端口,可以在通过服务器B的8080端口访问客户端A的80端口,但注意只支持服务器B本地访问。
1. 建立服务器B上的正向代理用作本地转发(在服务器B上操作)<br />
因为绑定后的端口只支持服务器B本地访问,所以我们需要把已经映射的端口转发出去。
ssh -CNL “*:8080:localhost:8081’ localhost
8080为本地转发端口,将数据转发到先前已经映射的8081端口,实现外网访问。
其中的*表示接受来自任意机器的访问。
可通过 -f 参数实现后台运行
2. <br />现在可以通过服务器B的8080端口访问到客户端A的80端口。
2. 实现持久化连接和无密码登陆<br />
我们配置完代理后可以正常使用了,但不幸的是这种ssh反向连接会因为超时而关闭,如果关闭了那从外网连通内网的通道就无法维持了,为此我们需要另外的方法来提供稳定的ssh反向代理隧道。
- 无密码登陆<br />
a.通过设置KEY登陆(操作略)<br />
b.使用sshpass命令(需安装):<br />
`sshpass -p "ssh密码" ssh -CNR 8081:localhost:80 userb@B.B.B.B`<br />
c.使用plink工具连接(windows):<br />
`plink.exe -pw "ssh密码" ssh -CNR 8081:localhost:80 userb@B.B.B.B`
- 用autossh(需安装)建立稳定隧道<br />
autossh的参数与ssh的参数是一致的,但是不同的是在隧道断开的时候,autossh会自动重新连接而ssh不会;另外不同的是 `-M` 参数,该参数指定一个端口用于外网的主机用来接收内网主机的信息,若隧道不正常则返回给内网主机重新连接。
autossh -M 5678 -f -CNR 8081:localhost:80 userb@B.B.B.B
参数 -f 为后台运行
- <br />可使用sshpass与autossh组合使用:
sshpass -p “ssh密码” autossh -M 5678 -CNR 8081:localhost:80 userb@B.B.B.B
- <br />注:使用sshpass,那么autossh不能加-f参数,因为sshpass需要autossh在前台请求密码才能实现输入(这点和expect差不多),而加上-f参数放后台后会无效,所以若要使用sshpass请务必不要加-f参数,建议使用autossh然后配合-i参数使用用key认证登陆。 最后可以把命令加入开机启动项实现开机启动。
4. 附 SSH命令参数说明
-f 后台运行 -C 允许压缩数据 -N 不执行任何命令 -R 将端口绑定到远程服务器,反向代理 -L 将端口绑定到本地客户端,正向代理 ```