——更新于25-12-02

参考:
https://juejin.cn/post/7491100994350219291

参考2:

https://blog.csdn.net/weixin_52214416/article/details/151857117

ps: 遇到与此参考2相同的问题,调整网络服务顺序后未生效;

ps: 非MacOS26系统不会遇到此问题。


目的:实现电脑同时接入内网与互联网。

网络环境

  • 内网:有线网卡

  • 外网:无线网卡(wifi)

查看网络硬件接口

在终端执行以下命令,查看所有硬件端口及其对应的设备名:

networksetup -listallhardwareports

命令输出中可根据 Hardware Port 判断是 Wi-Fi 还是有线网卡,并记住对应的 Device 名称。例如,有线网卡为 en5,Wi-Fi 为 en0

查看当前路由表

运行以下命令查看系统的路由表:

netstat -nr -f inet

字段说明:

  • Destination:目标网络地址

  • Gateway:网关(下一跳)

  • Netif:对应的网络接口

流量这时候优先走 en9(有线网卡)连接外网。

调整网络服务优先级

macOS 会根据服务顺序选择首选网卡,默认可能优先使用有线网络,导致无法访问互联网。

调整步骤如下

  1. 打开「系统偏好设置」 → 「网络」

  2. 点击左下角齿轮图标,选择「设定服务顺序」

  3. 将「Wi-Fi」拖至有线网卡之上

  4. 点击「完成」保存

更改应用后,再次检查路由表确认 Wi-Fi 是否已优先。

配置静态路由,实现内外网流量分流

虽然服务顺序已优化,但访问某些内网 IP 仍需通过内网网卡。这时可添加静态路由,实现精准流量分流。

方法一:通过网关添加路由

sudo route add -net 172.16.5.0 -netmask 255.255.255.0 172.16.9.126

说明:

  • 172.16.5.0:目标内网段

  • 255.255.255.0:子网掩码(CIDR /24

  • 172.16.9.126:内网网关地址

方法二:指定使用网卡发送数据

sudo route add -net 172.16.5.0 -netmask 255.255.255.0 -interface en1

这样访问该网段的流量将直接通过 en9(有线内网)发送。

如需删除该路由:

sudo route delete -net 172.16.5.0 -netmask 255.255.255.0

若添加时系统提示已存在,可先删除再添加;

验证配置是否生效

可使用如下命令检查路由表:

netstat -nr -f inet

至此,macOS 下内外网共存配置完成,访问内网资源与互联网可同时进行,无需频繁切换网络。

route -n get www.baidu.com

Q&A 及针对 MacOS26的特殊调整

Q: 若在更新macOS26后,出现调整网络服务优先级不生效问题;

A:按照参考2链接中做法,在设置固定IP时不设置路由,如下图,在你的脚本中或者命令行中重新设置。

此时运行 netstat -nr -f inet 查看时,如下图:


此时不会产生两个以上的default路由,只会保留一个wifi的default路由,这样系统就不会自动改变服务优先顺序,永远是wifi网络优先,缺点是网线断开后需重新执行脚本。

Q:用域名无法访问内网或仅首次生效刷新网页失效,说明DNS解析出现问题。

A:内网有固定解析的DNS,在wifi中手动配置即可,如下图:

或者在 /etc/resolver 文件夹(若是没有这个文件夹则主动创建)下对固定域名进行定向的IP解析 XXX.XXX.cn,推荐这种方式。

nameserver 172.XXX.XXX.3
timeout 5
search_order 1
# 清除DNS的缓存
# macOS 12+ (Monterey)
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

# 旧版本 macOS
sudo killall -HUP mDNSResponder

以上即为MacOS26.1之下版本进行内外网同时方式设置。

执行脚本

最后附上我完整的设置脚本及执行后截图,请用AI自己调整。

主要替换:

请替换自己的内网IP路由 !!!

请替换自己的内网域名 !!!

请替换自己的内网网卡名称 !!!

#!/bin/bash

################################################################################
# macOS 静态路由配置脚本
# 用途:为特定网段配置静态路由
# 使用方法:sudo ./script.sh
################################################################################

#==============================================================================
# 配置区域 - 在此处添加或修改路由规则
#==============================================================================

# 目标网关(所有静态路由将通过此网关)
TARGET_GATEWAY="172.16.XXX.XXX" # 请替换自己的内网IP路由 !!!

# 需要添加的静态路由列表(网段 CIDR 格式)
# 格式:每行一个网段,使用空格分隔
STATIC_ROUTES=(
    # "90.90.90.0/24"
    "172.16.0.0/16"
    # "159.226.99.0/24"  # 示例:取消注释以添加更多路由
)

# 测试目标(用于验证网络连通性)
# 格式:每行一个目标,使用冒号分隔主机名和描述
TEST_TARGETS=(
    "baidu.com:百度"
    "bing.com:必应"
    "XXX.XXX.XXX.XXX:内网门户"  # 请替换自己的内网域名 !!!
)

# DNS 配置
ENABLE_INTRANET_DNS=false          # 是否启用内网 DNS 配置
INTRANET_DNS_SERVERS=(
                 # 内网 DNS 服务器 1
                 # 内网 DNS 服务器 2(备用)
)
EXTERNAL_DNS_SERVERS=(
               # Google DNS
               # 114 DNS
)
DNS_SEARCH_DOMAINS=(
    "XXX.XXX.XXX"              # 内网域名后缀
)

# 网络服务顺序配置
SET_WIFI_FIRST=true               # 是否设置 Wi-Fi 为网络服务顺序第一位

# 路由优先级配置
REMOVE_INTRANET_DEFAULT_ROUTE=false  # 是否删除内网默认路由(确保Wi-Fi优先)
WIFI_DEFAULT_ROUTE_METRIC=1         # Wi-Fi默认路由度量值(越小优先级越高)
INTRANET_DEFAULT_ROUTE_METRIC=100   # 内网默认路由度量值(如果保留)

# 配置选项
PING_TIMEOUT=5                    # ping 超时时间(秒)
REQUIRE_GATEWAY_REACHABLE=true   # 是否要求目标网关必须可达才继续

#==============================================================================
# 脚本主体 - 通常不需要修改以下内容
#==============================================================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[!]${NC} $1"; }
log_error() { echo -e "${RED}[✗]${NC} $1"; }

# 检查 root 权限
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        log_error "此脚本需要 root 权限运行"
        echo "请使用: sudo $0"
        exit 1
    fi
}

