-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathwg-ikuai-client-gen.sh
More file actions
executable file
·304 lines (252 loc) · 11.3 KB
/
Copy pathwg-ikuai-client-gen.sh
File metadata and controls
executable file
·304 lines (252 loc) · 11.3 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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
#!/bin/bash
# WireGuard 配置生成脚本
# 用途: 为其他机器生成 WireGuard 配置文件,支持爱快路由器格式
# 使用方法: ./generate_wg_config.sh
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${GREEN}╔════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ WireGuard 配置文件生成工具 ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════╝${NC}\n"
# 检查 WireGuard 工具是否安装
if ! command -v wg &> /dev/null; then
echo -e "${RED}✗ 错误: 未找到 WireGuard 工具${NC}"
echo -e "请先安装: ${YELLOW}sudo apt install wireguard-tools${NC}"
exit 1
fi
# 自动加载环境变量文件
if [[ -f "wg.env" ]]; then
echo -e "${GREEN}✓ 检测到 wg.env 文件,正在加载环境变量...${NC}\n"
source wg.env
fi
# 显示环境变量提示
echo -e "${BLUE}提示: 可通过以下环境变量设置默认值:${NC}"
echo -e " WG_PEER_PUBLIC_KEY - 对端公钥 (爱快服务端公钥)"
echo -e " WG_ENDPOINT - Endpoint地址 (爱快服务器地址)"
echo -e " WG_PRESHARED_KEY - 预共享密钥"
echo -e " WG_ALLOWED_IPS - 允许的IP段 (如局域网+WG网段: 192.168.1.0/24,192.168.199.0/24)"
echo -e " WG_INTERFACE_NAME - 接口名称"
echo -e " WG_IKUAI_INTERFACE - 爱快接口名称"
echo -e " WG_LISTEN_PORT - 监听端口"
echo -e " WG_DNS_SERVER - DNS服务器"
echo -e " WG_KEEPALIVE - Keepalive秒数"
echo ""
# ==================== 配置文件名 ====================
DEFAULT_INTERFACE_NAME="${WG_INTERFACE_NAME:-wg0}"
read -p "配置文件名称 (默认: $DEFAULT_INTERFACE_NAME): " INTERFACE_NAME
INTERFACE_NAME=${INTERFACE_NAME:-$DEFAULT_INTERFACE_NAME}
CONFIG_FILE="${INTERFACE_NAME}.conf"
if [[ -f "$CONFIG_FILE" ]]; then
read -p "文件 $CONFIG_FILE 已存在,是否覆盖? (y/n): " OVERWRITE
if [[ "$OVERWRITE" != "y" ]]; then
echo -e "${YELLOW}操作已取消${NC}"
exit 0
fi
fi
# ==================== 爱快路由器配置 ====================
IKUAI_FILE="peer.txt"
# 获取下一个可用的 ID
if [[ -f "$IKUAI_FILE" ]]; then
LAST_ID=$(grep -oP '^id=\K[0-9]+' "$IKUAI_FILE" | sort -n | tail -1)
NEXT_ID=$((LAST_ID + 1))
else
NEXT_ID=1
fi
read -p "爱快 Peer ID (默认: $NEXT_ID): " IKUAI_ID
IKUAI_ID=${IKUAI_ID:-$NEXT_ID}
DEFAULT_IKUAI_INTERFACE="${WG_IKUAI_INTERFACE:-wg_0}"
read -p "爱快接口名称 (默认: $DEFAULT_IKUAI_INTERFACE): " IKUAI_INTERFACE
IKUAI_INTERFACE=${IKUAI_INTERFACE:-$DEFAULT_IKUAI_INTERFACE}
read -p "备注名称 (如 iphone, macbook): " IKUAI_COMMENT
IKUAI_COMMENT=${IKUAI_COMMENT:-peer$IKUAI_ID}
echo -e "\n${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE} 本地接口配置${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
# ==================== 本地私钥 ====================
read -p "是否自动生成本地密钥对? (y/n, 默认y): " AUTO_GEN
AUTO_GEN=${AUTO_GEN:-y}
if [[ "$AUTO_GEN" == "y" ]]; then
PRIVATE_KEY=$(wg genkey)
PUBLIC_KEY=$(echo "$PRIVATE_KEY" | wg pubkey)
echo -e "${GREEN}✓ 已生成密钥对${NC}"
echo -e " 本地公钥 (提供给对端): ${YELLOW}$PUBLIC_KEY${NC}"
else
read -p "输入本地私钥: " PRIVATE_KEY
if [[ -z "$PRIVATE_KEY" ]]; then
echo -e "${RED}✗ 私钥不能为空${NC}"
exit 1
fi
PUBLIC_KEY=$(echo "$PRIVATE_KEY" | wg pubkey 2>/dev/null || echo "")
if [[ -n "$PUBLIC_KEY" ]]; then
echo -e " 本地公钥: ${YELLOW}$PUBLIC_KEY${NC}"
fi
fi
# ==================== 本地接口IP ====================
while true; do
read -p "本地接口IP地址 (如 10.0.0.2/24 或 192.168.199.5/32): " LOCAL_IP
if [[ -n "$LOCAL_IP" ]]; then
break
fi
echo -e "${RED}✗ IP地址不能为空${NC}"
done
# ==================== 监听端口 ====================
if [[ -n "$WG_LISTEN_PORT" ]]; then
echo -e "监听端口 (环境变量): ${GREEN}$WG_LISTEN_PORT${NC}"
LISTEN_PORT="$WG_LISTEN_PORT"
else
read -p "监听端口 (默认: 51820, 按回车跳过): " LISTEN_PORT
fi
# ==================== DNS服务器 ====================
if [[ -n "$WG_DNS_SERVER" ]]; then
echo -e "DNS服务器 (环境变量): ${GREEN}$WG_DNS_SERVER${NC}"
DNS_SERVER="$WG_DNS_SERVER"
else
read -p "DNS服务器 (如 1.1.1.1,8.8.8.8, 按回车跳过): " DNS_SERVER
fi
echo -e "\n${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE} 对端配置 (爱快服务器)${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
# ==================== 对端公钥 ====================
if [[ -n "$WG_PEER_PUBLIC_KEY" ]]; then
echo -e "爱快服务端公钥 (环境变量): ${GREEN}$WG_PEER_PUBLIC_KEY${NC}"
PEER_PUBLIC_KEY="$WG_PEER_PUBLIC_KEY"
else
while true; do
read -p "爱快服务端公钥: " PEER_PUBLIC_KEY
if [[ -n "$PEER_PUBLIC_KEY" ]]; then
break
fi
echo -e "${RED}✗ 对端公钥不能为空${NC}"
done
fi
# ==================== Endpoint ====================
if [[ -n "$WG_ENDPOINT" ]]; then
echo -e "爱快服务器地址 (环境变量): ${GREEN}$WG_ENDPOINT${NC}"
ENDPOINT="$WG_ENDPOINT"
else
while true; do
read -p "爱快服务器地址 (如 example.com:51820 或 10.4.8.2:51820): " ENDPOINT
if [[ -n "$ENDPOINT" ]]; then
break
fi
echo -e "${RED}✗ Endpoint 不能为空${NC}"
done
fi
# 分离 endpoint IP 和端口(仅用于标准配置)
ENDPOINT_FULL="$ENDPOINT"
# ==================== 预共享密钥 ====================
if [[ -n "$WG_PRESHARED_KEY" ]]; then
echo -e "预共享密钥 (环境变量): ${GREEN}已设置${NC}"
PRESHARED_KEY="$WG_PRESHARED_KEY"
USE_PSK="y"
else
read -p "是否使用预共享密钥 (PSK)? (y/n, 默认n): " USE_PSK
USE_PSK=${USE_PSK:-n}
PRESHARED_KEY=""
if [[ "$USE_PSK" == "y" ]]; then
read -p " 自动生成 PSK? (y/n, 默认y): " AUTO_PSK
AUTO_PSK=${AUTO_PSK:-y}
if [[ "$AUTO_PSK" == "y" ]]; then
PRESHARED_KEY=$(wg genpsk)
echo -e "${GREEN} ✓ 已生成预共享密钥: $PRESHARED_KEY${NC}"
else
read -p " 输入预共享密钥: " PRESHARED_KEY
fi
fi
fi
# ==================== 允许的IP ====================
if [[ -n "$WG_ALLOWED_IPS" ]]; then
echo -e "允许的IP段 (环境变量): ${GREEN}$WG_ALLOWED_IPS${NC}"
ALLOWED_IPS="$WG_ALLOWED_IPS"
else
echo -e "${YELLOW}AllowedIPs 说明:${NC}"
echo -e " - ${GREEN}0.0.0.0/0, ::/0${NC} = 所有流量都走 WireGuard (全局VPN)"
echo -e " - ${GREEN}192.168.1.0/24, 192.168.199.0/24${NC} = 只有访问这些网段时走 WireGuard"
echo -e " - 建议: 填写爱快服务端的局域网网段 + WireGuard网段"
read -p "允许的IP段 (默认: 0.0.0.0/0, ::/0): " ALLOWED_IPS
ALLOWED_IPS=${ALLOWED_IPS:-0.0.0.0/0, ::/0}
fi
# ==================== PersistentKeepalive ====================
if [[ -n "$WG_KEEPALIVE" ]]; then
echo -e "PersistentKeepalive (环境变量): ${GREEN}$WG_KEEPALIVE${NC}"
KEEPALIVE="$WG_KEEPALIVE"
else
read -p "PersistentKeepalive 秒数 (推荐25, 按回车跳过): " KEEPALIVE
fi
# ==================== 生成标准配置文件 ====================
echo -e "\n${YELLOW}正在生成标准配置文件...${NC}"
cat > "$CONFIG_FILE" << EOF
# 本地公钥 (提供给对端): $PUBLIC_KEY
[Interface]
PrivateKey = $PRIVATE_KEY
Address = $LOCAL_IP
EOF
[[ -n "$LISTEN_PORT" ]] && echo "ListenPort = $LISTEN_PORT" >> "$CONFIG_FILE"
[[ -n "$DNS_SERVER" ]] && echo "DNS = $DNS_SERVER" >> "$CONFIG_FILE"
cat >> "$CONFIG_FILE" << EOF
[Peer]
PublicKey = $PEER_PUBLIC_KEY
EOF
[[ -n "$PRESHARED_KEY" ]] && echo "PresharedKey = $PRESHARED_KEY" >> "$CONFIG_FILE"
cat >> "$CONFIG_FILE" << EOF
Endpoint = $ENDPOINT_FULL
AllowedIPs = $ALLOWED_IPS
EOF
[[ -n "$KEEPALIVE" ]] && echo "PersistentKeepalive = $KEEPALIVE" >> "$CONFIG_FILE"
chmod 600 "$CONFIG_FILE"
echo -e "${GREEN}✓ 标准配置文件已生成: $(pwd)/$CONFIG_FILE${NC}"
# ==================== 生成爱快格式配置 ====================
echo -e "\n${YELLOW}正在生成爱快路由器配置...${NC}"
# 提取 AllowedIPs 的第一个IP(通常是本地接口IP,用于爱快的 allowips 字段)
FIRST_ALLOWED_IP="$LOCAL_IP"
# 构建爱快格式的配置行
IKUAI_LINE="id=$IKUAI_ID enabled=yes comment=$IKUAI_COMMENT interface=$IKUAI_INTERFACE"
IKUAI_LINE+=" peer_publickey=$PUBLIC_KEY"
if [[ -n "$PRESHARED_KEY" ]]; then
IKUAI_LINE+=" presharedkey=$PRESHARED_KEY"
else
IKUAI_LINE+=" presharedkey="
fi
IKUAI_LINE+=" allowips=$FIRST_ALLOWED_IP"
IKUAI_LINE+=" endpoint="
IKUAI_LINE+=" endpoint_port="
if [[ -n "$KEEPALIVE" ]]; then
IKUAI_LINE+=" keepalive=$KEEPALIVE"
else
IKUAI_LINE+=" keepalive=25"
fi
# 追加到 peer.txt
echo "$IKUAI_LINE" >> "$IKUAI_FILE"
echo -e "${GREEN}✓ 爱快配置已追加到: $(pwd)/$IKUAI_FILE${NC}"
echo -e "${YELLOW} 客户端公钥 (已添加到爱快): $PUBLIC_KEY${NC}"
# ==================== 显示配置内容 ====================
echo -e "\n${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE} 标准配置文件内容${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
cat "$CONFIG_FILE"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE} 爱快配置内容${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo "$IKUAI_LINE"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
# ==================== 使用说明 ====================
echo -e "${YELLOW}使用说明:${NC}\n"
echo -e "${GREEN}1. 标准配置文件 ($CONFIG_FILE):${NC}"
echo -e " - 用于手机、电脑等客户端"
echo -e " - 可以直接导入 WireGuard 客户端"
echo -e " - 或复制到 Linux: sudo cp $CONFIG_FILE /etc/wireguard/"
echo -e " - 启动: sudo wg-quick up $INTERFACE_NAME\n"
echo -e "${GREEN}2. 爱快配置 (peer.txt):${NC}"
echo -e " - 登录爱快路由器管理界面"
echo -e " - 进入: ${BLUE}网络设置 -> VPN -> WireGuard -> Peer 管理${NC}"
echo -e " - 导入 peer.txt 文件或手动添加"
echo -e " - 客户端公钥: ${YELLOW}$PUBLIC_KEY${NC}"
echo -e " - 允许IP: ${YELLOW}$FIRST_ALLOWED_IP${NC}"
if [[ -n "$PRESHARED_KEY" ]]; then
echo -e " - 预共享密钥: ${YELLOW}$PRESHARED_KEY${NC}"
fi