-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
165 lines (139 loc) · 5.98 KB
/
install.sh
File metadata and controls
165 lines (139 loc) · 5.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/bin/sh
# 脚本: SmartDNS 最终安装、配置与 DNS 锁定脚本
# 功能: 自动完成 SmartDNS 的完整部署,包括安装、服务化配置以及
# 将系统 DNS 解析锁定到本地实例。
# 如果任何命令执行失败,立即退出脚本
set -e
# ==============================================================================
# 第 1 部分: 系统检测与 SmartDNS 二进制文件下载
# ==============================================================================
echo "=== 步骤 1: 检测操作系统 ==="
if [ -f /etc/os-release ]; then
. /etc/os-release
if [ "$ID" != "alpine" ]; then
echo "错误: 此脚本仅适用于 Alpine Linux。" >&2
exit 1
fi
echo "检测到 Alpine Linux,版本: $VERSION_ID。继续执行。"
else
echo "错误: 无法确定操作系统类型。" >&2
exit 1
fi
echo "=== 步骤 2: 检查依赖工具 ==="
if ! command -v wget >/dev/null; then
echo "缺少依赖工具: wget。正在尝试安装..."
apk update
apk add wget
fi
echo "依赖工具已满足。"
echo "=== 步骤 3: 检测 CPU 架构 ==="
ARCH=$(uname -m)
SMARTDNS_FILE=""
case "$ARCH" in
x86_64) SMARTDNS_FILE="smartdns-x86_64"; echo "检测到 x86_64 架构。" ;;
i386 | i686 | x86) SMARTDNS_FILE="smartdns-x86"; echo "检测到 x86 (32-bit) 架构。" ;;
aarch64) SMARTDNS_FILE="smartdns-aarch64"; echo "检测到 AArch64 (ARM 64-bit) 架构。" ;;
arm*) SMARTDNS_FILE="smartdns-arm"; echo "检测到 ARM 架构。" ;;
*) echo "错误: 不支持的 CPU 架构: $ARCH" >&2; exit 1 ;;
esac
echo "=== 步骤 4: 下载最新版 SmartDNS 二进制文件 ==="
DEST_DIR="/usr/sbin"
DEST_FILE="$DEST_DIR/smartdns"
API_URL="https://api.github.com/repos/pymumu/smartdns/releases/latest"
echo "正在从 GitHub API 获取最新版本信息..."
DOWNLOAD_URL=$(wget -qO- "$API_URL" | \
grep "browser_download_url" | \
grep "$SMARTDNS_FILE" | \
cut -d '"' -f 4)
if [ -z "$DOWNLOAD_URL" ]; then
echo "错误: 无法找到适用于 '$SMARTDNS_FILE' 的下载链接。" >&2
exit 1
fi
echo "找到下载链接,正在下载到 $DEST_FILE ..."
wget -qO "$DEST_FILE" "$DOWNLOAD_URL"
echo "下载成功。"
chmod +x "$DEST_FILE"
echo "已为 $DEST_FILE 添加可执行权限。"
# ==============================================================================
# 第 2 部分: 下载配置文件并设置 OpenRC 服务
# ==============================================================================
echo "\n=== 步骤 5: 下载配置文件和更新脚本 ==="
CONFIG_DIR="/etc/smartdns"
mkdir -p "$CONFIG_DIR"
echo "已创建目录: $CONFIG_DIR"
echo "正在下载 smartdns.conf..."
wget -qO "$CONFIG_DIR/smartdns.conf" "https://raw.githubusercontent.com/ddd-zero/smartdns_install/refs/heads/main/smartdns.conf"
echo "正在下载 dns_update.sh..."
wget -qO "$CONFIG_DIR/dns_update.sh" "https://raw.githubusercontent.com/ddd-zero/smartdns_install/refs/heads/main/dns_update.sh"
chmod +x "$CONFIG_DIR/dns_update.sh"
echo "配置文件和脚本下载完成,并已设置权限。"
echo "=== 步骤 6: 安装并配置 OpenRC ==="
echo "正在更新包列表并安装 openrc..."
apk update
apk add openrc --no-cache
echo "OpenRC 安装完成。"
echo "=== 步骤 7: 创建 OpenRC 服务文件 ==="
cat << 'EOF' > /etc/init.d/smartdns
#!/sbin/openrc-run
description="A lightweight and fast DNS forwarder (SmartDNS)"
command="/usr/sbin/smartdns"
command_args="-c /etc/smartdns/smartdns.conf"
pidfile="/run/smartdns.pid"
depend() {
after firewall
}
start_post() {
ebegin "Updating SmartDNS custom rules"
/etc/smartdns/dns_update.sh
eend $? "Failed to update SmartDNS rules"
}
EOF
echo "服务文件 /etc/init.d/smartdns 创建成功。"
chmod +x /etc/init.d/smartdns
echo "=== 步骤 8: 启用并启动 SmartDNS 服务 ==="
echo "将 smartdns 服务添加到默认运行级别..."
rc-update add smartdns default
echo "正在启动 smartdns 服务(如果已在运行则重启)..."
rc-service smartdns restart
# ==============================================================================
# 第 3 部分: 锁定系统 DNS 解析到 SmartDNS
# ==============================================================================
echo "=== 步骤 9: 锁定系统 DNS 解析 ==="
IF_FILE="/etc/network/interfaces"
if [ -f "$IF_FILE" ]; then
echo "找到网络配置文件: $IF_FILE。"
# 检查是否已配置
# 注意: 这个检查比较简单,只检查文件里任何地方是否有这一行
if grep -q "^\s*dns-nameservers 127.0.0.1" "$IF_FILE"; then
echo "DNS 已配置为 127.0.0.1,跳过修改。"
else
echo "正在为 eth0 添加 'dns-nameservers 127.0.0.1'..."
# 在以 'iface eth0' 开头的行后追加 DNS 配置,并保持缩进
sed -i "/^\s*iface eth0 inet/a \ dns-nameservers 127.0.0.1" "$IF_FILE"
echo "网络配置文件修改成功。"
fi
echo "=== 步骤 10: 禁用 DHCP 的 DNS 覆盖 ==="
mkdir -p /etc/udhcpc
echo "RESOLV_CONF=no" > /etc/udhcpc/udhcpc.conf
echo "已创建 /etc/udhcpc/udhcpc.conf 以防止 DNS 被覆盖。"
echo "=== 步骤 11: 重启网络服务以应用 DNS 更改 ==="
service networking restart
echo "网络服务已重启。"
else
echo "警告: 未找到 /etc/network/interfaces 文件。"
echo "这是标准的 Alpine 网络配置文件,如果您的系统使用其他方式管理网络,"
echo "请手动将您的 DNS 服务器设置为 127.0.0.1。"
echo "您可以尝试直接修改 /etc/resolv.conf 并设置写保护:"
echo " echo 'nameserver 127.0.0.1' > /etc/resolv.conf"
echo " chattr +i /etc/resolv.conf"
fi
# ==============================================================================
# 完成
# ==============================================================================
echo "========================================="
echo " 所有步骤已成功完成! "
echo "========================================="
echo "SmartDNS 版本:"
/usr/sbin/smartdns -v
echo "服务状态:"
rc-service smartdns status