内网穿透

一种简易方案

Posted by alwaysgoodtime on January 1, 2020

前言

如果您了解内网穿透是什么,或者没有一台有公网ip的云服务器,那么下面的内容无需观看。

什么是内网穿透

家里的宽带,一般都是电信、移动或者联通(也有长城宽带)。大部分时候,我们电脑上网的ip地址,是一个内网地址。

我们访问百度、淘宝等网页时,用的是对应的公网ip地址。公网ip,可以在整个互联网中定位到,而我们家里的ip地址,因为是宽带供应商提供的,相当于一个局域网的ip。外网(公网)无法访问我们的内网ip。

所以内网穿透的作用,是让外面的公网能访问到我们处于内网中的电脑。

为什么用内网穿透

开发中最实际的例子是,我们写一个 javaweb 的程序,要调用外面的接口来实现某些功能,比如支付宝的支付功能。

当我们扫码支付后,支付宝会返回一段支付成功的信息,这时需要我们用一个公网的接口,接收这段信息,并返回 “success”。

我们的程序,如果只在 localhost(本机)上测试,这个接收支付成功信息的接口,也只在我们的内网(127.0.0.1)中起作用,而支付宝无法调用我们电脑上的接口。因此,虽然我们可以付钱,但是付钱后跳转页面、接受支付宝回调信息等功能,就在本机上无法编写与测试了。

借助云服务器的内网穿透

原理:我们只需建立两个 ssh 连接。第一条连接,建立在我们的云服务器(有公网ip,比如为47.1.2.4)的两个端口上(比如为 7007, 8008 两个端口);第二条连接,建立在我们自己的电脑和云服务器之间(比如我们自己电脑的 8000 端口,和云服务器的 8008 端口)。

两条连接的作用:第一条连接,让所有对云服务器 7007 端口的访问,全部转发云服务器的 8008 端口。第二条连接,让所有对云服务器 8008 端口的访问,都发送给我们自己电脑上的 8000 端口。

这样,我们电脑上的 8000 端口,就和拥有公网ip的 7007 端口绑定。对远程7007端口的访问,就是对我们自己电脑 8000 端口的访问。

穿透实战

测试环境:阿里云服务器 Linux版本:centos7 我的电脑 MacOS 版本:10.15

我们自己的电脑上输入如下指令(命令行):

ssh -fNgR 8008:127.0.0.1:8000 root@47.1.2.4

参数说明: 8008 云服务器端口;

127.0.0.1:就是localhost,我们自己的电脑;

8000:我们想要让外网访问的那个端口,比如我们的javaweb应用,就可以将端口设置为8000。

-fNgR:反向代理,让我们电脑的8000端口,反向代理云服务器的8008端口

root:云服务器的用户名

47.1.2.4:云服务器的公网ip地址

云服务器上输入如下指令:

ssh -fCNL *:7007:localhost:8008 localhost
# 参数说明: 
# 7007:云服务器被代理的端口,
# 8008:云服务器的代理端口
# -fNgR:正向代理,让云服务器的8008端口的访问,转发到云服务器自己的7007端口
# *:任何ip的访问都被转发

补充说明

1.如果云服务器和我们的电脑没有安装ssh服务,可以手动安装一下。

2.如果云服务器是阿里云,记得把阿里云安全组管理的22、7007、8008端口开放(腾讯云没有用过)

3.同样,如果云服务器上,我们的防火墙把22端口、7007、8008端口屏蔽了,也记得开启,简单的办法是,直接关闭云服务器的防火墙。

systemctl disable firewalld 关闭云服务器的防火墙

4.我们自己电脑上的连接,可能会因为种种原因关闭,我们可以通过**ps -ef grep ssh**命令,查看我们电脑上的ssh连接还存不存在,如果不存在,重新输入一次即可。

5.我们连接阿里云自己的云服务器时,每次连接需要输入密码,可以在我们的电脑上执行如下命令,免去每次密码输入。

ssh-copy-id root@47.1.2.4

参数说明:root:云服务器上我们的用户名

47.1.2.4:云服务器的公网ip地址

总结

还可以通过域名等方式来实现内网穿透,请自行百度。

如果有云服务器的话,用两条ssh命令就可以实现简单的代理。

在自己的电脑上:输入

ssh -fNgR 8008:127.0.0.1:8000 root@47.1.2.4

在云服务器上:输入

ssh -fCNL *:7007:localhost:8008 localhost