使用SSH实现内网穿透

参考

  • QQ群 - Javascript高级爬虫 - 作者自建群,欢迎加入!
  • awesome-java-crawler - 作者收集的爬虫相关工具和资料
  • 一个帮你自动创建阿里云抢占式实例并开启网络加速的脚本 - 文章介绍了如何自动创建阿里云抢占式节点,可配合本文用于临时开发调试
  • Squid+SSH Tunnel实现加密代理 - 文章介绍了如何配置SSH免登录

前言

这两天又要做微信公众号开发,之前为了方便测试,用了内网穿透工具Ngrok,前一段调研加密代理时了解到SSH也可以做内网穿透,因此特意研究了一下具体流程,这里记录一下。

服务器配置

是的,虽然是内网穿透,但你需要一台有公网IP的服务器用来做转发,临时用的话,可以考虑用阿里的抢占式实例,具体请看上面的参考3

  • 首先需要确保服务器的映射端口是可以访问的。确保本机的防火墙里打开了该端口。如果是阿里云,那就要修改ECS实例的安全组添加规则。
  • 服务端的sshd后台服务默认是不允许远程主机连接本地的转发端口的,因此需要修改sshd配置文件:
    编辑/etc/ssh/sshd_config,找到GatewayPorts配置项,默认是注释起来的,取消注释,并把后面的值改成clientspecified
  • 重启sshd:systemctl restart sshd

客户端配置

  • 客户端需要有SSH。Windows 10里面已经自带了OpenSSH,可以直接使用,可以在命令行窗口里运行ssh验证一下
  • 如果客户端没有,可以用Cygwin安装,或者Windows版的Git等工具里也自带
  • 打开命令行窗口执行如下命令:
    ssh -CNRf 0.0.0.0:<远程映射端口>:localhost:<本地监听端口> root@<远程主机>

    1. 执行此命令后需要手动输入远程服务器上root用户的密码
    2. 注意这里的0.0.0.0不能省略,否则服务端的映射端口只允许本机访问
    3. <本地监听端口>就是内网主机的本地服务所监听的端口,比如80,用这个命令可以把公网服务器的<远程映射端口>监听到的请求转发到本地服务上
  • 如何断开内网映射:

    1. 简单点直接执行taskkill /im ssh.exe /f即可杀掉所有ssh进程
    2. 如果怕误杀,可以用wmic process where "name='ssh.exe'" get commandline,processid来查询所有的ssh.exe进程,根据启动命令行找到对应的进程号,然后用taskkill /pid <进程ID> /f来点杀进程
  • 通常杀掉内网机器上的ssh进程,也会自动结束服务器上对应的sshd进程,如果没有,则需要在服务器上手动清理

    1. 在服务器上执行netstat -antp | grep <远程映射端口>即可找到对应的sshd进程,然后用kill -9 点杀之

SSH免登录

请参见文首的参考4

你可能感兴趣的:(内网穿透,ngrok,ssh,微信公众号)