背景:笔者采用的WORKSTATION PRO"17+Ubuntu系统。笔者的虚拟机可以连接外网,主机或通过SSH远程也能连接我的虚拟机。通过内网穿透方式实现外网访问。我选择使用ngrok工具来实现这一目标。
虚拟机网络配置如下:
虚拟机的相关网络端口需要开放:
可使用命令:
sudo ufw allow/deny 20:允许/拒绝访问20端口,20后可跟/tcp或/udp,表示tcp或udp封包。
查看某个端口是否打开命令
命令:nc -vz ip 80
UFW 是标准 Ubuntu安装过程中的一部分,它应该已经在系统上存在。如果因为某些原因,它没有被安装,可以通过输入下面的命令安装它:
sudo apt update
sudo apt install ufw
查看端口号
在Ubuntu中查看端口号的命令是netstat。可以使用以下命令来查看当前开放的端口:
sudo netstat -tunlp
其中,参数含义如下:
-t:仅显示 TCP 协议的连接
-u:仅显示 UDP 协议的连接
-n:不解析服务名称,使用端口号表示服务
-1:仅显示监听状态的连接
-p:显示进程名或进程 ID
其它相关命令自行查询。
在虚拟机中,后端服务需要启动
ngrok原理如下图所示。
Ngrok配置步骤如下:
在ngrok官网注册好之后,登录管理界面后,会出现下图控制中心。
控制中心选择Linux系统,按照他给出的步骤进行ngrok下载和安装。
将ngrok安装好后,采用 ngrok http 8080进行启动。启动界面如下,图中forwarding就是URL,
将URL链接复制到网页上,默认打开界面如图
当你访问网址为你自己构建的网页时,笔者的测试界面如下图:链接为:https://2e9b-220-89-248-151.ngrok-free.app/wx
即穿越成功,下面是测试代码,我用的微信公众号的开发文档中的例子。
首先创建一个main.py文件,内容如下。
import web
from handle import Handle
urls = (
'/wx', 'Handle',
)
# class Handle(object):
# def GET(self):
# return "hello, this is handle view"
if __name__ == '__main__':
app = web.application(urls, globals())
app.run()
再创建一个handle.py文件,进行get请求解析,
import hashlib
import web
class Handle(object):
def GET(self):
try:
data = web.input()
print("handle/GET func: data is", data)
if len(data) == 0:
print("hello, this is handle view123")
return "hello, this is handle view123"
signature = data.signature
print("handle/GET func: signature: ", signature)
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "xxx" # 请按照公众平台官网\基本配置中信息填写
print("handle/GET func: signature, timestamp, nonce, echostr: ", signature, timestamp, nonce, echostr)
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return ""
except Exception as Argument:
return Argument