forked from secfall/ovpn_install
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathovpn_install.sh
648 lines (607 loc) · 23.6 KB
/
ovpn_install.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
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
#!/bin/bash
# Скрипт установки OpenVPN на операционные системы семейства CentOS
# Этот скрипт будет работать толко на CentOS и, возможно, на его
# производных дистрибутивах
#Основано на https://github.com/Nyr/openvpn-install
#Посвящается @evilmind
if [[ "$EUID" -ne 0 ]]; then
echo "Этот скрипт нужно запускать с правами root"
exit 2
fi
if [[ ! -e /dev/net/tun ]]; then
echo "Не обнаружена поддержка TUN. Включите TUN перед запуском скрипта"
exit 3
fi
if grep -qs "CentOS release 5" "/etc/redhat-release"; then
echo "CentOS 5 слишком старый, установка не возможна"
exit 4
fi
if [[ -e /etc/centos-release || -e /etc/redhat-release ]]; then
OS=centos
GROUPNAME=nobody
RCLOCAL='/etc/rc.d/rc.local'
else
echo "Ваша операционная система не из семейства CentOS"
exit 5
fi
newclient () {
# Создаем файл client.ovpn
cp /etc/openvpn/client-common.txt ~/$1.ovpn
echo "<ca>" >> ~/$1.ovpn
cat /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/ca.crt >> ~/$1.ovpn
echo "</ca>" >> ~/$1.ovpn
echo "<cert>" >> ~/$1.ovpn
cat /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/$1.crt >> ~/$1.ovpn
echo "</cert>" >> ~/$1.ovpn
echo "<key>" >> ~/$1.ovpn
cat /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/$1.key >> ~/$1.ovpn
echo "</key>" >> ~/$1.ovpn
echo "<tls-auth>" >> ~/$1.ovpn
cat /etc/openvpn/ta.key >> ~/$1.ovpn
echo "</tls-auth>" >> ~/$1.ovpn
}
# Пробуем получить наш IP адрес
IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)
if [[ "$IP" = "" ]]; then
IP=$(wget -4qO- "http://whatismyip.akamai.com/")
fi
if [[ -e /etc/openvpn/server.conf ]]; then
while :
do
clear
echo "OpenVPN уже установлен"
echo ""
echo "Что вы хотите сделать?"
echo " 1) Добавить пользователя"
echo " 2) Удалить сущетвующего пользвателя"
echo " 3) Установить прозрачный 3proxy"
echo " 4) Удалить OpenVPN"
echo " 5) Завершить работу скрипта"
read -p "Выберите вариант [1-5]: " option
case $option in
1)
clear
echo ""
echo "Введите имя для сертификата нового пользователя"
echo "Используйте только буквы, никаких спецсимволов"
read -p "Имя пользователя: " -e -i client CLIENT
cd /etc/openvpn/keys/easy-rsa-master/easyrsa3/
./easyrsa build-client-full $CLIENT nopass
# Создаем client.ovpn
newclient "$CLIENT"
echo ""
echo "Пользователь $CLIENT добавлен, конфигурационный файл в текушей папке" ~/"$CLIENT.ovpn"
exit
;;
2)
# Удаляем пользователя
NUMBEROFCLIENTS=$(tail -n +2 /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/index.txt | grep -c "^V")
if [[ "$NUMBEROFCLIENTS" = '0' ]]; then
echo ""
echo "У сервера нет ни одного пользователя!"
exit 6
fi
echo ""
echo "Выберите одного из существующих пользователей"
tail -n +2 /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') '
if [[ "$NUMBEROFCLIENTS" = '1' ]]; then
read -p "Выберите пользователя [1]: " CLIENTNUMBER
else
read -p "Выберите пользователя [1-$NUMBEROFCLIENTS]: " CLIENTNUMBER
fi
CLIENT=$(tail -n +2 /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/index.txt | grep "^V" | cut -d '=' -f 2 | sed -n "$CLIENTNUMBER"p)
cd /etc/openvpn/keys/easy-rsa-master/easyrsa3/
./easyrsa --batch revoke $CLIENT
./easyrsa gen-crl
rm -rf pki/reqs/$CLIENT.req
rm -rf pki/private/$CLIENT.key
rm -rf pki/issued/$CLIENT.crt
rm -rf /etc/openvpn/crl.pem
cp /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/crl.pem /etc/openvpn/crl.pem
chown nobody:$GROUPNAME /etc/openvpn/crl.pem
echo ""
echo "Сертификат пользователя $CLIENT отозван"
exit
;;
3)
# Устанавливаем прозрачный 3proxy
clear
echo ""
echo "Устанавливаем прозрачный 3proxy..."
echo "Какой DNS вы хотите использовать в своей VPN?"
echo " 1) Текущие системные настройки"
echo " 2) Google"
read -p "DNS [1-2]: " -e -i 2 DNS
yum -y install gcc
cd /tmp/
wget https://github.com/z3APA3A/3proxy/archive/0.8.10.tar.gz
tar -xvzf 0.8.10.tar.gz
cd 3proxy-0.8.10
sed -i '1s/^/#define ANONYMOUS 1\n/' ./src/proxy.h
make -f Makefile.Linux
mkdir -p /opt/3proxy/bin
touch /opt/3proxy/3proxy.pid
cp ./src/3proxy /opt/3proxy/bin
cp ./src/TransparentPlugin.ld.so /opt/3proxy/bin
cp ./cfg/3proxy.cfg.sample /opt/3proxy/3proxy.cfg
#Делаем скрипт управления службой 3proxy
echo '#!/bin/sh
#
# chkconfig: 2345 20 80
# description: 3proxy tiny proxy server
#
#
#
#
case "$1" in
start)
echo Starting 3Proxy
/opt/3proxy/bin/3proxy /opt/3proxy/3proxy.cfg
RETVAL=$?
echo
[ $RETVAL ]
;;
stop)
echo Stopping 3Proxy
if [ /opt/3proxy/3proxy.pid ]; then
/bin/kill 'cat /opt/3proxy/3proxy.pid'
else
/usr/bin/killall 3proxy
fi
RETVAL=$?
echo
[ $RETVAL ]
;;
restart|reload)
echo Reloading 3Proxy
if [ /opt/3proxy/3proxy.pid ]; then
/bin/kill 'cat /opt/3proxy/3proxy.pid'
else
/usr/bin/killall 3proxy
fi
;;
*)
echo Usage: $0 "{start|stop|restart}"
exit 1
esac
exit 0' > /etc/rc.d/init.d/3proxy
chmod 0755 /etc/rc.d/init.d/3proxy
#Определим названием внешнего интерфейса из текущего файла ipt-set
IF_EXT=$(grep IF_EXT= /root/ipt-set | awk -F\" '{print $2}')
#Определим порт OVPN из текущего файла ipt-set
PORT=$(grep OVPN_PORT= /root/ipt-set | awk -F\" '{print $2}')
#Определим протокол OVPN из текущего файла ipt-set
PROTOCOL=$(grep 'dport $OVPN_PORT -j ACCEPT' /root/ipt-set | awk '{print $7}')
#Изменим файл ipt-set
echo '#!/bin/sh' > /root/ipt-set
echo "IF_EXT=\"$IF_EXT\"
IF_OVPN=\"tun0\"
OVPN_PORT=\"$PORT\"
PROXI_PORT=\"8080\"
IPT=\"/sbin/iptables\"
IPT6=\"/sbin/ip6tables\"
# flush
\$IPT --flush
\$IPT -t nat --flush
\$IPT -t mangle --flush
\$IPT -X
\$IPT6 --flush
# loopback
\$IPT -A INPUT -i lo -j ACCEPT
\$IPT -A OUTPUT -o lo -j ACCEPT
# default
\$IPT -P INPUT DROP
\$IPT -P OUTPUT DROP
\$IPT -P FORWARD DROP
\$IPT6 -P INPUT DROP
\$IPT6 -P OUTPUT DROP
\$IPT6 -P FORWARD DROP
# allow forwarding" >> /root/ipt-set
echo 'echo 1 > /proc/sys/net/ipv4/ip_forward' >> /root/ipt-set
echo '# NAT
# #########################################
# SNAT - local users to out internet
$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
# INPUT chain
# #########################################
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ssh
$IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT
# VPN
$IPT -A INPUT -i $IF_OVPN -p icmp -s 10.8.0.0/24 -j ACCEPT
# DNS
$IPT -A INPUT -i $IF_OVPN -p udp --dport 53 -s 10.8.0.0/24 -j ACCEPT
# openvpn' >> /root/ipt-set
echo "\$IPT -A INPUT -i \$IF_EXT -p $PROTOCOL --dport \$OVPN_PORT -j ACCEPT" >> /root/ipt-set
echo '# proxi
$IPT -A INPUT -i $IF_OVPN -p tcp --dport $PROXI_PORT -j ACCEPT
$IPT -A INPUT -i $IF_OVPN -p udp --dport $PROXI_PORT -j ACCEPT
$IPT -t nat -A PREROUTING -i $IF_OVPN -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.8.0.1:$PROXI_PORT
$IPT -t nat -A PREROUTING -i $IF_OVPN -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.8.0.1:$PROXI_PORT
# FORWARD chain
# #########################################
$IPT -A FORWARD -i $IF_OVPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_OVPN -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s 10.8.0.0/24 -d 10.8.0.0/24 -j ACCEPT
# OUTPUT chain
# #########################################
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT' >> /root/ipt-set
#Установим права на запуск
chmod 755 /root/ipt-set
#И применим настройки
systemctl restart ipt-settings
echo "Файл ipt-set обновлён..."
#Делаем конфиг 3proxy
echo 'daemon
pidfile /opt/3proxy/3proxy.pid
plugin /opt/3proxy/bin/TransparentPlugin.ld.so transparent_plugin' > /opt/3proxy/3proxy.cfg
# DNS для 3proxy
case $DNS in
1)
# Получаем DNS из resolv.conf и используем их для 3proxy
grep -v '#' /etc/resolv.conf | grep 'nameserver' | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | while read line; do
echo "nserver $line" >> /opt/3proxy/3proxy.cfg
done
;;
2)
echo 'nserver 8.8.8.8' >> /opt/3proxy/3proxy.cfg
echo 'nserver 8.8.4.4' >> /opt/3proxy/3proxy.cfg
;;
esac
echo 'nscache 65536
timeouts 1 5 30 60 180 1800 15 60
#log /dev/null
#log /etc/3proxy/3proxy.log D
#logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"' >> /opt/3proxy/3proxy.cfg
echo "external $IP" >> /opt/3proxy/3proxy.cfg
echo 'internal 10.8.0.1
auth none
maxconn 64
allow *
parent 1000 http 0.0.0.0 0
allow *
parent 1000 socks5 0.0.0.0 0
tcppm -i10.8.0.1 8080 127.0.0.1 11111' >> /opt/3proxy/3proxy.cfg
/usr/bin/killall 3proxy
service 3proxy start
/sbin/chkconfig 3proxy on
echo "Прозрачный 3proxy установлен и запущен"
read -n1 -r -p "Нажмите любую кнопку для продолжения..."
;;
4)
echo ""
read -p "Вы действительно хотите удалить OpenVPN? [y/n]: " -e -i n REMOVE
if [[ "$REMOVE" = 'y' ]]; then
#Определим названием внешнего интерфейса из текущего файла ipt-set
IF_EXT=$(grep IF_EXT= /root/ipt-set | awk -F\" '{print $2}')
#Правим скрипт сетевых настроек.
echo '#!/bin/sh' > /root/ipt-set
echo "IF_EXT=\"$IF_EXT\"
IPT=\"/sbin/iptables\"
IPT6=\"/sbin/ip6tables\"
# flush
\$IPT --flush
\$IPT -t nat --flush
\$IPT -t mangle --flush
\$IPT -X
\$IPT6 --flush
# loopback
\$IPT -A INPUT -i lo -j ACCEPT
\$IPT -A OUTPUT -o lo -j ACCEPT
# default
\$IPT -P INPUT DROP
\$IPT -P OUTPUT DROP
\$IPT -P FORWARD DROP
\$IPT6 -P INPUT DROP
\$IPT6 -P OUTPUT DROP
\$IPT6 -P FORWARD DROP
# allow forwarding" >> /root/ipt-set
echo 'echo 0 > /proc/sys/net/ipv4/ip_forward' >> /root/ipt-set
echo '# INPUT chain
# #########################################
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ssh
$IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT' >> /root/ipt-set
echo '# OUTPUT chain
# #########################################
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT' >> /root/ipt-set
#Установим права на запуск
chmod 755 /root/ipt-set
#И применим настройки
systemctl restart ipt-settings
echo "Файл ipt-set обновлён..."
if hash sestatus 2>/dev/null; then
if sestatus | grep "Current mode" | grep -qs "enforcing"; then
if [[ "$PORT" != '1194' || "$PROTOCOL" = 'tcp' ]]; then
semanage port -d -t openvpn_port_t -p $PROTOCOL $PORT
fi
fi
fi
yum remove openvpn -y
rm -rf /etc/openvpn
echo ""
echo "OpenVPN удалён!"
else
echo ""
echo "Удаление отменено!"
fi
exit
;;
5) exit;;
esac
done
else
clear
echo 'Начинаем установку OpenVPN вместе с SecFAll.com'
echo ""
# Установка OpenVPN и создание первого пользователя
echo "Несколько вопросов перед началом установки"
echo "Вы можете оставлять параметры по умолчанию и просто нажимать «Enter», если они вас устраивают."
echo "Если хотите изменить параметр, то сотрите предлагаемое значение и введите своё"
echo ""
echo "Для начала введите IP адрес, на который OpenVPN будет принимать подкючения"
echo "Если автоматически определённый IP адрес правильный, просто нажмите Enter"
read -p "Определён IP адрес: " -e -i $IP IP
echo ""
echo "Какой протокол будем использовать?"
echo " 1) UDP (рекомендуется)"
echo " 2) TCP"
read -p "Протокол [1-2]: " -e -i 1 PROTOCOL
case $PROTOCOL in
1)
PROTOCOL=udp
;;
2)
PROTOCOL=tcp
;;
esac
echo ""
echo "На какой порт будем принимать подключения (443 рекомендуется)?"
read -p "Порт: " -e -i 443 PORT
echo ""
echo "Какой DNS вы хотите использовать в своей VPN?"
echo " 1) Текущие системные настройки"
echo " 2) Google"
read -p "DNS [1-2]: " -e -i 2 DNS
echo ""
echo "Укажите имя первого сертификата пользователя"
echo "Используйте только буквы, никаких спецсимволов"
read -p "Имя пользователя: " -e -i client CLIENT
echo ""
echo "А теперь введите начальные данные для корневого сертификата"
echo "Они ни на что не влияют"
echo "Вам будут предложены дефолтные значения"
echo "Просто жмите Enter если они вас устраивают."
echo "Если нет, то сотрите и введите свои."
read -p "Регион: " -e -i Russia EASYRSA_REQ_PROVINCE
read -p "Город: " -e -i Moscow EASYRSA_REQ_CITY
read -p "Название организации: " -e -i RosComNadzor EASYRSA_REQ_ORG
read -p "E-mail: " -e -i [email protected] EASYRSA_REQ_EMAIL
read -p "Подразделение: " -e -i OtdelBeshennogoPrintera EASYRSA_REQ_OU
echo "Отлично. Сейчас обновим сервер и выполним первичную установку OpenVPN."
read -n1 -r -p "Нажмите любую кнопку для продолжения..."
yum install epel-release -y
yum update -y
yum upgrade -y
yum install openvpn openssl iptables wget zip unzip -y
# Удаляем старые версииf easy-rsa
if [[ -d /etc/openvpn/easy-rsa/ ]]; then
rm -rf /etc/openvpn/easy-rsa/
fi
if [[ -d /etc/openvpn/keys/ ]]; then
rm -rf /etc/openvpn/keys/
fi
# Скачиваем и распаковываем easy-rsa
mkdir /etc/openvpn/keys
cd /etc/openvpn/keys
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip
cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
# Создадим файл с настройками
cp vars.example vars
# Засунем в него дефолтные поля сертификата
echo 'set_var EASYRSA_REQ_PROVINCE "$EASYRSA_REQ_PROVINCE"' >> /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars
echo 'set_var EASYRSA_REQ_CITY "$EASYRSA_REQ_CITY"' >> /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars
echo 'set_var EASYRSA_REQ_ORG "$EASYRSA_REQ_ORG"' >> /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars
echo 'set_var EASYRSA_REQ_EMAILE "$EASYRSA_REQ_EMAIL"' >> /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars
echo 'set_var EASYRSA_REQ_OU "$EASYRSA_REQ_OU"' >> /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars
echo 'set_var EASYRSA_KEY_SIZE "4096"' >> /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars
echo 'set_var EASYRSA_DIGEST "sha256"' >> /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars
# Создаём PKI, создаём CA, ключ DH а также сертификаты сервера и клиента
./easyrsa init-pki
echo "Сейчас будет создан корневой сертификат"
echo "На запрос Enter Pem pass phrase пароля придумайте и "
echo "введите сложный пароль два раза. После кажждого ввода жмите Enter"
read -n1 -r -p "Нажмите любую кнопку для продолжения..."
./easyrsa --batch build-ca
echo ""
echo ""
echo "Создаем ключ Диффи-Хелмана..."
echo ""
echo ""
echo "Это займет МНОГО времени!"
echo ""
echo ""
./easyrsa gen-dh
echo "Сейчас будут созданы сертификаты сервера и клиента,"
echo "а также список отозваных сертификатов"
echo "На запрос key: введите пароль от корневого сертификата."
read -n1 -r -p "Нажмите любую кнопку для продолжения..."
echo "Создаем сертификат сервера..."
./easyrsa build-server-full server nopass
echo "Создаем сертификат пользователя..."
./easyrsa build-client-full $CLIENT nopass
echo "Создаем список отозваных сертификатов..."
./easyrsa gen-crl
# Готовые сертификаты в рабочую папку сервера
cp pki/ca.crt pki/private/ca.key pki/dh.pem pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn
chown nobody:$GROUPNAME /etc/openvpn/crl.pem
echo "Создаем ключ tls-auth..."
openvpn --genkey --secret /etc/openvpn/ta.key
echo "Настраиваем сервер..."
echo "port $PORT
proto $PROTOCOL
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
crl-verify crl.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt" > /etc/openvpn/server.conf
echo 'push "redirect-gateway def1" ' >> /etc/openvpn/server.conf
# DNS
case $DNS in
1)
# Получакм DNS из resolv.conf и используем их для OpenVPN
grep -v '#' /etc/resolv.conf | grep 'nameserver' | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | while read line; do
echo "push \"dhcp-option DNS $line\"" >> /etc/openvpn/server.conf
done
;;
2)
echo 'push "dhcp-option DNS 8.8.8.8"' >> /etc/openvpn/server.conf
echo 'push "dhcp-option DNS 8.8.4.4"' >> /etc/openvpn/server.conf
;;
esac
echo "remote-cert-eku \"TLS Web Client Authentication\"
keepalive 10 120
tls-server
tls-auth ta.key 0
tls-timeout 120
auth SHA512
cipher AES-256-CBC
comp-lzo
max-clients 10
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 4" >> /etc/openvpn/server.conf
echo "server.conf создан..."
#Определим названием внешнего интерфейса. Не самый оптимальный вариант, но сходу лучше не придумал
IF_EXT=$(ip route get 8.8.8.8 | sed -nr 's/.*dev ([^\ ]+).*/\1/p')
echo "Определили внешний интерфейс как $IF_EXT..."
#Создадим скрипт сетевых настроек. Он будет применятся при каждой перезагрузке
echo '#!/bin/sh' > /root/ipt-set
echo "IF_EXT=\"$IF_EXT\"
IF_OVPN=\"tun0\"
OVPN_PORT=\"$PORT\"
IPT=\"/sbin/iptables\"
IPT6=\"/sbin/ip6tables\"
# flush
\$IPT --flush
\$IPT -t nat --flush
\$IPT -t mangle --flush
\$IPT -X
\$IPT6 --flush
# loopback
\$IPT -A INPUT -i lo -j ACCEPT
\$IPT -A OUTPUT -o lo -j ACCEPT
# default
\$IPT -P INPUT DROP
\$IPT -P OUTPUT DROP
\$IPT -P FORWARD DROP
\$IPT6 -P INPUT DROP
\$IPT6 -P OUTPUT DROP
\$IPT6 -P FORWARD DROP
# allow forwarding" >> /root/ipt-set
echo 'echo 1 > /proc/sys/net/ipv4/ip_forward' >> /root/ipt-set
echo '# NAT
# #########################################
# SNAT - local users to out internet
$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
# INPUT chain
# #########################################
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ssh
$IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT
# VPN
$IPT -A INPUT -i $IF_OVPN -p icmp -s 10.8.0.0/24 -j ACCEPT
# DNS
$IPT -A INPUT -i $IF_OVPN -p udp --dport 53 -s 10.8.0.0/24 -j ACCEPT
# openvpn' >> /root/ipt-set
echo "\$IPT -A INPUT -i \$IF_EXT -p $PROTOCOL --dport \$OVPN_PORT -j ACCEPT" >> /root/ipt-set
echo '# FORWARD chain
# #########################################
$IPT -A FORWARD -i $IF_OVPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_OVPN -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s 10.8.0.0/24 -d 10.8.0.0/24 -j ACCEPT
# OUTPUT chain
# #########################################
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT' >> /root/ipt-set
#Установим права на запуск
chmod 755 /root/ipt-set
echo "Файл ipt-set создан..."
#Сделаем свою службу для запуска скрипта ipt-set
echo '[Unit]
Description=Iptables Settings Service
After=network.target
[Service]
Type=oneshot
User=root
ExecStart=/root/ipt-set
[Install]
WantedBy=multi-user.target' > /etc/systemd/system/ipt-settings.service
chmod 644 /etc/systemd/system/ipt-settings.service
echo "Служба для запуска ipt-set создана..."
#Добавим в автозагрузку
systemctl enable ipt-settings
#И запустим
systemctl start ipt-settings
# Если включен SELinux, разрешим порт
if hash sestatus 2>/dev/null; then
if sestatus | grep "Current mode" | grep -qs "enforcing"; then
if [[ "$PORT" != '1194' || "$PROTOCOL" = 'tcp' ]]; then
# semanage по умолчанию не доступен CentOS 6
if ! hash semanage 2>/dev/null; then
yum install policycoreutils-python -y
fi
semanage port -a -t openvpn_port_t -p $PROTOCOL $PORT
echo "Порт в semanage разрешён..."
fi
fi
fi
# And finally, restart OpenVPN
echo "Запуск серера OpenVPN..."
if pgrep systemd-journal; then
systemctl restart [email protected]
systemctl enable [email protected]
else
service openvpn restart
chkconfig openvpn on
fi
# Client-common.txt будет нашим шаблоном для добавления новых пользователей позже
echo "client
dev tun
proto $PROTOCOL
remote $IP $PORT
resolv-retry infinite
nobind
block-outside-dns
persist-key
persist-tun
mute-replay-warnings
remote-cert-eku \"TLS Web Server Authentication\"
remote-cert-tls server
tls-client
key-direction 1
auth SHA512
cipher AES-256-CBC
comp-lzo
verb 3" > /etc/openvpn/client-common.txt
# Создаём client.ovpn
newclient "$CLIENT"
echo ""
echo "Сделано!"
echo ""
echo "Клиентский конфиг в файле" ~/"$CLIENT.ovpn"
echo "Если нужны еще клиенты, то запустите скрипт еще раз."
echo "Сервер будет перезагружен! После этого можете подключиться к нему с использованием клиентсокго файла."
read -n1 -r -p "Нажмите любую кнопку для перезагрузки сервера..."
reboot
fi