Tauri开发桌面端服务,配置指定防火墙端口

注意程序需要管理员权限,参考下面这个文章:

Tauri开发桌面端使程序拥有管理员权限,桌面图标有小盾牌

打开src-tauri目录下src下的main.rs文件,添加下面代码

rust 复制代码
// 新增:防火墙配置相关函数
use std::process::Command;
use std::io::{self, Write};

/// Windows防火墙配置函数
#[cfg(target_os = "windows")]
fn configure_windows_firewall() -> Result<(), Box<dyn std::error::Error>> {
    let app_name = "测试";
    let port = 5800;
    
    println!("开始检查Windows防火墙配置...");
    
    // 检查是否已存在规则
    let tcp_check_cmd = format!("netsh advfirewall firewall show rule name=\"{0} Port {1} TCP\"", app_name, port);
    let tcp_output = Command::new("cmd")
        .args(&["/C", &tcp_check_cmd])
        .output()?;
    
    let udp_check_cmd = format!("netsh advfirewall firewall show rule name=\"{0} Port {1} UDP\"", app_name, port);
    let udp_output = Command::new("cmd")
        .args(&["/C", &udp_check_cmd])
        .output()?;
    
    let tcp_exists = tcp_output.status.success();
    let udp_exists = udp_output.status.success();
    
    // 如果规则已存在,跳过配置
    if tcp_exists && udp_exists {
        println!("✅ Windows防火墙规则已存在,跳过配置");
        return Ok(());
    }
    
    println!("正在配置Windows防火墙规则...");
    
    let mut rules_created = 0;
    
    // 创建TCP入站规则(如果不存在)
    if !tcp_exists {
        let tcp_rule = format!(
            "netsh advfirewall firewall add rule name=\"{0} Port {1} TCP\" dir=in action=allow protocol=TCP localport={1} profile=private,public",
            app_name, port
        );
        
        let output = Command::new("cmd")
            .args(&["/C", &tcp_rule])
            .output()?;
        
        if output.status.success() {
            println!("✅ TCP防火墙规则创建成功");
            rules_created += 1;
        } else {
            let error_msg = String::from_utf8_lossy(&output.stderr);
            println!("⚠️  TCP防火墙规则创建失败: {}", error_msg);
            // 不立即返回错误,继续尝试UDP规则
        }
    }
    
    // 创建UDP入站规则(如果不存在)
    if !udp_exists {
        let udp_rule = format!(
            "netsh advfirewall firewall add rule name=\"{0} Port {1} UDP\" dir=in action=allow protocol=UDP localport={1} profile=private,public",
            app_name, port
        );
        
        let output = Command::new("cmd")
            .args(&["/C", &udp_rule])
            .output()?;
        
        if output.status.success() {
            println!("✅ UDP防火墙规则创建成功");
            rules_created += 1;
        } else {
            let error_msg = String::from_utf8_lossy(&output.stderr);
            println!("⚠️  UDP防火墙规则创建失败: {}", error_msg);
        }
    }
    
    if rules_created > 0 {
        println!("✅ Windows防火墙规则配置完成,创建了 {} 条规则", rules_created);
    } else {
        println!("ℹ️  无需创建新的防火墙规则");
    }
    
    Ok(())
}

/// macOS防火墙配置(通常不需要特殊配置)
#[cfg(target_os = "macos")]
fn configure_macos_firewall() -> Result<(), Box<dyn std::error::Error>> {
    println!("macOS系统:防火墙配置通常由系统自动处理");
    println!("应用首次运行时,系统会提示用户是否允许网络访问");
    Ok(())
}

/// Linux防火墙配置(提供用户指导)
#[cfg(target_os = "linux")]
fn configure_linux_firewall() -> Result<(), Box<dyn std::error::Error>> {
    let port = 5800;
    
    // 检测Linux发行版和防火墙工具
    if Command::new("which").arg("ufw").output().is_ok() {
        // Ubuntu/Debian使用ufw
        println!("检测到ufw防火墙,请手动执行以下命令:");
        println!("sudo ufw allow {}/tcp", port);
        println!("sudo ufw allow {}/udp", port);
    } else if Command::new("which").arg("firewall-cmd").output().is_ok() {
        // CentOS/RHEL使用firewalld
        println!("检测到firewalld防火墙,请手动执行以下命令:");
        println!("sudo firewall-cmd --permanent --add-port={}/tcp", port);
        println!("sudo firewall-cmd --permanent --add-port={}/udp", port);
        println!("sudo firewall-cmd --reload");
    } else if Command::new("which").arg("iptables").output().is_ok() {
        // 使用iptables
        println!("检测到iptables防火墙,请手动执行以下命令:");
        println!("sudo iptables -A INPUT -p tcp --dport {} -j ACCEPT", port);
        println!("sudo iptables -A INPUT -p udp --dport {} -j ACCEPT", port);
    } else {
        println!("Linux系统:防火墙配置因发行版而异");
        println!("请根据您的系统手动配置端口 {} 的防火墙规则", port);
    }
    
    Ok(())
}

/// 跨平台防火墙配置入口函数
fn configure_firewall_cross_platform() -> Result<(), Box<dyn std::error::Error>> {
    println!("开始配置防火墙规则...");
    
    #[cfg(target_os = "windows")]
    {
        configure_windows_firewall()?;
    }
    
    #[cfg(target_os = "macos")]
    {
        configure_macos_firewall()?;
    }
    
    #[cfg(target_os = "linux")]
    {
        configure_linux_firewall()?;
    }
    
    println!("防火墙配置完成");
    Ok(())
}

