背景

根据IPv4地址的规范,IPv4地址最多有2^32个IP,并且有一些地址是为特殊用途所保留的,因此IPv4地址的数量是十分有限的。在当前IPv6还没有大规模普及的情况下,不可能为每一台接入互联网设备都分配一个IPv4地址,为了让每一台设备接入互联网中,我们试想多个设备是否可以共用一个IPv4呢?

NAT地址转换技术正是实现这个设想的技术方案,NAT技术可以有效解决IPv4地址不足的问题。在实际应用中,最常用的就是家庭无线路由器为家庭局域网的每一台设备进行NAT,最少只需一个IPv4地址即可将局域网中所有设备接入互联网当中。

例如,运营商分配一个202.101.3.1的公网IP,而路由器分配给每一个设备的IP是192.168.0.2 - 192.168.0.255,这些内网IP共用一个公网IP进行出口。

NAT地址转换示意图如下图所示。

image-20200905165441254

NAT的缺点

虽然NAT很好的解决了IPv4不足的问题,但是局域网中的设备就几乎无法正常被公网上的设备访问。为什么是几乎呢?

  • 一层NAT,也就是说运营商分配了一个公网动态IP给路由器,大多数路由器具有端口映射的功能,可以把内网指定设备的IP和端口和外网IP的端口进行映射,这是最简单的情况。
  • 多层NAT,好比现在的移动宽带,鹏博士,宽带通等等啥的,即使在路由器进行端口映射,但是在运营商其他设备同样需要进行端口映射,一层一层的往外“传”。但是往往除了家庭路由器外的设备我们无法操作,因此对于这种情形仅仅通过端口映射无法做到让外网设备访问。

为什么需要内网穿透

当我们没有内网穿透时,当我们对程序进行调试时需要将程序部署到服务器上,而这个过程往往比较麻烦也浪费比较多时间,如果可以直接在本地进行调试那就非常方便了!

解决方案

虽然外部设备无法访问内部设备,但是内部可以访问外部呀!因此可以利用这个特点,内部设备①具有让外部其他设备访问功能的外部设备②进行TCP连接(全双工协议,建立连接后,两端可以进行数据包的接收发),通过这个TCP连接来进行数据传输,通过②来替代①来实现让其他外部设备进行访问。

目前比较流行的解决方案有frp,花生壳等等。我这里推荐使用frp,便宜稳定方便快捷。

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

使用方法

Github releases地址:https://github.com/fatedier/frp/releases

首先,在上述地址下载服务端程序(一般是Linux),并在②外网设备中部署,一般使用阿里云,腾讯云等服务器,我采用的是阿里云的学生机,因为带宽大还便宜,同时上面也部署了我自己的博客。

由于下载下来的包既包含服务端程序,又包含客户端程序,可以根据需要删除不需要的程序。例如,服务器端我可以删除带c(client)的,客户端我可以删除带s(server)的。

image-20200905171811774

其次,在①内网设备安装同版本客户端程序(一般是Windows),经过上述精简后如下图所示。

image-20200905171943620

其中:

  • frpc.exe:客户端可执行程序
  • frpc.ini:客户端的配置

    • common相当于是全局的配置信息

      • server_addr:服务器的IP地址
      • server_port:frp服务端程序开放的端口
      • token:服务端设置的密码
    • [3389]相当于是要进行穿透的内网程序,括号中的内容可以随便写只要不重复,并且可以复制多份以达到穿透多个端口的功能

      • type:传输层传输方式,一般使用TCP
      • local_ip:内部设备IP
      • local_port:需要进行映射的程序端口
      • remote_port:其他外网设备通过服务端②访问的端口

        [common]
        server_addr = 39.107.88.171
        server_port = 8000
        token = 123456789
        
        [3389]
        type = tcp
        local_ip = 127.0.0.1
        local_port = 3389
        remote_port = 8989
  • open.bat:是自己编写的脚本程序,双击即可直接运行,否则需要在cmd进行运行,比较麻烦

    frpc.exe -c frpc.ini

当我们完成上述配置并执行bat脚本后,我们就可以通过server_addr:remote_port来访问local_ip:local_port这个端口了。

本文更注重原理的讲解和笔记记录,更加具体配置过程可以参考官方文档:https://gofrp.org/docs/

©著作权归作者所有

发表评论

正在加载 Emoji