em-script/scripts/network/configure_network.sh

364 lines
8.5 KiB
Bash

#!/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 "$@"