Flutter VPN管理插件wireguard_vpn的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter VPN管理插件wireguard_vpn的使用

wireguard_vpn 是一个 Flutter 插件,用于通过 WireGuard 激活和停用 VPN 连接。

Setup

Android 配置

  1. 修改 android/app/build.gradle 文件中的 minSdkVersion 为 21:

    android {                    
        defaultConfig {
            minSdkVersion 21
        }                                
    }
    
  2. 如果要在发布模式下运行应用,需要在 ./android/app/ 目录下添加一个名为 proguard-rules.pro 的文件,并包含以下内容:

    -keep class app.wachu.wireguard_vpn.** {*;}
    -keep class com.beust.klaxon.** {*;}
    
  3. 或者,可以在 ./android/app/build.gradle 文件的 buildtypes release 下添加以下内容:

    shrinkResources false
    minifyEnabled false
    

感谢贡献者

感谢用户 ByteSizedMarius 对包在发布模式下的执行所做的贡献。感谢你!

Usage

添加依赖

pubspec.yaml 文件中添加 wireguard_vpn 依赖:

dependencies:
  wireguard_vpn: ^0.0.2 

导入包

在 Dart 文件中导入 wireguard_vpn 包:

import 'package:wireguard_vpn/wireguard_vpn.dart';

Activate and Deactivate VPN

使用 WireguardFlutterPlugin 类的 changeStateParams 方法来激活或停用 VPN 连接。该方法需要一个 SetStateParams 对象作为参数,该对象包含关于 VPN 隧道的信息。

bool vpnActivate = false;
String initName = "MyWireguardVPN";
String initAddress = "192.168.1.1/24";
String initDnsServer = "8.8.8.8";
String initPort = "51820";
String initAllowedIp = "0.0.0.0/0";
String initEndpoint = "vpn.example.com:51820";
String initPublicKey = "PUBLIC_KEY";
String initPrivateKey = "PRIVATE_KEY";
String presharedKey = "PRESHARED_KEY";

final _wireguardFlutterPlugin = WireguardFlutterPlugin();

void _activateVpn(bool value) async {
  final results = await _wireguardFlutterPlugin.changeStateParams(SetStateParams(
    state: !vpnActivate,
    tunnel: Tunnel(
        name: initName,
        address: initAddress,
        dnsServer: initDnsServer,
        listenPort: initPort,
        peerAllowedIp: initAllowedIp,
        peerEndpoint: initEndpoint,
        peerPublicKey: initPublicKey,
        privateKey: initPrivateKey,
        peerPresharedKey: presharedKey),
  ));
  setState(() {
    vpnActivate = results ?? false;
  });
}

Obtain Connection Statistics

使用 WireguardFlutterPlugin 类的 tunnelGetStats 方法来获取 VPN 连接的统计信息。该方法需要传入 VPN 隧道的名称。

String initName = "MyWireguardVPN";

final _wireguardFlutterPlugin = WireguardFlutterPlugin();

void _obtainStats() {
  Timer.periodic(const Duration(seconds: 1), (timer) async {
    final results = await _wireguardFlutterPlugin.tunnelGetStats(initName);
    setState(() {
      stats = results ?? Stats(totalDownload: 0, totalUpload: 0);
    });
  });
}

Complete Example

以下是一个完整的示例,展示了如何使用此插件激活和停用 VPN 连接以及获取连接统计信息:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:wireguard_vpn/wireguard_vpn.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _wireguardFlutterPlugin = WireguardVpn();
  bool vpnActivate = false;
  Stats stats = Stats(totalDownload: 0, totalUpload: 0);
  final String initName = 'MyWireguardVPN';
  final String initAddress = "10.7.0.2/24";
  final String initPort = "51820";
  final String initDnsServer = "8.8.8.8, 8.8.4.4";
  final String initPrivateKey = "PRIVATE_KEY";
  final String initAllowedIp = "0.0.0.0/0, ::/0";
  final String initPublicKey = "PUBLIC_KEY";
  final String initEndpoint = "vpn.example.com:51820";
  final String presharedKey = 'PRESHARED_KEY';

  @override
  void initState() {
    super.initState();
    if (vpnActivate) {
      _obtainStats();
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Wireguard-VPN Example'),
        ),
        body: Column(
          children: [
            Text('Active VPN: ${stats.totalDownload} D -- ${stats.totalUpload} U'),
            SwitchListTile(
              value: vpnActivate,
              onChanged: _activateVpn,
              title: Text(initName),
              subtitle: Text(initEndpoint),
            ),
          ],
        ),
      ),
    );
  }

  void _obtainStats() {
    Timer.periodic(const Duration(seconds: 1), (timer) async {
      final results = await _wireguardFlutterPlugin.tunnelGetStats(initName);
      setState(() {
        stats = results ?? Stats(totalDownload: 0, totalUpload: 0);
      });
    });
  }

  void _activateVpn(bool value) async {
    final results = await _wireguardFlutterPlugin.changeStateParams(SetStateParams(
      state: !vpnActivate,
      tunnel: Tunnel(
        name: initName,
        address: initAddress,
        dnsServer: initDnsServer,
        listenPort: initPort,
        peerAllowedIp: initAllowedIp,
        peerEndpoint: initEndpoint,
        peerPublicKey: initPublicKey,
        privateKey: initPrivateKey,
        peerPresharedKey: presharedKey,
      ),
    ));
    setState(() {
      vpnActivate = results ?? false;
      if (vpnActivate) {
        _obtainStats();
      }
    });
  }
}

