#!/bin/bash # Debian 12 网络配置脚本 # 网络优化和配置 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 配置 DNS configure_dns() { log_info "配置 DNS 服务器..." # 备份原始 resolv.conf cp /etc/resolv.conf /etc/resolv.conf.backup # 配置国内 DNS 服务器 cat > /etc/resolv.conf << 'EOF' # EM Script Library - DNS Configuration nameserver 223.5.5.5 # AliDNS nameserver 223.6.6.6 # AliDNS nameserver 119.29.29.29 # DNSPod nameserver 182.254.116.116 # DNSPod nameserver 114.114.114.114 # 114DNS nameserver 8.8.8.8 # Google DNS (fallback) nameserver 1.1.1.1 # Cloudflare DNS (fallback) EOF # 防止网络管理器覆盖 DNS 配置 if [[ -f /etc/NetworkManager/NetworkManager.conf ]]; then sed -i '/\[main\]/a dns=none' /etc/NetworkManager/NetworkManager.conf systemctl restart NetworkManager fi log_success "DNS 配置完成" } # 测试 DNS 解析速度 test_dns_speed() { log_info "测试 DNS 解析速度..." local domains=("www.baidu.com" "www.qq.com" "www.taobao.com" "www.github.com") local dns_servers=( "223.5.5.5|AliDNS" "119.29.29.29|DNSPod" "114.114.114.114|114DNS" "8.8.8.8|Google" "1.1.1.1|Cloudflare" ) echo "DNS 服务器性能测试:" echo "==========================================" for dns_server in "${dns_servers[@]}"; do local server=$(echo "$dns_server" | cut -d'|' -f1) local name=$(echo "$dns_server" | cut -d'|' -f2) local total_time=0 local success_count=0 for domain in "${domains[@]}"; do local start_time=$(date +%s%N) if nslookup "$domain" "$server" >/dev/null 2>&1; then local end_time=$(date +%s%N) local time_diff=$(( (end_time - start_time) / 1000000 )) total_time=$((total_time + time_diff)) success_count=$((success_count + 1)) fi done if [[ $success_count -gt 0 ]]; then local avg_time=$((total_time / success_count)) printf "%-12s %-10s %dms (成功: %d/%d)\n" "$server" "$name" "$avg_time" "$success_count" "${#domains[@]}" else printf "%-12s %-10s 失败\n" "$server" "$name" fi done log_success "DNS 测试完成" } # 配置网络接口 configure_interfaces() { log_info "配置网络接口..." # 获取网络接口信息 local interfaces=$(ip -o link show | awk -F': ' '{print $2}' | grep -v lo) for interface in $interfaces; do log_info "配置接口: $interface" # 创建网络接口配置 cat > "/etc/network/interfaces.d/$interface" << EOF # EM Script Library - Network Interface Configuration auto $interface iface $interface inet dhcp # DNS 配置 dns-nameservers 223.5.5.5 223.6.6.6 119.29.29.29 dns-search local # MTU 设置 (可选) # mtu 1500 EOF done log_success "网络接口配置完成" } # 配置网络代理 configure_proxy() { local proxy_type="$1" local proxy_host="$2" local proxy_port="$3" if [[ -z "$proxy_host" || -z "$proxy_port" ]]; then log_error "请提供代理主机和端口" echo "用法: $0 proxy <类型> <主机> <端口>" echo "类型: http, https, socks5" return 1 fi log_info "配置 $proxy_type 代理: $proxy_host:$proxy_port" case $proxy_type in http) export http_proxy="http://$proxy_host:$proxy_port" export https_proxy="http://$proxy_host:$proxy_port" ;; https) export http_proxy="https://$proxy_host:$proxy_port" export https_proxy="https://$proxy_host:$proxy_port" ;; socks5) export http_proxy="socks5://$proxy_host:$proxy_port" export https_proxy="socks5://$proxy_host:$proxy_port" ;; *) log_error "不支持的代理类型: $proxy_type" return 1 ;; esac # 配置系统代理 cat > /etc/environment << EOF # EM Script Library - System Proxy Configuration http_proxy=$http_proxy https_proxy=$https_proxy ftp_proxy=$http_proxy no_proxy=localhost,127.0.0.1,::1,.local EOF # 配置 apt 代理 cat > /etc/apt/apt.conf.d/99proxy << EOF # EM Script Library - APT Proxy Configuration Acquire::http::Proxy "$http_proxy"; Acquire::https::Proxy "$https_proxy"; EOF # 配置 wget 代理 cat > /root/.wgetrc << EOF # EM Script Library - Wget Proxy Configuration http_proxy=$http_proxy https_proxy=$https_proxy EOF # 配置 curl 代理 cat > /root/.curlrc << EOF # EM Script Library - Curl Proxy Configuration proxy=$http_proxy EOF log_success "代理配置完成" } # 移除代理配置 remove_proxy() { log_info "移除代理配置..." unset http_proxy https_proxy ftp_proxy no_proxy rm -f /etc/environment rm -f /etc/apt/apt.conf.d/99proxy rm -f /root/.wgetrc rm -f /root/.curlrc log_success "代理配置已移除" } # 测试网络连接 test_network() { log_info "测试网络连接..." local test_hosts=( "223.5.5.5|阿里DNS" "www.baidu.com|百度" "www.qq.com|腾讯" "www.github.com|GitHub" "registry.npmmirror.com|NPM镜像" "pypi.tuna.tsinghua.edu.cn|PyPI镜像" ) echo "网络连接测试:" echo "==========================================" for host_info in "${test_hosts[@]}"; do local host=$(echo "$host_info" | cut -d'|' -f1) local name=$(echo "$host_info" | cut -d'|' -f2) if ping -c 3 -W 3 "$host" >/dev/null 2>&1; then local ping_time=$(ping -c 3 "$host" | tail -1 | awk '{print $4}' | cut -d'/' -f2) printf "%-30s ✓ %s ms\n" "$name ($host)" "$ping_time" else printf "%-30s ✗ 连接失败\n" "$name ($host)" fi done log_success "网络测试完成" } # 配置 IPv6 configure_ipv6() { log_info "配置 IPv6 支持..." # 启用 IPv6 sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*/& ipv6.disable=0/' /etc/default/grub sed -i 's/GRUB_CMDLINE_LINUX="[^"]*/& ipv6.disable=0/' /etc/default/grub update-grub # 配置 sysctl IPv6 参数 cat >> /etc/sysctl.d/99-custom.conf << 'EOF' # IPv6 configuration net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 net.ipv6.conf.lo.disable_ipv6 = 0 EOF sysctl -p log_success "IPv6 配置完成,重启后生效" } # 显示网络信息 show_network_info() { log_info "网络配置信息:" echo "=== 网络接口 ===" ip addr show echo "" echo "=== 路由表 ===" ip route show echo "" echo "=== DNS 配置 ===" cat /etc/resolv.conf echo "" echo "=== 网络连接 ===" ss -tuln echo "" echo "=== 网络统计 ===" ip -s link } # 显示帮助信息 show_help() { cat << EOF Debian 12 网络配置工具 用法: $0 [选项] [操作] 操作: dns 配置 DNS 服务器 dns-test 测试 DNS 解析速度 interfaces 配置网络接口 proxy 配置网络代理 remove-proxy 移除代理配置 network-test 测试网络连接 ipv6 配置 IPv6 支持 info 显示网络信息 选项: -h, --help 显示此帮助信息 示例: $0 dns # 配置 DNS $0 proxy http 127.0.0.1 8080 # 配置 HTTP 代理 $0 network-test # 测试网络连接 $0 info # 显示网络信息 EOF } # 主函数 main() { local action="$1" case $action in dns) configure_dns ;; dns-test) test_dns_speed ;; interfaces) configure_interfaces ;; proxy) shift configure_proxy "$@" ;; remove-proxy) remove_proxy ;; network-test) test_network ;; ipv6) configure_ipv6 ;; info) show_network_info ;; ""|-h|--help) show_help ;; *) log_error "未知操作: $action" show_help exit 1 ;; esac log_success "网络配置完成!" } # 执行主函数 main "$@"