// 新增:导入regex库用于防火墙状态检查
use regex;
/// 检查防火墙状态
fn check_firewall_status() -> Result<(), Box<dyn std::error::Error>> {
    let port = 5800;
    
    #[cfg(target_os = "windows")]
    {
        let app_name = "测试";
        
        // 检查TCP规则
        let tcp_check_cmd = format!("netsh advfirewall firewall show rule name=\"{0} Port {1} TCP\"", app_name, port);
        let tcp_output = Command::new("cmd")
            .args(&["/C", &tcp_check_cmd])
            .output()?;
        
        // 检查UDP规则
        let udp_check_cmd = format!("netsh advfirewall firewall show rule name=\"{0} Port {1} UDP\"", app_name, port);
        let udp_output = Command::new("cmd")
            .args(&["/C", &udp_check_cmd])
            .output()?;
        
        let tcp_exists = tcp_output.status.success();
        let udp_exists = udp_output.status.success();
        
        // 更宽松的检查逻辑
        if tcp_exists && udp_exists {
            println!("✅ Windows防火墙规则检查:端口 {} 的TCP和UDP规则已配置", port);
            
            // 进一步检查规则状态
            let tcp_output_str = String::from_utf8_lossy(&tcp_output.stdout);
            let udp_output_str = String::from_utf8_lossy(&udp_output.stdout);
            
            // 修复:使用正则表达式处理不确定的空格数量
            let tcp_enabled = {
                let re = regex::Regex::new(r"已启用:\s*是").unwrap();
                re.is_match(&tcp_output_str) || tcp_output_str.contains("Enabled: Yes")
            };
            
            let udp_enabled = {
                let re = regex::Regex::new(r"已启用:\s*是").unwrap();
                re.is_match(&udp_output_str) || udp_output_str.contains("Enabled: Yes")
            };
            
            // 调试信息:输出实际的命令输出
            // println!("🔍 TCP规则检查输出: {}", tcp_output_str);
            // println!("🔍 UDP规则检查输出: {}", udp_output_str);
            
            if tcp_enabled && udp_enabled {
                println!("✅ 端口 {} 的TCP和UDP规则已启用", port);
            } else {
                println!("⚠️  端口 {} 的规则存在但可能未完全启用", port);
                println!("   TCP规则状态: {}", if tcp_enabled { "已启用" } else { "未启用" });
                println!("   UDP规则状态: {}", if udp_enabled { "已启用" } else { "未启用" });
            }
        } else if tcp_exists || udp_exists {
            println!("⚠️  端口 {} 的部分防火墙规则已配置", port);
            println!("   TCP规则: {}", if tcp_exists { "已配置" } else { "未配置" });
            println!("   UDP规则: {}", if udp_exists { "已配置" } else { "未配置" });
        } else {
            println!("❌ Windows防火墙规则检查:端口 {} 未配置防火墙规则", port);
            println!("💡 提示:这不会影响应用功能,但可能需要手动配置防火墙");
        }
    }
    
    #[cfg(not(target_os = "windows"))]
    {
        println!("ℹ️  防火墙状态检查:{} 系统通常不需要特殊配置", {
            #[cfg(target_os = "macos")] { "macOS" }
            #[cfg(target_os = "linux")] { "Linux" }
            #[cfg(not(any(target_os = "macos", target_os = "linux")))] { "当前" }
        });
    }
    
    Ok(())
}

然后在fn main()函数中添加下面代码:

rust 复制代码
fn main() {

    // 新增:自动配置防火墙
    match configure_firewall_cross_platform() {
        Ok(_) => println!("防火墙自动配置成功"),
        Err(e) => eprintln!("防火墙自动配置失败: {}", e),
    }

    // 检查防火墙状态
    if let Err(e) = check_firewall_status() {
        eprintln!("防火墙状态检查失败: {}", e);
    }

    // 其他代码......

}

切记执行:npm run tauri dev/build 时需要打开 "管理员:命令提示符"窗口中执行命令

相关推荐
好家伙VCC1 小时前
# 发散创新:用 Rust构建高性能游戏日系统,从零实现事件驱动架构 在现代游戏开发中,**性能与可扩展性**是核心命题。传统基于
java·python·游戏·架构·rust
Source.Liu4 小时前
【Iced】transformation.rs文件解析
rust·iced
小杍随笔7 小时前
【Rust 语言编程知识与应用:闭包详解】
开发语言·后端·rust
Ivanqhz8 小时前
图着色寄存器分配算法(Graph Coloring)
开发语言·javascript·python·算法·蓝桥杯·rust
42tr_k1 天前
Rust LanceDB 内存不足问题
rust
Source.Liu1 天前
【Iced】benches 文件夹分析笔记
rust·iced
Source.Liu1 天前
【glam】线性代数库 lib.rs 文件解析
rust·glam
大黄说说1 天前
Rust 入门到实战:构建安全、高性能的下一代系统
开发语言·安全·rust
好家伙VCC1 天前
# 发散创新:用 Rust构建高并发虚拟世界引擎核心模块在当今游戏开发与元宇宙构建中,**虚拟世界的性能瓶颈往往不是图形渲染,而是底
java·开发语言·python·rust·图形渲染
Mr -老鬼1 天前
前后端联调避坑!Vue优先IPv6导致接口不通,Rust Salvo这样解决
前端·vue.js·rust