# 获取 Wi-Fi 接口
get_wifi_interface() {
    local interface
    
    # 方法1:通过默认路由获取
    interface=$(route -n get default 2>/dev/null | grep interface | awk '{print $2}')
    
    # 方法2:通过 networksetup 获取
    if [ -z "$interface" ]; then
        interface=$(networksetup -listallhardwareports 2>/dev/null | \
            awk '/Wi-Fi|AirPort/{getline; print $2}' | head -1)
    fi
    
    # 方法3:查找活动的 en 接口
    if [ -z "$interface" ]; then
        interface=$(ifconfig | grep -E '^en[0-9]+:.*status: active' -A 1 | \
            grep 'status: active' -B 1 | head -1 | cut -d: -f1)
    fi
    
    echo "$interface"
}

# 获取 AX88x72A 硬件端口对应的接口
get_ax88x72a_interface() {
    local interface
    local hardware_port_info

    # 通过 networksetup 查找 Hardware Port: AX88x72A
    hardware_port_info=$(networksetup -listallhardwareports 2>/dev/null | \
        grep -A 1 "Hardware Port: AX88x72A")

    if [ -n "$hardware_port_info" ]; then
        interface=$(echo "$hardware_port_info" | grep -E '^Device: ' | awk '{print $2}')
        if [ -n "$interface" ]; then
            echo "$interface"
            return 0
        fi
    fi

    # 如果没有找到,尝试通过 ifconfig 查找可能的接口
    log_warning "未找到 Hardware Port: AX88x72A 对应的接口"
    echo ""
}

# 获取默认网关
get_default_gateway() {
    route -n get default 2>/dev/null | grep gateway | awk '{print $2}'
}

# 检查 IP 可达性
check_reachability() {
    local ip=$1
    ping -c 1 -W "$PING_TIMEOUT" "$ip" >/dev/null 2>&1
}

# 删除现有路由(避免冲突)
cleanup_existing_routes() {
    log_info "清理可能存在的旧路由..."
    
    for route in "${STATIC_ROUTES[@]}"; do
        route delete -net "$route" >/dev/null 2>&1
    done
    
    log_success "旧路由清理完成"
}

