-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwg-manage.sh
executable file
·301 lines (278 loc) · 10.5 KB
/
wg-manage.sh
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
#!/bin/bash
#############################################################################
# Create By: zhf_sy
# License: GNU GPLv3
# Test On: CentOS 7
#############################################################################
# sh
SH_NAME=${0##*/}
SH_PATH=$( cd "$( dirname "$0" )" && pwd )
cd ${SH_PATH}
# env
. ${SH_PATH}/env.sh
#......
# 本地env
SERVER_PUBKEY=`wg pubkey < ${SERVER_PRIVATE_KEY}` #--- wireguard服务器公钥
# user_config
USER_CONFIG_PATH="${SH_PATH}/user_config_info"
[ ! -d ${USER_CONFIG_PATH} ] && mkdir ${USER_CONFIG_PATH}
#
WG_CURRENT_STATUS_FILE="/tmp/wg-current-status.txt"
WG_STATUS_REPORT_FILE="/tmp/wg-status-report.list"
# sh
FORMAT_TABLE_SH="${SH_PATH}/format_table.sh"
F_HELP()
{
echo "
用途:用于wireguard的用户管理
依赖:./env.sh
qrencode
注意:
用法:
$0 [-h|--help]
$0 [-l|--list]
$0 [-a|--add {用户名}] <{IP第4段}>
$0 [-r|--rm|-o|--output-config {用户名}]
$0 [-R|--reload]
$0 [-s|--status]
参数说明:
\$0 : 代表脚本本身
[] : 代表是必选项
<> : 代表是可选项
| : 代表左右选其一
{} : 代表参数值,请替换为具体参数值
% : 代表通配符,非精确值,可以被包含
#
-h|--help 此帮助
-l|--list 列出现有用户
-a|--add 添加用户
-r|--rm 删除用户
-o|--output-config 输出用户配置文件
-R|--reload 重启服务器
-s|--status 服务器状态
示例:
#
$0 -l #--- 列出用户清单
#
$0 -a 猪猪侠 11 #--- 添加用户【猪猪侠】,IP地址尾号为【11】
$0 -a 猪猪侠 #--- 添加用户【猪猪侠】,IP地址尾号自动分配
#
$0 -r 猪猪侠 #--- 删除用户【猪猪侠】
#
$0 -o 猪猪侠 #--- 输出用户【猪猪侠】的配置文件
#
$0 -R #--- 重启服务器
#
$0 -s #--- 查看服务器状态
"
}
F_SERVER_CONF()
{
#
echo "
## ${USER_NAME} ${USER_IP}
[Peer]
PublicKey = ${USER_PUBKEY}
PresharedKey = ${SERVER_PRE_SHARED_KEY}
AllowedIPs = ${SERVER_ALOWED_IPs}
"
}
F_USER_CONF()
{
#
echo "
## ${USER_NAME} ${USER_IP}
[Interface]
Address = ${USER_IP}/${IP_NETMASK}
PrivateKey = ${USER_PRIVATEKEY}
DNS = ${USER_DNSs}
[Peer]
PublicKey = ${SERVER_PUBKEY}
PresharedKey = ${SERVER_PRE_SHARED_KEY}
Endpoint = ${SERVER_CONNECT_INFO}
PersistentKeepalive = 25
AllowedIPs = ${USER_ALOWED_IPs}
"
}
TEMP=`getopt -o hla:r:o:Rs -l help,list,add:,rm:,output-config:,reload,status -- "$@"`
if [ $? != 0 ]; then
echo -e "\n猪猪侠警告:参数不合法,请查看帮助【$0 --help】\n"
exit 1
fi
#
eval set -- "${TEMP}"
while true
do
case "$1" in
-h|--help)
shift
F_HELP
exit
;;
-l|--list)
shift
grep '^##' ${SERVER_CONF_FILE}
exit
;;
-a|--add)
USER_NAME=$2
shift 2
shift #--- 去掉'--'
IP_SUFFIX=$1
# 是否提供ip尾号
if [ -z "${IP_SUFFIX}" ]; then
# 未提供
grep '##' ${SERVER_CONF_FILE} | cut -d ' ' -f 3 | cut -d '.' -f 4 | sort > /tmp/${SH_NAME}-exist-ip.list
sed -i 's/^/S/; s/$/E/' /tmp/${SH_NAME}-exist-ip.list
# 普通用户IP从11开始分配
for i in {11..254}; do
grep -q "S${i}E" /tmp/${SH_NAME}-exist-ip.list
if [ $? -ne 0 ]; then
IP_SUFFIX=$i
break
fi
done
if [ -z "${IP_SUFFIX}" ]; then
echo -e "\n猪猪侠警告:我艹,IP地址【${IP_PREFIX}.[11~254]】已经用完了!\n"
exit 9
fi
else
# 已提供
grep '##' ${SERVER_CONF_FILE} | grep "${IP_SUFFIX}" | cut -d ' ' -f 3 | cut -d '.' -f 4 > /tmp/${SH_NAME}-search-ip.list
sed -i 's/^/S/; s/$/E/' /tmp/${SH_NAME}-search-ip.list
grep -q "S${IP_SUFFIX}E" /tmp/${SH_NAME}-search-ip.list
if [ $? -eq 0 ]; then
echo -e "\n猪猪侠警告:IP尾号【${IP_SUFFIX}】已经存在,请换一个!\n"
exit 1
fi
fi
USER_IP=${IP_PREFIX}.${IP_SUFFIX}
# 用户是否已存在
grep "##" ${SERVER_CONF_FILE} | grep "${USER_NAME}" | cut -d ' ' -f 2 > /tmp/${SH_NAME}-exist-user.list
sed -i 's/^/S/; s/$/E/' /tmp/${SH_NAME}-exist-user.list
grep -q "S${USER_NAME}E" /tmp/${SH_NAME}-exist-user.list
if [ $? -eq 0 ]; then
echo -e "\n猪猪侠警告:用户【${USER_NAME}】已存在\n"
exit 1
fi
#
SERVER_ALOWED_IPs="${USER_IP}/32"
#
USER_PRIVATEKEY=`wg genkey`
USER_PUBKEY=`echo ${USER_PRIVATEKEY} | wg pubkey`
SERVER_PRE_SHARED_KEY=`wg genpsk`
#
echo "服务器端配置信息:"
echo '------------------------------'
F_SERVER_CONF | tee -a ${SERVER_CONF_FILE}
echo '------------------------------'
echo 'OK'
echo
echo "用户端配置信息:"
echo '------------------------------'
F_USER_CONF | tee ${USER_CONFIG_PATH}/${USER_NAME}.conf.out
echo '------------------------------'
read -p '输出用户配置二维码,请按任意键......' ACK
if [ `which qrencode > /dev/null 2>&1 ; echo $?` -eq 0 ]; then
qrencode -t ANSIUTF8 < ${USER_CONFIG_PATH}/${USER_NAME}.conf.out
else
echo -e "\n猪猪侠警告:没有找到软件【qrencode】,建议安装,这可以以二维码的方式输出配置信息,方便手机用户配置!\n"
fi
echo "OK"
echo
echo "服务器端:需要reload后才会生效"
echo "用户端 :请将上面【用户端配置信息】给到用户"
echo
#
exit
;;
-r|--rm)
USER_NAME=$2
shift 2
# 删除${USER_CONFIG_PATH}目录下用户信息
rm -f ${USER_CONFIG_PATH}/${USER_NAME}.*
# 删除wgN.conf中的配置
if [ `grep -q "## ${USER_NAME} " ${SERVER_CONF_FILE}; echo $?` -ne 0 ]; then
echo -e "\n猪猪侠警告:用户【${USER_NAME}】不存在\n"
exit 1
fi
sed -i "/^## ${USER_NAME} /,/^ *$/d" ${SERVER_CONF_FILE}
# 删除文件末尾的空行
sed -i ':n;/^\n*$/{N;$d;bn}' ${SERVER_CONF_FILE}
echo "OK,你需要reload服务器才能生效"
exit
;;
-o|--output-config)
USER_NAME=$2
shift 2
if [ `grep -q "## ${USER_NAME} " ${SERVER_CONF_FILE}; echo $?` -ne 0 ]; then
echo -e "\n猪猪侠警告:用户【${USER_NAME}】不存在\n"
exit 1
fi
#
echo "【${USER_NAME}】用户配置信息如下:"
echo '------------------------------'
cat ${USER_CONFIG_PATH}/${USER_NAME}.conf.out
echo '------------------------------'
read -p '输出用户配置二维码,请按任意键......' ACK
if [ `which qrencode > /dev/null 2>&1 ; echo $?` -eq 0 ]; then
qrencode -t ANSIUTF8 < ${USER_CONFIG_PATH}/${USER_NAME}.conf.out
else
echo -e "\n猪猪侠警告:没有找到软件【qrencode】,建议安装,这可以以二维码的方式输出配置信息,方便手机用户配置!\n"
fi
echo "OK"
exit
;;
-R|--reload)
shift
wg-quick down ${WG_IF}
wg-quick up ${WG_IF}
exit
;;
-s|--status)
shift
# 采集
wg show "${WG_IF}" dump > "${WG_CURRENT_STATUS_FILE}"
sed -i '1d' "${WG_CURRENT_STATUS_FILE}"
# clean
> ${WG_STATUS_REPORT_FILE}
while read LINE
do
USER_PEER=`echo $LINE | awk '{print $1}'`
USER_PRESHARED_KEY=`echo $LINE | awk '{print $2}'`
USER_ENDPOINT=`echo $LINE | awk '{print $3}'`
USER_ENDPOINT_IP=`echo ${USER_ENDPOINT} | cut -d ':' -f 1`
USER_ALLOWED_IPS=`echo $LINE | awk '{print $4}'`
USER_LATEST_HAND_SECOND=`echo $LINE | awk '{print $5}'`
USER_NET_IN=`echo $LINE | awk '{print $6}'`
USER_NET_OUT=`echo $LINE | awk '{print $7}'`
USER_KEEPALIVE=`echo $LINE | awk '{print $8}'`
# 计算MiB
USER_NET_IN_MiB=`echo "scale=1; ${USER_NET_IN} / 1024 / 1024" | bc -l`
USER_NET_OUT_MiB=`echo "scale=1; ${USER_NET_OUT} / 1024 / 1024" | bc -l`
USER_NET_TOTAL_MiB=`echo "scale=1; ${USER_NET_IN_MiB} + ${USER_NET_OUT_MiB}" | bc -l`
#
# 查用户
USER_NAME=`grep -B 2 ${USER_PEER} ${SERVER_CONF_FILE} | head -n 1 | awk '{print $2}'`
USER_IP=`grep -B 2 ${USER_PEER} ${SERVER_CONF_FILE} | head -n 1 | awk '{print $3}'`
# 是否有握手信息
if [ ${USER_LATEST_HAND_SECOND} -ne 0 ]; then
USER_LATEST_HAND_SECOND_TIME=`date -d @${USER_LATEST_HAND_SECOND} +%H:%M:%S`
# 有握手信息
echo "| ${USER_NAME} | ${USER_LATEST_HAND_SECOND_TIME} | ${USER_NET_TOTAL_MiB} | ${USER_NET_IN_MiB} | ${USER_NET_OUT_MiB} | ${USER_IP} | ${USER_ENDPOINT_IP} | " >> ${WG_STATUS_REPORT_FILE}
fi
done < ${WG_CURRENT_STATUS_FILE}
${FORMAT_TABLE_SH} --delimeter '|' --title '|用户名|最后握手时间|总流量MiB|IN流量MiB|OUT流量MiB|用户IP|远程IP|' --file ${WG_STATUS_REPORT_FILE}
exit
;;
--)
shift
exit
break
;;
*)
echo -e "\n猪猪侠警告:未知参数,请查看帮助【$0 --help】\n"
exit 1
;;
esac
done