From bb360025bb8beddcbfee785817cf75ae6ef5c3ff Mon Sep 17 00:00:00 2001 From: baichal Date: Wed, 24 Jun 2026 12:28:43 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=86=E6=9E=90=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E5=92=8C=E8=BD=AC=E5=8F=91=E5=8A=A0=E9=80=9F=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: traeagent --- socat.sh | 314 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 191 insertions(+), 123 deletions(-) diff --git a/socat.sh b/socat.sh index dcba3aa..0baca6c 100644 --- a/socat.sh +++ b/socat.sh @@ -875,16 +875,26 @@ get_random_unused_port() { create_systemd_service() { local name=$1 local command=$2 + + # 检查服务是否已存在且正在运行,若运行则先停止 + if systemctl is-active --quiet "$name" 2>/dev/null; then + systemctl stop "$name" 2>/dev/null + fi + cat > /etc/systemd/system/${name}.service < "$backup_file" + for key in "${all_keys[@]}"; do + local current_val=$(sysctl -n "$key" 2>/dev/null) + if [[ -n "$current_val" ]]; then + echo "$key = $current_val" >> "$backup_file" + fi + done + return 0 + } + + # 从 /etc/sysctl.conf 中清理所有相关配置 + cleanup_sysctl_conf() { + for key in "${all_keys[@]}"; do + sed -i "/${key//\./\\.}/d" /etc/sysctl.conf + done + } if [[ "$action" == "enable" ]]; then - message="端口转发加速已开启" + # 先备份原始配置 + backup_current_config - # 额外处理BBR + # 清理 sysctl.conf 中旧的相关配置 + cleanup_sysctl_conf + + # 启用 BBR check_and_enable_bbr - # 应用加速配置 + # 应用加速参数 + local applied=0 for key in "${!acceleration_configs[@]}"; do - sysctl -w "${key}=${acceleration_configs[$key]}" >/dev/null 2>&1 - echo "${key} = ${acceleration_configs[$key]}" >> /etc/sysctl.conf + if sysctl -w "${key}=${acceleration_configs[$key]}" >/dev/null 2>&1; then + applied=$((applied + 1)) + fi done - else - message="端口转发加速已关闭" - # 应用默认配置 - for key in "${!default_configs[@]}"; do - sysctl -w "${key}=${default_configs[$key]}" >/dev/null 2>&1 - echo "${key} = ${default_configs[$key]}" >> /etc/sysctl.conf + # 写入 sysctl.conf 持久化 + for key in "${!acceleration_configs[@]}"; do + echo "$key = ${acceleration_configs[$key]}" >> /etc/sysctl.conf done - fi - - sysctl -p >/dev/null 2>&1 - - # 输出结果 - if [[ "$action" == "enable" ]]; then - echo -e "${Green}${message}${Font}" + + # 重新加载 sysctl.conf 确保生效 + sysctl -p >/dev/null 2>&1 + + echo -e "${Green}端口转发加速已开启${Font} (已优化 $applied 项参数)" + else - echo -e "${Yellow}${message}${Font}" + # 关闭加速 - 优先从备份恢复 + local restored_ok=false + + if [ -f "$backup_file" ]; then + echo -e "${Yellow}正在从备份恢复原始网络配置...${Font}" + + # 清理 sysctl.conf 中相关配置 + cleanup_sysctl_conf + + # 应用备份值 + local restored_count=0 + while IFS='=' read -r key value; do + key=$(echo "$key" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + value=$(echo "$value" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + [[ -z "$key" || "$key" == \#* ]] && continue + sysctl -w "$key=$value" >/dev/null 2>&1 && restored_count=$((restored_count + 1)) + echo "$key = $value" >> /etc/sysctl.conf + done < "$backup_file" + + sysctl -p >/dev/null 2>&1 + + if [[ $restored_count -gt 0 ]]; then + restored_ok=true + # 删除备份文件,表示已恢复 + rm -f "$backup_file" + echo -e "${Green}端口转发加速已关闭${Font} (已恢复 $restored_count 项原始配置)" + fi + fi + + # 如果备份恢复失败,使用内置默认值作为兜底 + if [[ "$restored_ok" != true ]]; then + echo -e "${Yellow}未找到原始配置备份,使用系统默认值恢复...${Font}" + + cleanup_sysctl_conf + + local -A fallback_defaults=( + ["net.ipv4.tcp_fastopen"]="0" + ["net.ipv4.tcp_congestion_control"]="cubic" + ["net.core.default_qdisc"]="pfifo_fast" + ["net.ipv4.tcp_slow_start_after_idle"]="1" + ["net.ipv4.tcp_mtu_probing"]="0" + ["net.core.rmem_max"]="212992" + ["net.core.wmem_max"]="212992" + ["net.ipv4.tcp_rmem"]="4096 87380 6291456" + ["net.ipv4.tcp_wmem"]="4096 16384 4194304" + ["net.ipv4.tcp_mem"]="378651 504868 757299" + ["net.core.netdev_max_backlog"]="1000" + ["net.core.netdev_budget"]="300" + ["net.ipv4.tcp_max_syn_backlog"]="128" + ["net.ipv4.tcp_tw_reuse"]="0" + ["net.ipv4.tcp_fin_timeout"]="60" + ["net.ipv4.tcp_keepalive_time"]="7200" + ["net.ipv4.tcp_keepalive_intvl"]="75" + ["net.ipv4.tcp_keepalive_probes"]="9" + ["net.ipv4.tcp_max_tw_buckets"]="180000" + ["net.ipv4.tcp_syncookies"]="1" + ["net.ipv4.tcp_rfc1337"]="0" + ["net.ipv4.tcp_sack"]="1" + ["net.ipv4.tcp_fack"]="1" + ["net.ipv4.tcp_window_scaling"]="1" + ["net.ipv4.tcp_adv_win_scale"]="1" + ["net.ipv4.tcp_moderate_rcvbuf"]="1" + ["net.ipv4.tcp_no_metrics_save"]="0" + ["net.ipv4.tcp_timestamps"]="1" + ["net.ipv4.tcp_ecn"]="2" + ["net.core.optmem_max"]="20480" + ["net.ipv4.tcp_notsent_lowat"]="4294967295" + ["net.ipv4.ip_local_port_range"]="32768 60999" + ["net.ipv4.tcp_max_orphans"]="8192" + ["net.ipv4.tcp_abort_on_overflow"]="0" + ["net.core.somaxconn"]="128" + ) + + local restored=0 + for key in "${!fallback_defaults[@]}"; do + if sysctl -w "${key}=${fallback_defaults[$key]}" >/dev/null 2>&1; then + restored=$((restored + 1)) + fi + echo "$key = ${fallback_defaults[$key]}" >> /etc/sysctl.conf + done + + sysctl -p >/dev/null 2>&1 + + echo -e "${Yellow}端口转发加速已关闭${Font} (已恢复 $restored 项默认配置)" + fi fi }