Generate WireGuard VPN Configurations

要获取 WireGuard VPN 配置以进行测试,可以访问 ProtonVPN 网站,注册并生成配置文件。也可以参考 WireGuard 官方网站上的指南。

Contributions

欢迎贡献。如果你发现错误或想添加新功能,请打开一个新的 issue 或发送一个 pull request

License

本包根据 BSD 3-clause 许可证提供。更多信息请参阅 LICENSE 文件。


更多关于Flutter VPN管理插件wireguard_vpn的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter VPN管理插件wireguard_vpn的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用wireguard_vpn插件的示例代码。请注意,wireguard_vpn插件的具体用法可能会随着插件版本的更新而有所变化,因此在实际项目中使用时,请参考最新的官方文档。

首先,确保你已经在Flutter项目中添加了wireguard_vpn依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  wireguard_vpn: ^最新版本号  # 替换为实际最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用wireguard_vpn插件来管理WireGuard VPN配置。

1. 导入插件

在你的Dart文件中导入wireguard_vpn插件:

import 'package:wireguard_vpn/wireguard_vpn.dart';

2. 配置WireGuard接口

下面是一个配置WireGuard接口的示例代码:

void configureWireGuard() async {
  try {
    // 创建一个新的WireGuard接口配置
    WireGuardConfig config = WireGuardConfig(
      name: 'myWireGuardInterface',
      privateKey: '你的私钥(以base64编码)',
      peers: [
        WireGuardPeer(
          publicKey: '对方的公钥(以base64编码)',
          allowedIps: ['192.168.1.0/24'], // 允许的IP地址范围
          endpoint: WireGuardEndpoint(address: '对方的服务器地址', port: 51820),
          persistentKeepalive: 20, // 持久性保活间隔(秒)
        ),
        // 可以添加更多peer配置
      ],
    );

    // 应用配置
    bool success = await WireGuardVpn.configureInterface(config: config);
    if (success) {
      print('WireGuard接口配置成功');
    } else {
      print('WireGuard接口配置失败');
    }
  } catch (e) {
    print('配置WireGuard接口时发生错误: $e');
  }
}

3. 启动/停止WireGuard接口

配置完成后,你可以启动或停止WireGuard接口:

void startWireGuard() async {
  try {
    bool success = await WireGuardVpn.startInterface(name: 'myWireGuardInterface');
    if (success) {
      print('WireGuard接口启动成功');
    } else {
      print('WireGuard接口启动失败');
    }
  } catch (e) {
    print('启动WireGuard接口时发生错误: $e');
  }
}

void stopWireGuard() async {
  try {
    bool success = await WireGuardVpn.stopInterface(name: 'myWireGuardInterface');
    if (success) {
      print('WireGuard接口停止成功');
    } else {
      print('WireGuard接口停止失败');
    }
  } catch (e) {
    print('停止WireGuard接口时发生错误: $e');
  }
}

4. 检查WireGuard接口状态

你还可以检查WireGuard接口的状态:

void checkWireGuardStatus() async {
  try {
    WireGuardStatus status = await WireGuardVpn.getInterfaceStatus(name: 'myWireGuardInterface');
    print('WireGuard接口状态: ${status.toMap()}');
  } catch (e) {
    print('检查WireGuard接口状态时发生错误: $e');
  }
}

注意事项

  1. 权限:确保你的应用具有必要的权限来配置和管理VPN接口。在Android上,你可能需要在AndroidManifest.xml中添加相应的权限声明。
  2. 私钥和公钥:在实际使用中,私钥和公钥应该是安全生成的,并且不应该硬编码在代码中。
  3. 错误处理:在实际应用中,应该添加更完善的错误处理逻辑来应对各种可能的异常情况。

以上代码提供了一个基本的框架,展示了如何在Flutter项目中使用wireguard_vpn插件来管理WireGuard VPN配置。根据具体需求,你可以进一步扩展和修改这些代码。

回到顶部