利用ssh反向隧道实现内网穿透远程控制

1.环境介绍
局域网客户端A-192.168.40.24
广域网服务器B-172.10.12.88
2.安装autossh(客户端A上操作)

yum install autossh

#使用autossh必须使用客户端A必须使用key认证登录方式
3.配置免密登录(客户端A上操作)

ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@172.10.12.88

# ssh-keygen -t rsa 一直回车,生成私钥和公钥
# ssh-copy-id -i .ssh/id_rsa.pub root@172.10.12.88 复制公钥到hostB的/root/.ssh/authorized_keys中
4.增加远程支持(在服务器B上操作)
4.1方案一:建立服务器B上的正向代理用作本地转发

ssh -fCNL *:3333:localhost:2222 localhost

# 因为绑定后的端口只支持服务器B本地访问,所以我们需要把已经映射的端口转发出去
# 3333为本地转发端口,将数据转发到先前已经映射的2222端口,实现外网访问
# 其中的*表示接受来自任意机器的访问
4.2方案二:修改sshd_config

vi /etc/ssh/sshd_config
GatewayPorts yes

这样可以把监听的端口绑定到任意IP 0.0.0.0上,否则只有本机 127.0.0.1 可以访问
然后重启 sshd 服务:

service sshd restart

5.建立客户端A到服务器B的反向代理(客户端A上操作)

autossh -M 5678 -f -CNR 2222:localhost:22 root@172.10.12.88 -o TCPKeepAlive=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3
# 客户端A的22端口已经映射到服务器B的2222端口,可以在通过服务器B的2222端口访问客户端A的22端口,若不执行步骤4操作默认只支持服务器B本地访问
# TCPKeepAlive设置为yes(默认值)则会周期性地检查连接是否存活,当客户端崩溃或者由于其他原因导致连接死掉,那么该项检查会让ssh或scp连接断开
# ServerAliveInterval是指客户端A每隔60秒发送一次请求给server,避免被踢
# ServerAliveCountMax是指发出请求后,server没有响应次数达到3,就自动断开连接,一般server会响应

6.验证
6.1方案一
现在可以通过服务器B的3333端口访问到客户端A的22端口
ssh连接服务器B的3333端口即可:

ssh root@172.10.12.88 3333

6.2方案二
现在可以通过服务器B的2222端口访问到客户端A的22端口
ssh连接服务器B的2222端口即可:

ssh root@172.10.12.88 2222

7.设置开启启动

vi /etc/rc.d/rc.local #增加:
autossh -M 5678 -f -CNR 2222:localhost:22 root@172.10.12.88
#centos7之后,默认rc.local无执行权限需手动增加x权限:
chmod +x /etc/rc.d/rc.local

8.附SSH命令参数说明
-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口
-M 监听隧道状态的端口,若隧道不正常,告诉内网机器重连

参考:
https://www.cnblogs.com/nashiyue/p/5233782.html
https://cuiqingcai.com/5876.html