利用autossh实现内网穿透

Posted by hebicheng on April 15, 2021

利用autossh实现内网穿透

目标机器:

  • 内网服务器A
  • 外网服务器B
  • 其他服务器C

内网服务器利用autossh将端口转发给外网服务器(需要服务器A能访问到B)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
autossh -M 10086 -fCNR  8087:127.0.0.1:80 ubuntu@heb1c.cn -p 22

# 细节
-p      指定外网服务器的ssh端口(默认22)
-M      在外网服务器中指定一个端口,监听连接的状态,使断开后进行重连 
-f      隧道建立成功后在后台运行
-N      不执行远程指令
-L      建立本地SSH隧道,指定本地的某端口转发到远程主机的某端口
-R      建立远程SSH隧道,指定远程主机上的某端口转发到本地的某端口

# 8087:127.0.0.1:80
# 即将内部服务器的80端口代理给ubuntu@heb1c.cn的8087端口

# 

一般只为让外网服务器访问到内网机器的某个端口如此操作已经够了。此时已经能让外网服务器B访问到内网服务器A。

这个过程中,内网服务器A需要有外网服务器B的登录权限,密码和publickey均可。

但是为了配合autossh的自动连接,内网服务器执行命令时可以在命令上带上公网服务器密钥 -i key_path 。当然也可以用id_rsa,将公钥添加到外网服务器的authorized_keys

如果想要让其他机器通过服务器B访问到A,修改命令为以下内容:

外网服务器正向代理

1
2
3
4
autossh -M 10086 -fCNR  *:8087:127.0.0.1:80 ubuntu@heb1c.cn -p 22

# 直接完成外网服务器的8087代理内网的80端口,并且此时外网服务器的
# 此时访问外网服务器的12345端口,即可实现对内网80端口的访问

此时服务器C可以通过B访问到A:

web访问:

直接访问B_ip:8087 即可访问A的80端口

ssh访问

如果想要C通过ssh连接A:

1
autossh -M 10086 -fCNR  *:10022:127.0.0.1:22 ubuntu@heb1c.cn -p 22

代理22端口后。C就可以通过以下命令访问:

1
ssh -p 10022 user@B_ip

原创作品,转载请注明来源 https://hebicheng.github.io