SSH隧道打洞访问内网机器

1 实验环境

  • 内网机器A:192.168.55.114,用户是userA/passwordA,本地SSH端口是23,机器名称domainA
  • 公网可以访问的机器G: 11.66.99.100,已有用户userG/passwordG,ssh端口是22

2 环境配置

为了预防SSH通道一段时间没有操作或者网络抖动自动断开,进行如下2.1和2.2的配置。

2.1 Server(G)配置

$ sudo vim /etc/ssh/sshd_config

修改三个参数:

TCPKeepAlive=yes
ClientAliveInterval 15             #服务端主动向客户端请求响应的间隔
ClientAliveCountMax 1000    #服务器发出请求后客户端没有响应的次数达到一定值就自动断开
$ sudo service sshd restart

2.2 Client(A)配置

$ sudo vi /etc/ssh/ssh_config

修改以下3个参数:

TCPKeepAlive=yes
ServerAliveInterval 30                #客户端主动向服务端请求响应的间隔
ServerAliveCountMax 1000       #客户端发出请求后服务端没有响应的次数达到一定值就自动断开

以上三个参数均可以在SSH命令行中通过-o {option-key}={option-value}进行指定。

3 建立SSH隧道

在机器A上执行以下模式的SSH命令:
sudo ssh -N -f -R{global-tunnel-port}:{local-host}:{local-ssh-port} {global-user}@{global-host} -p{global-ssh-port} -o {ssh-option-name}={value}

  • -f,运行后台
  • -N,不要执行远程命令。对于仅用于防护的端口非常有用。
    示例:
$ sudo ssh -N -f -R8888:192.168.55.114:23 userG@11.66.99.100 -p22 -o ServerAliveInterval=60`
The authenticity of host '[11.66.99.100]:22 ([11.66.99.100]:22)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[11.66.99.100]:22' (ECDSA) to the list of known hosts.
userG@11.66.99.100's password: #enter password passwordG, and press Enter

4 从服务器G访问内网机器A

登录公网机器G,打开Terminal。

$ sudo ssh -p 8888 userA@127.0.0.1
# 相关连接指纹信息确认输入 yes
userA@127.0.0.1's password: # enter password passwordA, and press Enter to login machine A.
userA@domainA:~$ 

5 常见问题解决

5.1 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED

  • 现象描述
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
...
ECDSA host key for [127.0.0.1]:8888 has changed and you have requested strict checking.
Host key verification failed.
  • 原因分析
    OpenSSH会把每个访问过的计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告。
    该错误原因是本地的SSH协议信息失效了。SSH连接相同的ip:port时因有连接记录直接使用失效的协议信息去验证该服务器(ip:port),所以会报错。

  • 解决方法
    清除known_hosts里旧缓存公钥信息。

$ sudo ssh-keygen -R [127.0.0.1]:8888

以上命令会将~/.ssh/known_hosts中所有[127.0.0.1]:8888开头的公钥缓存信息进行清除。

【参考】
用 SSH 命令打洞
ssh反向隧道实现内网穿透
实用操作:SSH内网穿透
内网渗透-老鼠打洞之SSH隧道
SSH连接总是定期断掉的解决办法
host key for (ip地址) has changed and you have requested strict checking

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容