内网穿透的原理和配置

一、内网穿透的原理

要理解内网穿透,首先要明白为什么需要它。

1. 网络环境的限制

  • 公网IP与私网IP:互联网上的每台设备都需要一个唯一的公网IP地址才能被直接访问。但由于IPv4地址枯竭,运营商通常不会给家庭或普通企业宽带分配公网IP,而是使用网络地址转换(NAT) 技术。

  • NAT(网络地址转换):你的路由器会创建一个内部网络(如 192.168.1.x),给你的设备分配私网IP。当你访问外网时,路由器会把你的私网IP和端口转换成它的公网IP和一个随机端口,然后发出去。外部网络只能看到你的路由器,看不到你内网的具体设备。

  • 结果:外部网络(比如你的手机4G网络)无法主动发起连接来访问你内网中的电脑、NAS或网站服务器,因为“路”是单向的,只允许内网主动向外发起连接。

2. 内网穿透如何解决这个问题?

内网穿透的核心思想是:“既然我出不去,那我就请一个中间人帮忙”。

这个“中间人”就是一台拥有公网IP的服务器(称为中转服务器或跳板机)。整个过程分为三步:

  1. 建立反向隧道(核心步骤):

    • 你内网中的客户端(比如你的电脑上运行的穿透软件)主动、持续地连接至公网上的中转服务器。

    • 这个连接是长期保持的,就像在内网和公网服务器之间打通了一条“隧道”。因为连接是由内网发起的,所以它成功地穿过了路由器的NAT限制。

  2. 公网访问请求:

    • 当外部用户想要访问你的内网服务时,他实际上是先去访问那个拥有公网IP的中转服务器(例如,访问 your-domain.frp.com)。

  3. 数据转发:

    • 中转服务器收到请求后,通过之前建立好的“隧道”,将请求数据转发给你内网的客户端。

    • 内网客户端处理这个请求(比如从你的本地网站获取一个页面),然后将响应数据再通过“隧道”发回给中转服务器。

    • 中转服务器最后将这个响应数据返回给外部用户。

简单比喻:

内网设备就像在一个没有对外公开电话号码的公司内部座机(分机号8080)。中转服务器就像一个总机接线员(有公开电话号)。

  1. 内部座机(8080)主动打电话给总机,说:“嗨,我是8080,我保持通话不挂断,有任何找我的电话请你转给我。”

  2. 外部客户打电话给总机,说:“请转接8080。”

  3. 总机通过保持通话的那条线,把外部客户的电话转接到了内部8080座机上。

这样,尽管外部客户无法直接拨打内部座机,但通过总机的转接,实现了通话。


二、内网穿透的配置(以 FRP 为例)

FRP 是一个流行的开源内网穿透工具。下面我们以一个典型场景为例:将内网一台电脑上的 80 端口(如一个本地网站)暴露到公网上。

准备工作:

  1. 一台具有公网IP的服务器(VPS,如阿里云、腾讯云等)。这将是我们的服务端(frps)。

  2. 一台内网电脑(你想暴露服务的那台)。这将是我们的客户端(frpc)。

  3. 分别下载对应操作系统版本的 FRP 程序:FRP GitHub Releases

配置步骤:

第一部分:服务端(VPS)配置

  1. 登录你的VPS,上传并解压 FRP 程序。

  2. 编辑服务端配置文件 frps.ini

    # frps.ini
    [common]
    # 服务端监听的端口,用于接收客户端的连接
    bind_port = 7000
    # 用于网页查看frp状态的可选配置(可选)
    dashboard_port = 7500
    dashboard_user = admin
    dashboard_pwd = your_password
    # 认证令牌,增强安全性(建议设置)
    token = your_secret_token_123
  3. 启动FRP服务端:

    bash
    ./frps -c ./frps.ini

    为了让服务在后台持续运行,建议使用 systemd 或 nohup

    • 使用 systemd(推荐):
      创建文件 /etc/systemd/system/frps.service

      [Unit]
      Description=Frp Server Service
      After=network.target
      
      [Service]
      Type=simple
      User=nobody
      Restart=on-failure
      RestartSec=5s
      ExecStart=/path/to/your/frps -c /path/to/your/frps.ini
      
      [Install]
      WantedBy=multi-user.target

      然后执行:

      bash
      sudo systemctl enable frps
      sudo systemctl start frps

第二部分:客户端(内网电脑)配置

  1. 在内网电脑上下载并解压 FRP。

  2. 编辑客户端配置文件 frpc.ini

    # frpc.ini
    [common]
    # 填写你的VPS的公网IP地址或域名
    server_addr = your_vps_ip.com
    # 填写服务端配置的 bind_port
    server_port = 7000
    # 填写和服务端一致的 token
    token = your_secret_token_123
    
    # 下面定义你要暴露的服务
    [web] # 这是一个服务名称,可以自定义
    type = tcp # 协议类型
    local_ip = 127.0.0.1 # 本地服务的IP,通常是127.0.0.1
    local_port = 80 # 本地服务的端口
    remote_port = 8080 # 远程端口(在VPS上开启的端口)
    # 这意味着:访问 your_vps_ip.com:8080 将会被转发到内网机器的 80 端口。
  3. 启动FRP客户端:

    bash
    ./frpc -c ./frpc.ini

    同样,客户端也可以配置为后台服务。Windows下可以将其设置为开机自启的服务。

测试访问

完成以上配置后,当客户端成功连接上服务端,外部用户就可以通过访问 http://你的VPS公网IP:8080 来访问你内网电脑上 80 端口的服务了。


三、其他工具和方案

除了 FRP,还有很多优秀的内网穿透方案:

  1. Ngrok:非常知名,提供官方免费服务器,开箱即用,适合临时测试。

  2. ZeroTier / Tailscale:基于虚拟组网技术(VPN),它们不是简单的端口转发,而是为你的所有设备创建一个虚拟的局域网,体验更像直接在内网访问,功能更强大。

  3. 花生壳 / 向日葵:国内商业软件,提供软硬件一体方案,配置简单,但免费版通常有流量和带宽限制。

总结

 
方面说明
核心原理 利用内网客户端主动与公网服务器建立持久连接(隧道),由服务器转发外部请求来实现穿透。
关键角色 服务端(frps):有公网IP,负责转发流量。客户端(frpc):在内网,主动连接服务端。
适用场景 远程访问NAS、演示本地开发项目、访问家中路由器、微信小程序开发调试等。
安全注意 务必设置强壮的 token,并只暴露必要的端口,因为将内网服务暴露到公网会增加安全风险。

希望这个详细的解释和配置示例能帮助你彻底理解并成功配置内网穿透!

posted @ 2025-09-28 15:57  Seamless  阅读(17)  评论(0)    收藏  举报