# 为 AX88x72A 硬件端口添加路由 请替换自己的内网网卡名称 !!!
add_ax88x72a_route() {
    log_info "检查 Hardware Port: AX88x72A..."
    local ax_interface
    ax_interface=$(get_ax88x72a_interface)

    if [ -n "$ax_interface" ]; then
        log_success "找到 AX88x72A 接口: $ax_interface"

        # 检查是否已存在到目标网关的路由
        local existing_route
        existing_route=$(netstat -nr -f inet | grep -E "^172\.16\.9\.126[[:space:]]" || true)

        if [ -z "$existing_route" ]; then
            log_info "为 AX88x72A 接口添加路由到目标网关 $TARGET_GATEWAY..."
            # 添加主机路由,将目标网关指向 AX88x72A 接口
            if route add -host "$TARGET_GATEWAY" -interface "$ax_interface" >/dev/null 2>&1; then
                log_success "已添加路由: $TARGET_GATEWAY -> 接口 $ax_interface"
            else
                log_error "添加路由失败: $TARGET_GATEWAY -> 接口 $ax_interface"
            fi
        else
            log_info "到目标网关 $TARGET_GATEWAY 的路由已存在:"
            echo "  $existing_route"
        fi
    else
        log_warning "未找到 AX88x72A 接口,跳过相关路由配置"
    fi
    echo ""
}

