内网穿透的作用
内网穿透也叫内网映射,将本地服务器内网IP端口提供到外网,实现外网连接访问的过程。内网穿透可以将原本只能在本机、本局域网内访问的项目网站等,实现外网也同样可以访问。
FRP介绍
FRP 是一种快速反向代理,允许您将位于 NAT 或防火墙后面的本地服务器暴露给互联网。它目前支持 TCP 和 UDP,以及 HTTP 和 HTTPS 协议,允许通过域名将请求转发到内部服务。
SAKURA FRP测试
使用免费的内网穿透服务SAKURA FRP,即将本地端口与具有公网IP的服务器端口进行绑定,可实现本地端口与外部网络端口的映射。
下面演示具体操作过程。
下载frp客户端,更改配置文件
下载frp_0.48.0_windows_amd64,解压文件。其中文件夹结构如下,红框处为客户端配置文件和执行程序。
启动frp服务,查看服务状态
进入SAKURA FRP网站,创建隧道,截图如下。
复制其隧道配置代码至配置文件。
同时启动frpc程序,执行
./frpc -c ./frpc.ini
指令,验证连接状态,程序控制台以及连接状态截图如下。编写UDP例程,验证通信可行性
笔者通过Python编写UDP收发程序,进行验证内网穿透数据是否可达。以下是相关的代码。
send.py
import socket if __name__ == '__main__': UDP_IP = "frp-bid.top" UDP_PORT = 57457 MESSAGE = b"Hello,my name is LIN!" print("UDP target IP: %s" % UDP_IP) print("UDP target port: %s" % UDP_PORT) print("message: %s" % MESSAGE) sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
rec.py
import socket if __name__ == '__main__': UDP_IP = "127.0.0.1" UDP_PORT = 10617 sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP sock.bind((UDP_IP, UDP_PORT)) while True: data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes print("received message: %s" % data)
运行结果如下。
send.py
程序向frp-bid.top
的57457端口发送数据,rec.py
可以接受本地10617端口和frp-bid.top
的57457端口的数据(frp绑定端口)。
总结
本篇文章实现了没有公网IP的情况下,不同局域网的机器的通信。
参考资料
https://zhuanlan.zhihu.com/p/617715530
https://github.com/fatedier/frp
https://wiki.python.org/moin/UdpCommunication