Skip to content

内网穿透

一、是什么?

内网穿透(NAT穿透)是一种通过公网服务器中转流量,使外部设备能访问内网服务的技术。
frp(Fast Reverse Proxy) 是一个开源的反向代理工具,专为内网穿透设计。其核心架构分为两部分:

  • frps(服务端):部署在具有公网IP的服务器上(如云服务器)。
  • frpc(客户端):部署在内网设备上,将本地服务暴露给frps。

二、解决什么问题

  1. 无公网IP访问内网:家庭/公司内网设备无公网IP,无法直接远程访问。
  2. 开发测试:本地开发的Web应用需临时暴露给外部(如微信回调、远程演示)。
  3. 跨网络访问:远程连接内网数据库、SSH、文件服务等。
  4. 绕过网络限制:解决运营商封锁端口或动态IP变化问题。

三、核心配置方法(非编程方法)

通过配置文件实现服务映射:

  • frps.ini(服务端):定义监听端口(如7000)。
  • frpc.ini(客户端):声明要暴露的服务(类型、本地端口、公网端口)。
ini
# frpc.ini示例
[common]
server_addr = 公网服务器IP  # frps地址
server_port = 7000        # frps端口

[web]                     # 服务名称(自定义)
type = tcp                # 转发类型
local_ip = 127.0.0.1      # 本地服务IP
local_port = 8080         # 本地Java应用端口
remote_port = 6000        # 公网访问端口

四、应用场景

  1. 开发调试
    • 本地运行Spring Boot应用(localhost:8080),通过frp暴露为公网IP:6000供同事测试。
  2. 远程控制
    • 访问内网Linux服务器SSH(将22端口映射到公网)。
  3. 家庭服务
    • 暴露NAS或智能家居控制界面到公网。
  4. 临时演示
    • 向客户展示本地开发中的Web项目。

五、Java示例(客户端集成)

虽然frp本身用Go编写,但Java可通过进程调用启动frpc:

java
// 启动frpc客户端的Java代码示例
public class FrpStarter {
    public static void main(String[] args) throws IOException {
        // 指定frpc路径和配置文件
        ProcessBuilder pb = new ProcessBuilder("./frpc", "-c", "frpc.ini");
        pb.directory(new File("/path/to/frp")); // 设置frp安装目录
        Process process = pb.start();
        
        // 监控日志(可选)
        new Thread(() -> {
            try (BufferedReader reader = new BufferedReader(
                 new InputStreamReader(process.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println("[FRP] " + line); // 打印frp日志
                }
            } catch (IOException e) { e.printStackTrace(); }
        }).start();
    }
}

六、重要注意事项

  1. 安全风险
    • 避免暴露敏感服务(如数据库),务必使用frp的token认证和ACL限制IP。
  2. 带宽瓶颈
    • 公网服务器的带宽决定访问速度(1Mbps带宽仅支持约100人并发)。
  3. 替代方案
    • 若有IPv6或公网IP,优先用DDNS+端口映射(性能更好)。
  4. 合规性
    • 企业环境需获得网络管理员授权,避免违反安全策略。

七、总结

frp是解决无公网IP访问内网服务的高效工具,适用于开发调试、远程控制等场景。作为Java开发者,可通过进程调用集成到应用中,但需重点关注安全性(避免内网暴露)。对于生产环境,建议结合VPN或云原生方案(如Kubernetes Ingress)实现更安全的访问。