# 添加静态路由
add_static_routes() {
    local success_count=0
    local fail_count=0
    
    log_info "添加静态路由..."
    
    for route in "${STATIC_ROUTES[@]}"; do
        # 跳过注释行
        [[ "$route" =~ ^[[:space:]]*# ]] && continue
        [[ -z "$route" ]] && continue
        
        if route add -net "$route" "$TARGET_GATEWAY" >/dev/null 2>&1; then
            log_success "已添加路由: $route -> $TARGET_GATEWAY"
            ((success_count++))
        else
            log_error "添加路由失败: $route"
            ((fail_count++))
        fi
    done
    
    echo ""
    log_info "路由添加完成: 成功 $success_count 条, 失败 $fail_count 条"
}

# 验证默认路由
verify_default_route() {
    local original_gateway=$1
    local current_gateway
    
    log_info "验证默认路由..."
    
    current_gateway=$(get_default_gateway)
    
    if [ "$current_gateway" != "$original_gateway" ]; then
        log_warning "默认网关已改变"
        echo "  原始网关: $original_gateway"
        echo "  当前网关: $current_gateway"
        echo ""
        log_warning "如需修复默认路由,请执行:"
        echo "  sudo route add default $original_gateway"
    else
        log_success "默认路由正常: $current_gateway"
    fi
}

# 显示路由表
display_routes() {
    echo ""
    log_info "当前路由配置:"
    echo "----------------------------------------"
    echo "默认路由:"
    netstat -rn | grep -E '^default|^Destination' | head -2
    echo ""
    echo "静态路由 (172.16.x.x 和 90.90.90.x):"
    netstat -rn | grep -E '172\.16|90\.90\.90' | head -15
    echo "----------------------------------------"
}

# 配置 DNS
configure_dns() {
    if [ "$ENABLE_INTRANET_DNS" != true ]; then
        log_info "内网 DNS 配置已禁用,跳过 DNS 配置"
        return 0
    fi

    log_info "配置 DNS 服务器..."

    # 构建 DNS 服务器列表(内网优先,外网备用)
    local dns_servers=()

    # 添加内网 DNS 服务器
    for dns in "${INTRANET_DNS_SERVERS[@]}"; do
        [[ "$dns" =~ ^[[:space:]]*# ]] && continue
        [[ -z "$dns" ]] && continue
        dns_servers+=("$dns")
    done

    # 添加外网 DNS 服务器
    for dns in "${EXTERNAL_DNS_SERVERS[@]}"; do
        [[ "$dns" =~ ^[[:space:]]*# ]] && continue
        [[ -z "$dns" ]] && continue
        dns_servers+=("$dns")
    done

    if [ ${#dns_servers[@]} -eq 0 ]; then
        log_warning "未配置 DNS 服务器,跳过 DNS 配置"
        return 0
    fi

    # 获取当前网络服务名称
    local service_name
    service_name=$(networksetup -listallnetworkservices | grep -E 'Wi-Fi|AirPort|Ethernet' | head -1)

    if [ -z "$service_name" ]; then
        log_error "无法获取网络服务名称"
        return 1
    fi

    # 配置 DNS 服务器
    log_info "为网络服务 '$service_name' 配置 DNS..."

    # 构建 DNS 服务器参数
    local dns_args=""
    for dns in "${dns_servers[@]}"; do
        dns_args="$dns_args $dns"
    done

    # 设置 DNS 服务器
    if networksetup -setdnsservers "$service_name" $dns_args; then
        log_success "DNS 服务器配置成功"

        # 显示配置的 DNS 服务器
        echo ""
        log_info "已配置的 DNS 服务器:"
        for dns in "${dns_servers[@]}"; do
            echo "  - $dns"
        done
    else
        log_error "DNS 服务器配置失败"
        return 1
    fi

    # 配置搜索域(可选)
    if [ ${#DNS_SEARCH_DOMAINS[@]} -gt 0 ]; then
        log_info "配置 DNS 搜索域..."

        local search_args=""
        for domain in "${DNS_SEARCH_DOMAINS[@]}"; do
            [[ "$domain" =~ ^[[:space:]]*# ]] && continue
            [[ -z "$domain" ]] && continue
            search_args="$search_args $domain"
        done

        if [ -n "$search_args" ]; then
            if networksetup -setsearchdomains "$service_name" $search_args; then
                log_success "DNS 搜索域配置成功"

                echo ""
                log_info "已配置的搜索域:"
                for domain in "${DNS_SEARCH_DOMAINS[@]}"; do
                    [[ "$domain" =~ ^[[:space:]]*# ]] && continue
                    [[ -z "$domain" ]] && continue
                    echo "  - $domain"
                done
            else
                log_warning "DNS 搜索域配置失败"
            fi
        fi
    fi

    # 刷新 DNS 缓存
    log_info "刷新 DNS 缓存..."
    if dscacheutil -flushcache; then
        log_success "DNS 缓存已刷新"
    else
        log_warning "DNS 缓存刷新失败"
    fi

    echo ""
    return 0
}

# 显示 DNS 配置
display_dns_config() {
    echo ""
    log_info "当前 DNS 配置:"
    echo "----------------------------------------"

    # 获取当前网络服务名称
    local service_name
    service_name=$(networksetup -listallnetworkservices | grep -E 'Wi-Fi|AirPort|Ethernet' | head -1)

    if [ -n "$service_name" ]; then
        echo "网络服务: $service_name"
        echo ""

        echo "DNS 服务器:"
        networksetup -getdnsservers "$service_name" | while read -r line; do
            echo "  $line"
        done

        echo ""
        echo "搜索域:"
        networksetup -getsearchdomains "$service_name" | while read -r line; do
            echo "  $line"
        done
    else
        echo "无法获取网络服务信息"
    fi

    echo "----------------------------------------"
}

# 设置 Wi-Fi 为网络服务顺序第一位
set_wifi_first_priority() {
    if [ "$SET_WIFI_FIRST" != true ]; then
        log_info "Wi-Fi 优先级调整已禁用,跳过网络服务顺序调整"
        return 0
    fi

    log_info "调整网络服务顺序,设置 Wi-Fi 为第一位..."

    # 获取 Wi-Fi 服务名称
    local wifi_service
    wifi_service=$(networksetup -listallnetworkservices | grep -E 'Wi-Fi|AirPort')

    if [ -z "$wifi_service" ]; then
        log_error "未找到 Wi-Fi 网络服务"
        return 1
    fi

    # 检查 Wi-Fi 是否已经是第一位
    local first_service
    first_service=$(networksetup -listnetworkserviceorder | grep -E '^\(1\)' | sed 's/^[^(]*(1) //')

    if [[ "$first_service" == "$wifi_service" ]]; then
        log_success "Wi-Fi 已经是网络服务顺序第一位"
        return 0
    fi

    # 获取所有网络服务
    local all_services
    all_services=$(networksetup -listallnetworkservices | tail -n +2)

    # 构建新的服务顺序(Wi-Fi 第一,其他按原顺序)
    local new_order=("$wifi_service")

    while IFS= read -r service; do
        if [[ "$service" != "$wifi_service" ]]; then
            new_order+=("$service")
        fi
    done <<< "$all_services"

    # 设置新的网络服务顺序
    log_info "设置新的网络服务顺序..."
    if networksetup -ordernetworkservices "${new_order[@]}"; then
        log_success "网络服务顺序已更新,Wi-Fi 现在为第一位"

        # 显示新的顺序
        echo ""
        log_info "新的网络服务顺序:"
        networksetup -listnetworkserviceorder | grep -E '^\([0-9]+\)' | while read -r line; do
            echo "  $line"
        done
        echo ""
        return 0
    else
        log_error "网络服务顺序更新失败"
        return 1
    fi
}

# 显示网络服务顺序
display_service_order() {
    echo ""
    log_info "当前网络服务顺序:"
    echo "----------------------------------------"
    networksetup -listnetworkserviceorder | grep -E '^\([0-9]+\)' | while read -r line; do
        echo "  $line"
    done
    echo "----------------------------------------"
}

# 调整路由优先级(确保Wi-Fi优先)
adjust_route_priority() {
    if [ "$REMOVE_INTRANET_DEFAULT_ROUTE" != true ]; then
        log_info "内网默认路由删除已禁用,跳过路由优先级调整"
        return 0
    fi

    log_info "调整路由优先级,确保Wi-Fi优先访问..."

    # 获取当前默认路由
    local default_routes
    default_routes=$(netstat -nr -f inet | grep '^default' | awk '{print $2 " " $4}')

    if [ -z "$default_routes" ]; then
        log_warning "未找到默认路由"
        return 0
    fi

    # 检查是否有多个默认路由
    local route_count
    route_count=$(echo "$default_routes" | wc -l | tr -d ' ')

    if [ "$route_count" -le 1 ]; then
        log_success "只有一个默认路由,无需调整"
        return 0
    fi

    log_info "发现 $route_count 个默认路由,正在调整..."

    # 查找内网网关的默认路由(172.16.9.126)
    local intranet_route
    intranet_route=$(echo "$default_routes" | grep "172.16.9.126")

    if [ -n "$intranet_route" ]; then
        local intranet_interface
        intranet_interface=$(echo "$intranet_route" | awk '{print $2}')

        log_info "删除内网默认路由: 172.16.9.126 (接口: $intranet_interface)"

        # 删除内网默认路由
        if sudo route delete default 172.16.9.126 >/dev/null 2>&1; then
            log_success "内网默认路由已删除"

            # 等待一下,让系统稳定
            sleep 1

            # 验证删除结果
            local remaining_routes
            remaining_routes=$(netstat -nr -f inet | grep '^default' | awk '{print "  - "$2 " -> " $4}')

            if [ -n "$remaining_routes" ]; then
                echo ""
                log_info "当前默认路由:"
                echo "$remaining_routes"
            fi
        else
            log_error "内网默认路由删除失败"
            return 1
        fi
    else
        log_success "未找到内网默认路由,无需删除"
    fi

    echo ""
    return 0
}

# 显示路由优先级信息
display_route_priority() {
    echo ""
    log_info "路由优先级状态:"
    echo "----------------------------------------"

    # 显示所有默认路由
    local default_routes
    default_routes=$(netstat -nr -f inet | grep '^default')

    if [ -n "$default_routes" ]; then
        echo "默认路由:"
        echo "$default_routes" | while read -r line; do
            echo "  $line"
        done
    else
        echo "未找到默认路由"
    fi

    echo ""
    echo "内网特定路由:"
    netstat -nr -f inet | grep -E "90\.90\.90|172\.16\.[0-9]" | head -5 | while read -r line; do
        echo "  $line"
    done

    echo "----------------------------------------"
}

# 测试网络连通性
test_connectivity() {
    log_info "测试网络连通性..."
    echo ""
    
    # 测试默认网关
    echo -n "  默认网关 ($DEFAULT_GATEWAY): "
    if check_reachability "$DEFAULT_GATEWAY"; then
        log_success "可达"
    else
        log_error "不可达"
    fi
    
    # 测试目标网关
    echo -n "  目标网关 ($TARGET_GATEWAY): "
    if check_reachability "$TARGET_GATEWAY"; then
        log_success "可达"
    else
        log_error "不可达"
    fi
    
    # 测试其他目标
    for target_info in "${TEST_TARGETS[@]}"; do
        IFS=':' read -r ip desc <<< "$target_info"
        echo -n "  $desc ($ip): "
        if check_reachability "$ip"; then
            log_success "可达"
        else
            log_error "不可达"
        fi
    done
    
    echo ""
}

# 创建清理脚本
create_cleanup_script() {
    local cleanup_file="/tmp/cleanup_routes.sh"

    cat > "$cleanup_file" << EOF
#!/bin/bash
# 自动生成的路由清理脚本
# 生成时间: $(date)

echo "清理静态路由..."

# 清理所有配置的路由
EOF

    for route in "${STATIC_ROUTES[@]}"; do
        [[ "$route" =~ ^[[:space:]]*# ]] && continue
        [[ -z "$route" ]] && continue
        echo "sudo route delete -net $route 2>/dev/null" >> "$cleanup_file"
    done

    # 清理 AX88x72A 相关路由
    echo "sudo route delete -host $TARGET_GATEWAY 2>/dev/null" >> "$cleanup_file"

    # 添加 DNS 清理功能
    cat >> "$cleanup_file" << 'EOF'

echo ""
echo "恢复 DNS 配置..."

# 获取当前网络服务名称
SERVICE_NAME=$(networksetup -listallnetworkservices | grep -E 'Wi-Fi|AirPort|Ethernet' | head -1)

if [ -n "$SERVICE_NAME" ]; then
    echo "网络服务: $SERVICE_NAME"

    # 恢复为自动获取 DNS
    if networksetup -setdnsservers "$SERVICE_NAME" "Empty"; then
        echo "✓ DNS 配置已恢复为自动获取"
    else
        echo "✗ DNS 配置恢复失败"
    fi

    # 清除搜索域
    if networksetup -setsearchdomains "$SERVICE_NAME" "Empty"; then
        echo "✓ 搜索域已清除"
    fi

    # 刷新 DNS 缓存
    if dscacheutil -flushcache; then
        echo "✓ DNS 缓存已刷新"
    fi
else
    echo "无法获取网络服务信息"
fi

echo ""
echo "注意:网络服务顺序需要手动恢复"
echo "如需恢复网络服务顺序,请执行:"
echo "  sudo networksetup -listnetworkserviceorder"
echo "  # 然后使用 -ordernetworkservices 命令恢复原始顺序"
echo ""

echo "路由清理完成!"
echo ""
echo "当前路由表:"
netstat -rn | grep -E '172\.16|90\.90\.90' | head -10

echo ""
echo "当前 DNS 配置:"
if [ -n "$SERVICE_NAME" ]; then
    echo "DNS 服务器:"
    networksetup -getdnsservers "$SERVICE_NAME" | while read -r line; do
        echo "  $line"
    done
fi

echo ""
echo "当前网络服务顺序:"
networksetup -listnetworkserviceorder | grep -E '^\([0-9]+\)'
EOF

    chmod +x "$cleanup_file"
    log_success "已创建清理脚本: $cleanup_file"
}

# 显示配置摘要
display_summary() {
    echo ""
    echo "========================================"
    log_success "路由和 DNS 配置完成!"
    echo "========================================"
    echo ""
    echo "配置摘要:"
    echo "  目标网关: $TARGET_GATEWAY"
    echo "  已配置路由:"
    for route in "${STATIC_ROUTES[@]}"; do
        [[ "$route" =~ ^[[:space:]]*# ]] && continue
        [[ -z "$route" ]] && continue
        echo "    - $route -> $TARGET_GATEWAY"
    done
    echo "  默认网关: $DEFAULT_GATEWAY (用于其他流量)"
    echo ""

    if [ "$REMOVE_INTRANET_DEFAULT_ROUTE" = true ]; then
        echo "  路由优先级: Wi-Fi 优先(已删除内网默认路由)"
    else
        echo "  路由优先级: 保持系统默认"
    fi

    if [ "$SET_WIFI_FIRST" = true ]; then
        echo "  网络服务顺序: Wi-Fi 已设置为第一位"
    else
        echo "  网络服务顺序: 保持原样"
    fi
    echo ""

    if [ "$ENABLE_INTRANET_DNS" = true ]; then
        echo "  DNS 配置:"
        echo "    - 内网 DNS 服务器:"
        for dns in "${INTRANET_DNS_SERVERS[@]}"; do
            [[ "$dns" =~ ^[[:space:]]*# ]] && continue
            [[ -z "$dns" ]] && continue
            echo "      • $dns"
        done
        echo "    - 外网 DNS 服务器:"
        for dns in "${EXTERNAL_DNS_SERVERS[@]}"; do
            [[ "$dns" =~ ^[[:space:]]*# ]] && continue
            [[ -z "$dns" ]] && continue
            echo "      • $dns"
        done
        if [ ${#DNS_SEARCH_DOMAINS[@]} -gt 0 ]; then
            echo "    - 搜索域:"
            for domain in "${DNS_SEARCH_DOMAINS[@]}"; do
                [[ "$domain" =~ ^[[:space:]]*# ]] && continue
                [[ -z "$domain" ]] && continue
                echo "      • $domain"
            done
        fi
    else
        echo "  DNS 配置: 已禁用"
    fi

    echo ""
    echo "使用提示:"
    echo "  • 清理路由和 DNS: /tmp/cleanup_routes.sh"
    echo "  • 查看路由: netstat -rn"
    echo "  • 查看网络服务顺序: networksetup -listnetworkserviceorder"
    echo "  • 查看 DNS: networksetup -getdnsservers 'Wi-Fi'"
    echo "  • 编辑配置: 修改此脚本顶部的配置区域"
    echo "  • 注意: 清理脚本不会自动恢复网络服务顺序"
    echo ""
}

#==============================================================================
# 主程序
#==============================================================================

main() {
    echo "========================================"
    echo "  macOS 静态路由配置工具"
    echo "========================================"
    echo ""
    
    # 1. 检查权限
    check_root
    
    # 2. 获取网络信息
    log_info "检测网络配置..."
    WIFI_INTERFACE=$(get_wifi_interface)
    DEFAULT_GATEWAY=$(get_default_gateway)
    
    if [ -z "$WIFI_INTERFACE" ]; then
        log_error "无法检测到 Wi-Fi 接口"
        exit 1
    fi
    log_success "Wi-Fi 接口: $WIFI_INTERFACE"
    
    if [ -z "$DEFAULT_GATEWAY" ]; then
        log_error "无法获取默认网关,请检查网络连接"
        exit 1
    fi
    log_success "默认网关: $DEFAULT_GATEWAY"
    echo ""
    
    # 3. 检查目标网关可达性
    log_info "检查目标网关 $TARGET_GATEWAY 是否可达..."
    if ! check_reachability "$TARGET_GATEWAY"; then
        log_warning "目标网关 $TARGET_GATEWAY 不可达"
        
        if [ "$REQUIRE_GATEWAY_REACHABLE" = true ]; then
            log_error "配置要求网关必须可达,操作已取消"
            exit 1
        fi
        
        echo -n "是否继续配置?(y/N): "
        read -r response
        if [[ ! "$response" =~ ^[Yy]$ ]]; then
            log_info "操作已取消"
            exit 0
        fi
    else
        log_success "目标网关可达"
    fi
    echo ""
    
    # 4. 清理旧路由
    cleanup_existing_routes
    echo ""

    # 5. 为 AX88x72A 硬件端口添加路由
    add_ax88x72a_route

    # 6. 添加新路由
    add_static_routes
    echo ""

    # 7. 调整路由优先级(确保Wi-Fi优先)
    adjust_route_priority

    # 8. 调整网络服务顺序(Wi-Fi 优先)
    set_wifi_first_priority

    # 9. 配置 DNS
    configure_dns

    # 10. 验证默认路由
    verify_default_route "$DEFAULT_GATEWAY"

    # 11. 显示路由表
    display_routes

    # 12. 显示路由优先级信息
    display_route_priority

    # 13. 显示网络服务顺序
    display_service_order

    # 14. 显示 DNS 配置
    display_dns_config

    # 15. 测试连通性
    test_connectivity
    
    # 16. 创建清理脚本
    create_cleanup_script
    
    # 17. 显示摘要
    display_summary
}

# 执行主程序
main "$@"

执行后截图