内网穿透 (1) — ssh 反向代理

0 说在前面

因为各种各样奇怪的问题,各大公司学校,甚至一个家庭,都会有一个局域网,在学校和公司内部,甚至还会出现局域网套局域网的情况(毕竟一个路由器就可以组网了) ,形成一个树状结构,底层级的可以访问高层级,高层级却无法直接访问低层级

这个时候有两种解决方式

  • 端口转发
  • 内网穿透

端口转发需要硬件支持,而且一个端口最多只能整一台机子……(除非你的交换机支持多个IP你还会配置)

今天我们就来讲讲内网穿透最基础的实现方法 —— ssh 反向嗲里

1 关于ssh

说起ssh 并不是一个陌生的话题,在大多数时候,我们都会通过ssh远程控制服务器,以使用命令行,即使是内部的服务器也一样

ssh是一种加密的网络传输协议,在一定程度上避免了明文传输会带来的一系列分限

Warning: ssh 加密算法已经有能力被刺探及干扰,甚至有概率被破解,读取原文

2 故事背景

先让我们假设一个背景

现在有 3 台机子,网络访问情况如下:

  • A 位于 a 局域网内
  • B 位于 a b 两个局域网内
  • C 位于 b 局域网内

我们现在想让C能够访问A

我们将以B机作为代理机器,使C通过B访问A

3 ssh 的反向代理

ssh -R port:host:hostport

将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口

我们可以这样理解:

  • port 为 B 机上用于反代的端口
  • host 为被代理的IP地址(A 机器 IP 地址 )
  • hostport 为 A 机器将要被代理的端口

反向代理需要 A 机器主动连接 B 机器,并需要以 root 身份登陆 B 机器

4 访问

如果是 A 网页需要在 C 上面可以访问,我们可以通过 Apache2 Nginx 等将上文的port 在转发到 80 / 443等端口上,不需要 C 可以通过 ssh 直接连接 B 来 访问 A

可以通过 ssh 密钥简化过程

如果出现因超时而自动断开的问题,可以在/etc/ssh/sshd_config 尾部加入以下命令

ClientAliveInterval 30 # B 每隔30秒发送一次请求给 A,然后 A 响应,从而保持连接
ClientAliveCountMax 3 #B 发出请求后,A 没有响应得次数达到3,就自动断开连接,正常情况下,A 不会不响应

5 附加

这里有一些可能有用的参数

-v 调试链接,会显示出详细问题
-f 后台运行 ssh
-N 不运行命令,仅转发端口
-C 允许压缩数据

]]>