内网穿透的作用

内网穿透也叫内网映射,将本地服务器内网IP端口提供到外网,实现外网连接访问的过程。内网穿透可以将原本只能在本机、本局域网内访问的项目网站等,实现外网也同样可以访问。

FRP介绍

FRP 是一种快速反向代理,允许您将位于 NAT 或防火墙后面的本地服务器暴露给互联网。它目前支持 TCPUDP,以及 HTTPHTTPS 协议,允许通过域名将请求转发到内部服务。

SAKURA FRP测试

使用免费的内网穿透服务SAKURA FRP,即将本地端口与具有公网IP的服务器端口进行绑定,可实现本地端口与外部网络端口的映射。

下面演示具体操作过程。

  • 下载frp客户端,更改配置文件

    下载frp_0.48.0_windows_amd64,解压文件。其中文件夹结构如下,红框处为客户端配置文件和执行程序。

    image-20230415184930969

  • 启动frp服务,查看服务状态

    进入SAKURA FRP网站,创建隧道,截图如下。

    image-20230415185641223

    复制其隧道配置代码至配置文件。

    image-20230415185825599

    同时启动frpc程序,执行./frpc -c ./frpc.ini指令,验证连接状态,程序控制台以及连接状态截图如下。

    image-20230415190140724

    image-20230415190213612

  • 编写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)
    

    运行结果如下。

    image-20230416113052132

    image-20230416113112827

    image-20230416113605583

    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