mirror of
https://github.com/midoks/mdserver-web.git
synced 2026-10-10 01:39:25 +08:00
This commit is contained in:
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Mr Chen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.4 KiB |
@@ -1,19 +0,0 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('l2tp');">服务</p>
|
||||
<p onclick="pluginConfig('l2tp',null, 'conf');">用户配置</p>
|
||||
<p onclick="pluginConfig('l2tp',null, 'conf_psk');">PSK配置</p>
|
||||
<p onclick="userList();">用户列表</p>
|
||||
<p onclick="readme();">说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$.getScript( "/plugins/file?name=l2tp&f=js/l2tp.js", function(){
|
||||
pluginService('l2tp');
|
||||
});
|
||||
</script>
|
||||
@@ -1,233 +0,0 @@
|
||||
# coding:utf-8
|
||||
|
||||
import sys
|
||||
import io
|
||||
import os
|
||||
import time
|
||||
import shutil
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'l2tp'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
tmp[t[0]] = t[1]
|
||||
elif args_len > 1:
|
||||
for i in range(len(args)):
|
||||
t = args[i].split(':')
|
||||
tmp[t[0]] = t[1]
|
||||
|
||||
return tmp
|
||||
|
||||
|
||||
def checkArgs(data, ck=[]):
|
||||
for i in range(len(ck)):
|
||||
if not ck[i] in data:
|
||||
return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
|
||||
return (True, mw.returnJson(True, 'ok'))
|
||||
|
||||
|
||||
def status():
|
||||
cmd = "ps -ef|grep xl2tpd |grep -v grep | grep -v python | awk '{print $2}'"
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
|
||||
def initConf():
|
||||
l2tp_cs = getServerDir() + '/chap-secrets'
|
||||
if not os.path.exists(l2tp_cs):
|
||||
mw.execShell('cp -rf ' + getPluginDir() +
|
||||
'/tmp/chap-secrets' + ' ' + getServerDir())
|
||||
|
||||
l2tp_is = getServerDir() + '/ipsec.secrets'
|
||||
if not os.path.exists(l2tp_is):
|
||||
mw.execShell('cp -rf ' + getPluginDir() +
|
||||
'/tmp/ipsec.secrets' + ' ' + getServerDir())
|
||||
|
||||
|
||||
def start():
|
||||
initConf()
|
||||
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
data = mw.execShell('service xl2tpd start')
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def stop():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
data = mw.execShell('service xl2tpd stop')
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def restart():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
data = mw.execShell('service xl2tpd restart')
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def reload():
|
||||
data = mw.execShell('service xl2tpd reload')
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def getPathFile():
|
||||
if mw.isAppleSystem():
|
||||
return getServerDir() + '/chap-secrets'
|
||||
return '/etc/ppp/chap-secrets'
|
||||
|
||||
|
||||
def getPathFilePsk():
|
||||
if mw.isAppleSystem():
|
||||
return getServerDir() + '/ipsec.secrets'
|
||||
return '/etc/ipsec.secrets'
|
||||
|
||||
|
||||
def getUserList():
|
||||
import re
|
||||
path = getPathFile()
|
||||
if not os.path.exists(path):
|
||||
return mw.returnJson(False, '密码配置文件不存在!')
|
||||
conf = mw.readFile(path)
|
||||
|
||||
conf = re.sub('#(.*)\n', '', conf)
|
||||
|
||||
if conf.strip() == '':
|
||||
return mw.returnJson(True, 'ok', [])
|
||||
|
||||
ulist = conf.strip().split('\n')
|
||||
|
||||
user = []
|
||||
for line in ulist:
|
||||
line_info = {}
|
||||
line = re.match(r'(\w*)\s*(\w*)\s*(\w*)\s*(.*)',
|
||||
line.strip(), re.M | re.I).groups()
|
||||
line_info['user'] = line[0]
|
||||
line_info['pwd'] = line[2]
|
||||
line_info['type'] = line[1]
|
||||
line_info['ip'] = line[3]
|
||||
user.append(line_info)
|
||||
|
||||
return mw.returnJson(True, 'ok', user)
|
||||
|
||||
|
||||
def addUser():
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(False, "Apple Computer does not support")
|
||||
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['username'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
ret = mw.execShell('echo ' + args['username'] + '|l2tp -a')
|
||||
if ret[1] == '':
|
||||
return mw.returnJson(True, '添加成功!:' + ret[0])
|
||||
return mw.returnJson(False, '添加失败:' + ret[0])
|
||||
|
||||
|
||||
def delUser():
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(False, "Apple Computer does not support")
|
||||
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['username'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
ret = mw.execShell('echo ' + args['username'] + '|l2tp -d')
|
||||
if ret[1] == '':
|
||||
return mw.returnJson(True, '删除成功!:' + ret[0])
|
||||
return mw.returnJson(False, '删除失败:' + ret[0])
|
||||
|
||||
|
||||
def modUser():
|
||||
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['username', 'password'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
path = getPathFile()
|
||||
username = args['username']
|
||||
password = args['password']
|
||||
|
||||
# sed -i "/^\<${user}\>/d" /etc/ppp/chap-secrets
|
||||
# echo "${user} l2tpd ${pass} *" >> /etc/ppp/chap-secrets
|
||||
|
||||
if mw.isAppleSystem():
|
||||
mw.execShell("sed -i .bak '/^\(" + username + "\)/d' " + path)
|
||||
else:
|
||||
mw.execShell("sed -i '/^\(" + username + "\)/d' " + path)
|
||||
# print 'echo "' + username + " l2tpd " + password + " *\" >>"
|
||||
# + path
|
||||
ret = mw.execShell("echo \"" + username +
|
||||
" l2tpd " + password + " *\" >>" + path)
|
||||
if ret[1] == '':
|
||||
return mw.returnJson(True, '修改成功!')
|
||||
return mw.returnJson(False, '修改失败')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print(status())
|
||||
elif func == 'start':
|
||||
print(start())
|
||||
elif func == 'stop':
|
||||
print(stop())
|
||||
elif func == 'restart':
|
||||
print(restart())
|
||||
elif func == 'reload':
|
||||
print(reload())
|
||||
elif func == 'conf':
|
||||
print(getPathFile())
|
||||
elif func == 'conf_psk':
|
||||
print(getPathFilePsk())
|
||||
elif func == 'user_list':
|
||||
print(getUserList())
|
||||
elif func == 'add_user':
|
||||
print(addUser())
|
||||
elif func == 'del_user':
|
||||
print(delUser())
|
||||
elif func == 'mod_user':
|
||||
print(modUser())
|
||||
else:
|
||||
print('error')
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"title":"L2TP",
|
||||
"tip":"soft",
|
||||
"name":"l2tp",
|
||||
"type":"运行环境",
|
||||
"ps":"VPN网关",
|
||||
"versions":"1.0",
|
||||
"shell":"install.sh",
|
||||
"checks":"server/l2tp",
|
||||
"author":"teddysun",
|
||||
"home":"https://github.com/teddysun/across/blob/master/l2tp.sh",
|
||||
"date":"2019-02-27",
|
||||
"pid": "5"
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
SYSOS=`uname`
|
||||
|
||||
Install_l2tp()
|
||||
{
|
||||
isStart=""
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
mkdir -p $serverPath/l2tp
|
||||
echo '1.0' > $serverPath/l2tp/version.pl
|
||||
|
||||
cp -rf scripts/l2tp.sh $serverPath/l2tp
|
||||
chmod +x $serverPath/l2tp/l2tp.sh
|
||||
|
||||
if [ "Darwin" == "$SYSOS" ];then
|
||||
echo 'macosx unavailable' > $install_tmp
|
||||
exit 0
|
||||
fi
|
||||
|
||||
/bin/sh $serverPath/l2tp/l2tp.sh
|
||||
|
||||
echo 'install complete' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_l2tp()
|
||||
{
|
||||
rm -rf $serverPath/l2tp
|
||||
echo "Uninstall completed" > $install_tmp
|
||||
}
|
||||
|
||||
action=$1
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_l2tp
|
||||
else
|
||||
Uninstall_l2tp
|
||||
fi
|
||||
@@ -1,158 +0,0 @@
|
||||
function str2Obj(str){
|
||||
var data = {};
|
||||
kv = str.split('&');
|
||||
for(i in kv){
|
||||
v = kv[i].split('=');
|
||||
data[v[0]] = v[1];
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function lpPost(method,args,callback, title){
|
||||
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var _title = '正在获取...';
|
||||
if (typeof(title) != 'undefined'){
|
||||
_title = title;
|
||||
}
|
||||
|
||||
var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'l2tp', func:method, args:_args}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function lpAsyncPost(method,args){
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
return syncPost('/plugins/run', {name:'l2tp', func:method, args:_args});
|
||||
}
|
||||
|
||||
function userList(){
|
||||
lpPost('user_list', '' ,function(data){
|
||||
var rdata = $.parseJSON(data['data']);
|
||||
|
||||
if (!rdata['status']){
|
||||
layer.msg(rdata.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
var list = rdata['data'];
|
||||
|
||||
var con = '';
|
||||
con += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">';
|
||||
con += '<thead><tr>';
|
||||
con += '<th>用户</th>';
|
||||
con += '<th>密码</th>';
|
||||
con += '<th>操作(<a class="btlink" onclick="addUser()">添加</a>)</th>';
|
||||
con += '</tr></thead>';
|
||||
|
||||
con += '<tbody>';
|
||||
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
con += '<tr>'+
|
||||
'<td>' + list[i]['user']+'</td>' +
|
||||
'<td>' + list[i]['pwd']+'</td>' +
|
||||
'<td><a class="btlink" onclick="modUser(\''+list[i]['user']+'\')">改密</a>|<a class="btlink" onclick="delUser(\''+list[i]['user']+'\')">删除</a></td></tr>';
|
||||
}
|
||||
|
||||
con += '</tbody>';
|
||||
con += '</table></div>';
|
||||
|
||||
$(".soft-man-con").html(con);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function addUser(){
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '添加用户',
|
||||
area: '240px',
|
||||
content:"<div class='bt-form pd20 pb70 c6'>\
|
||||
<div class='version line'>\
|
||||
<div><input class='bt-input-text mr5 outline_no' type='text' id='username' name='username' style='height: 28px; border-radius: 3px;width: 200px;' placeholder='输入用户名'></div>\
|
||||
</div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' id='add_ok' class='btn btn-success btn-sm btn-title bi-btn'>确认</button>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
|
||||
$('#add_ok').click(function(){
|
||||
_data = {};
|
||||
_data['username'] = $('#username').val();
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
lpPost('add_user', _data, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
layer.close(loadOpen);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){userList();},2000);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function delUser(username){
|
||||
lpPost('del_user', {username:username}, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){userList();},2000);
|
||||
});
|
||||
}
|
||||
|
||||
function modUser(username){
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '修改密码',
|
||||
area: '240px',
|
||||
content:"<div class='bt-form pd20 pb70 c6'>\
|
||||
<div class='version line'>\
|
||||
<div><input class='bt-input-text mr5 outline_no' type='text' id='password' name='password' style='height: 28px; border-radius: 3px;width: 200px;' placeholder='输入密码'></div>\
|
||||
</div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' id='mod_ok' class='btn btn-success btn-sm btn-title bi-btn'>确认</button>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
|
||||
$('#mod_ok').click(function(){
|
||||
_data = {};
|
||||
_data['username'] = username;
|
||||
_data['password'] = $('#password').val();
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
lpPost('mod_user', _data, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
layer.close(loadOpen);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){userList();},2000);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function readme(){
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>PPTP需开放端口:UDP:1723</li>';
|
||||
readme += '<li>L2TP需开放端口:UDP:500,UDP:4500,UDP:1701</li>';
|
||||
readme += '</ul>';
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
@@ -1,820 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
#=======================================================================#
|
||||
# System Supported: CentOS 6+ / Debian 7+ / Ubuntu 12+ #
|
||||
# Description: L2TP VPN Auto Installer #
|
||||
# Author: Teddysun <i@teddysun.com> #
|
||||
# Intro: https://teddysun.com/448.html #
|
||||
#=======================================================================#
|
||||
cur_dir=`pwd`
|
||||
|
||||
libreswan_filename="libreswan-3.27"
|
||||
download_root_url="https://dl.lamp.sh/files"
|
||||
|
||||
rootness(){
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Error:This script must be run as root!" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
tunavailable(){
|
||||
if [[ ! -e /dev/net/tun ]]; then
|
||||
echo "Error:TUN/TAP is not available!" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
disable_selinux(){
|
||||
if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
|
||||
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
|
||||
setenforce 0
|
||||
fi
|
||||
}
|
||||
|
||||
get_opsy(){
|
||||
[ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return
|
||||
[ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return
|
||||
[ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return
|
||||
}
|
||||
|
||||
get_os_info(){
|
||||
IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 )
|
||||
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )
|
||||
|
||||
local cname=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' )
|
||||
local cores=$( awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo )
|
||||
local freq=$( awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' )
|
||||
local tram=$( free -m | awk '/Mem/ {print $2}' )
|
||||
local swap=$( free -m | awk '/Swap/ {print $2}' )
|
||||
local up=$( awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=$1%60} {printf("%ddays, %d:%d:%d\n",a,b,c,d)}' /proc/uptime )
|
||||
local load=$( w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' )
|
||||
local opsy=$( get_opsy )
|
||||
local arch=$( uname -m )
|
||||
local lbit=$( getconf LONG_BIT )
|
||||
local host=$( hostname )
|
||||
local kern=$( uname -r )
|
||||
|
||||
echo "########## System Information ##########"
|
||||
echo
|
||||
echo "CPU model : ${cname}"
|
||||
echo "Number of cores : ${cores}"
|
||||
echo "CPU frequency : ${freq} MHz"
|
||||
echo "Total amount of ram : ${tram} MB"
|
||||
echo "Total amount of swap : ${swap} MB"
|
||||
echo "System uptime : ${up}"
|
||||
echo "Load average : ${load}"
|
||||
echo "OS : ${opsy}"
|
||||
echo "Arch : ${arch} (${lbit} Bit)"
|
||||
echo "Kernel : ${kern}"
|
||||
echo "Hostname : ${host}"
|
||||
echo "IPv4 address : ${IP}"
|
||||
echo
|
||||
echo "########################################"
|
||||
}
|
||||
|
||||
check_sys(){
|
||||
local checkType=$1
|
||||
local value=$2
|
||||
|
||||
local release=''
|
||||
local systemPackage=''
|
||||
|
||||
if [[ -f /etc/redhat-release ]]; then
|
||||
release="centos"
|
||||
systemPackage="yum"
|
||||
elif cat /etc/issue | grep -Eqi "debian"; then
|
||||
release="debian"
|
||||
systemPackage="apt"
|
||||
elif cat /etc/issue | grep -Eqi "ubuntu"; then
|
||||
release="ubuntu"
|
||||
systemPackage="apt"
|
||||
elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then
|
||||
release="centos"
|
||||
systemPackage="yum"
|
||||
elif cat /proc/version | grep -Eqi "debian"; then
|
||||
release="debian"
|
||||
systemPackage="apt"
|
||||
elif cat /proc/version | grep -Eqi "ubuntu"; then
|
||||
release="ubuntu"
|
||||
systemPackage="apt"
|
||||
elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then
|
||||
release="centos"
|
||||
systemPackage="yum"
|
||||
fi
|
||||
|
||||
if [[ ${checkType} == "sysRelease" ]]; then
|
||||
if [ "$value" == "$release" ];then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
elif [[ ${checkType} == "packageManager" ]]; then
|
||||
if [ "$value" == "$systemPackage" ];then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
rand(){
|
||||
index=0
|
||||
str=""
|
||||
for i in {a..z}; do arr[index]=${i}; index=`expr ${index} + 1`; done
|
||||
for i in {A..Z}; do arr[index]=${i}; index=`expr ${index} + 1`; done
|
||||
for i in {0..9}; do arr[index]=${i}; index=`expr ${index} + 1`; done
|
||||
for i in {1..10}; do str="$str${arr[$RANDOM%$index]}"; done
|
||||
echo ${str}
|
||||
}
|
||||
|
||||
is_64bit(){
|
||||
if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
download_file(){
|
||||
if [ -s ${1} ]; then
|
||||
echo "$1 [found]"
|
||||
else
|
||||
echo "$1 not found!!!download now..."
|
||||
if ! wget -c -t3 -T60 ${download_root_url}/${1}; then
|
||||
echo "Failed to download $1, please download it to ${cur_dir} directory manually and try again."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
versionget(){
|
||||
if [[ -s /etc/redhat-release ]];then
|
||||
grep -oE "[0-9.]+" /etc/redhat-release
|
||||
else
|
||||
grep -oE "[0-9.]+" /etc/issue
|
||||
fi
|
||||
}
|
||||
|
||||
centosversion(){
|
||||
if check_sys sysRelease centos;then
|
||||
local code=${1}
|
||||
local version="`versionget`"
|
||||
local main_ver=${version%%.*}
|
||||
if [ "${main_ver}" == "${code}" ];then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
debianversion(){
|
||||
if check_sys sysRelease debian;then
|
||||
local version=$( get_opsy )
|
||||
local code=${1}
|
||||
local main_ver=$( echo ${version} | sed 's/[^0-9]//g')
|
||||
if [ "${main_ver}" == "${code}" ];then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
version_check(){
|
||||
if check_sys packageManager yum; then
|
||||
if centosversion 5; then
|
||||
echo "Error: CentOS 5 is not supported, Please re-install OS and try again."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
get_char(){
|
||||
SAVEDSTTY=`stty -g`
|
||||
stty -echo
|
||||
stty cbreak
|
||||
dd if=/dev/tty bs=1 count=1 2> /dev/null
|
||||
stty -raw
|
||||
stty echo
|
||||
stty $SAVEDSTTY
|
||||
}
|
||||
|
||||
preinstall_l2tp(){
|
||||
|
||||
echo
|
||||
if [ -d "/proc/vz" ]; then
|
||||
echo -e "\033[41;37m WARNING: \033[0m Your VPS is based on OpenVZ, and IPSec might not be supported by the kernel."
|
||||
echo "Continue installation? (y/n)"
|
||||
read -p "(Default: n)" agree
|
||||
[ -z ${agree} ] && agree="n"
|
||||
if [ "${agree}" == "n" ]; then
|
||||
echo
|
||||
echo "L2TP installation cancelled."
|
||||
echo
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
echo
|
||||
echo "Please enter IP-Range:"
|
||||
# read -p "(Default Range: 192.168.18):" iprange
|
||||
# [ -z ${iprange} ] && iprange="192.168.18"
|
||||
iprange="192.168.18"
|
||||
echo ${iprange}
|
||||
|
||||
echo "Please enter PSK:"
|
||||
# read -p "(Default PSK: teddysun.com):" mypsk
|
||||
# [ -z ${mypsk} ] && mypsk="teddysun.com"
|
||||
mypsk="midoks"
|
||||
echo ${mypsk}
|
||||
|
||||
echo "Please enter Username:"
|
||||
# read -p "(Default Username: teddysun):" username
|
||||
# [ -z ${username} ] && username="teddysun"
|
||||
username="midoks"
|
||||
echo ${username}
|
||||
|
||||
# password=`rand`
|
||||
echo "Please enter ${username}'s password:"
|
||||
# read -p "(Default Password: ${password}):" tmppassword
|
||||
# [ ! -z ${tmppassword} ] && password=${tmppassword}
|
||||
password=midoks
|
||||
echo ${password}
|
||||
|
||||
echo
|
||||
echo "ServerIP:${IP}"
|
||||
echo "Server Local IP:${iprange}.1"
|
||||
echo "Client Remote IP Range:${iprange}.2-${iprange}.254"
|
||||
echo "PSK:${mypsk}"
|
||||
echo
|
||||
echo "Press any key to start... or press Ctrl + C to cancel."
|
||||
char=`get_char`
|
||||
|
||||
}
|
||||
|
||||
install_l2tp(){
|
||||
|
||||
mknod /dev/random c 1 9
|
||||
|
||||
if check_sys packageManager apt; then
|
||||
apt-get -y update
|
||||
|
||||
if debianversion 7; then
|
||||
if is_64bit; then
|
||||
local libnspr4_filename1="libnspr4_4.10.7-1_amd64.deb"
|
||||
local libnspr4_filename2="libnspr4-0d_4.10.7-1_amd64.deb"
|
||||
local libnspr4_filename3="libnspr4-dev_4.10.7-1_amd64.deb"
|
||||
local libnspr4_filename4="libnspr4-dbg_4.10.7-1_amd64.deb"
|
||||
local libnss3_filename1="libnss3_3.17.2-1.1_amd64.deb"
|
||||
local libnss3_filename2="libnss3-1d_3.17.2-1.1_amd64.deb"
|
||||
local libnss3_filename3="libnss3-tools_3.17.2-1.1_amd64.deb"
|
||||
local libnss3_filename4="libnss3-dev_3.17.2-1.1_amd64.deb"
|
||||
local libnss3_filename5="libnss3-dbg_3.17.2-1.1_amd64.deb"
|
||||
else
|
||||
local libnspr4_filename1="libnspr4_4.10.7-1_i386.deb"
|
||||
local libnspr4_filename2="libnspr4-0d_4.10.7-1_i386.deb"
|
||||
local libnspr4_filename3="libnspr4-dev_4.10.7-1_i386.deb"
|
||||
local libnspr4_filename4="libnspr4-dbg_4.10.7-1_i386.deb"
|
||||
local libnss3_filename1="libnss3_3.17.2-1.1_i386.deb"
|
||||
local libnss3_filename2="libnss3-1d_3.17.2-1.1_i386.deb"
|
||||
local libnss3_filename3="libnss3-tools_3.17.2-1.1_i386.deb"
|
||||
local libnss3_filename4="libnss3-dev_3.17.2-1.1_i386.deb"
|
||||
local libnss3_filename5="libnss3-dbg_3.17.2-1.1_i386.deb"
|
||||
fi
|
||||
rm -rf ${cur_dir}/l2tp
|
||||
mkdir -p ${cur_dir}/l2tp
|
||||
cd ${cur_dir}/l2tp
|
||||
download_file "${libnspr4_filename1}"
|
||||
download_file "${libnspr4_filename2}"
|
||||
download_file "${libnspr4_filename3}"
|
||||
download_file "${libnspr4_filename4}"
|
||||
download_file "${libnss3_filename1}"
|
||||
download_file "${libnss3_filename2}"
|
||||
download_file "${libnss3_filename3}"
|
||||
download_file "${libnss3_filename4}"
|
||||
download_file "${libnss3_filename5}"
|
||||
dpkg -i ${libnspr4_filename1} ${libnspr4_filename2} ${libnspr4_filename3} ${libnspr4_filename4}
|
||||
dpkg -i ${libnss3_filename1} ${libnss3_filename2} ${libnss3_filename3} ${libnss3_filename4} ${libnss3_filename5}
|
||||
|
||||
apt-get -y install wget gcc ppp flex bison make pkg-config libpam0g-dev libcap-ng-dev iptables \
|
||||
libcap-ng-utils libunbound-dev libevent-dev libcurl4-nss-dev libsystemd-daemon-dev
|
||||
else
|
||||
apt-get -y install wget gcc ppp flex bison make python libnss3-dev libnss3-tools libselinux-dev iptables \
|
||||
libnspr4-dev pkg-config libpam0g-dev libcap-ng-dev libcap-ng-utils libunbound-dev \
|
||||
libevent-dev libcurl4-nss-dev libsystemd-dev
|
||||
fi
|
||||
apt-get -y --no-install-recommends install xmlto
|
||||
apt-get -y install xl2tpd
|
||||
|
||||
compile_install
|
||||
elif check_sys packageManager yum; then
|
||||
echo "Adding the EPEL repository..."
|
||||
yum -y install epel-release yum-utils
|
||||
[ ! -f /etc/yum.repos.d/epel.repo ] && echo "Install EPEL repository failed, please check it." && exit 1
|
||||
yum-config-manager --enable epel
|
||||
echo "Adding the EPEL repository complete..."
|
||||
|
||||
if centosversion 7; then
|
||||
yum -y install ppp libreswan xl2tpd firewalld
|
||||
yum_install
|
||||
elif centosversion 6; then
|
||||
yum -y remove libevent-devel
|
||||
yum -y install libevent2-devel
|
||||
yum -y install nss-devel nspr-devel pkgconfig pam-devel \
|
||||
libcap-ng-devel libselinux-devel lsof \
|
||||
curl-devel flex bison gcc ppp make iptables gmp-devel \
|
||||
fipscheck-devel unbound-devel xmlto libpcap-devel xl2tpd
|
||||
|
||||
compile_install
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
config_install(){
|
||||
|
||||
cat > /etc/ipsec.conf<<EOF
|
||||
version 2.0
|
||||
|
||||
config setup
|
||||
protostack=netkey
|
||||
nhelpers=0
|
||||
uniqueids=no
|
||||
interfaces=%defaultroute
|
||||
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!${iprange}.0/24
|
||||
|
||||
conn l2tp-psk
|
||||
rightsubnet=vhost:%priv
|
||||
also=l2tp-psk-nonat
|
||||
|
||||
conn l2tp-psk-nonat
|
||||
authby=secret
|
||||
pfs=no
|
||||
auto=add
|
||||
keyingtries=3
|
||||
rekey=no
|
||||
ikelifetime=8h
|
||||
keylife=1h
|
||||
type=transport
|
||||
left=%defaultroute
|
||||
leftid=${IP}
|
||||
leftprotoport=17/1701
|
||||
right=%any
|
||||
rightprotoport=17/%any
|
||||
dpddelay=40
|
||||
dpdtimeout=130
|
||||
dpdaction=clear
|
||||
sha2-truncbug=yes
|
||||
EOF
|
||||
|
||||
cat > /etc/ipsec.secrets<<EOF
|
||||
%any %any : PSK "${mypsk}"
|
||||
EOF
|
||||
|
||||
cat > /etc/xl2tpd/xl2tpd.conf<<EOF
|
||||
[global]
|
||||
port = 1701
|
||||
|
||||
[lns default]
|
||||
ip range = ${iprange}.2-${iprange}.254
|
||||
local ip = ${iprange}.1
|
||||
require chap = yes
|
||||
refuse pap = yes
|
||||
require authentication = yes
|
||||
name = l2tpd
|
||||
ppp debug = yes
|
||||
pppoptfile = /etc/ppp/options.xl2tpd
|
||||
length bit = yes
|
||||
EOF
|
||||
|
||||
cat > /etc/ppp/options.xl2tpd<<EOF
|
||||
ipcp-accept-local
|
||||
ipcp-accept-remote
|
||||
require-mschap-v2
|
||||
ms-dns 8.8.8.8
|
||||
ms-dns 8.8.4.4
|
||||
noccp
|
||||
auth
|
||||
hide-password
|
||||
idle 1800
|
||||
mtu 1410
|
||||
mru 1410
|
||||
nodefaultroute
|
||||
debug
|
||||
proxyarp
|
||||
connect-delay 5000
|
||||
EOF
|
||||
|
||||
rm -f /etc/ppp/chap-secrets
|
||||
cat > /etc/ppp/chap-secrets<<EOF
|
||||
# Secrets for authentication using CHAP
|
||||
# client server secret IP addresses
|
||||
${username} l2tpd ${password} *
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
compile_install(){
|
||||
|
||||
rm -rf ${cur_dir}/l2tp
|
||||
mkdir -p ${cur_dir}/l2tp
|
||||
cd ${cur_dir}/l2tp
|
||||
download_file "${libreswan_filename}.tar.gz"
|
||||
tar -zxf ${libreswan_filename}.tar.gz
|
||||
|
||||
cd ${cur_dir}/l2tp/${libreswan_filename}
|
||||
cat > Makefile.inc.local <<'EOF'
|
||||
WERROR_CFLAGS =
|
||||
USE_DNSSEC = false
|
||||
USE_DH31 = false
|
||||
USE_GLIBC_KERN_FLIP_HEADERS = true
|
||||
EOF
|
||||
make programs && make install
|
||||
|
||||
/usr/local/sbin/ipsec --version >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "${libreswan_filename} install failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
config_install
|
||||
|
||||
cp -pf /etc/sysctl.conf /etc/sysctl.conf.bak
|
||||
|
||||
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
|
||||
|
||||
for each in `ls /proc/sys/net/ipv4/conf/`; do
|
||||
echo "net.ipv4.conf.${each}.accept_source_route=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.accept_redirects=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.send_redirects=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.rp_filter=0" >> /etc/sysctl.conf
|
||||
done
|
||||
sysctl -p
|
||||
|
||||
if centosversion 6; then
|
||||
[ -f /etc/sysconfig/iptables ] && cp -pf /etc/sysconfig/iptables /etc/sysconfig/iptables.old.`date +%Y%m%d`
|
||||
|
||||
if [ "`iptables -L -n | grep -c '\-\-'`" == "0" ]; then
|
||||
cat > /etc/sysconfig/iptables <<EOF
|
||||
# Added by L2TP VPN script
|
||||
*filter
|
||||
:INPUT ACCEPT [0:0]
|
||||
:FORWARD ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A INPUT -p icmp -j ACCEPT
|
||||
-A INPUT -i lo -j ACCEPT
|
||||
-A INPUT -p tcp --dport 22 -j ACCEPT
|
||||
-A INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
|
||||
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A FORWARD -s ${iprange}.0/24 -j ACCEPT
|
||||
COMMIT
|
||||
*nat
|
||||
:PREROUTING ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
:POSTROUTING ACCEPT [0:0]
|
||||
-A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
|
||||
COMMIT
|
||||
EOF
|
||||
else
|
||||
iptables -I INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
|
||||
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
iptables -I FORWARD -s ${iprange}.0/24 -j ACCEPT
|
||||
iptables -t nat -A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
|
||||
/etc/init.d/iptables save
|
||||
fi
|
||||
|
||||
if [ ! -f /etc/ipsec.d/cert9.db ]; then
|
||||
echo > /var/tmp/libreswan-nss-pwd
|
||||
certutil -N -f /var/tmp/libreswan-nss-pwd -d /etc/ipsec.d
|
||||
rm -f /var/tmp/libreswan-nss-pwd
|
||||
fi
|
||||
|
||||
chkconfig --add iptables
|
||||
chkconfig iptables on
|
||||
chkconfig --add ipsec
|
||||
chkconfig ipsec on
|
||||
chkconfig --add xl2tpd
|
||||
chkconfig xl2tpd on
|
||||
|
||||
/etc/init.d/iptables restart
|
||||
/etc/init.d/ipsec start
|
||||
/etc/init.d/xl2tpd start
|
||||
|
||||
else
|
||||
[ -f /etc/iptables.rules ] && cp -pf /etc/iptables.rules /etc/iptables.rules.old.`date +%Y%m%d`
|
||||
|
||||
if [ "`iptables -L -n | grep -c '\-\-'`" == "0" ]; then
|
||||
cat > /etc/iptables.rules <<EOF
|
||||
# Added by L2TP VPN script
|
||||
*filter
|
||||
:INPUT ACCEPT [0:0]
|
||||
:FORWARD ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A INPUT -p icmp -j ACCEPT
|
||||
-A INPUT -i lo -j ACCEPT
|
||||
-A INPUT -p tcp --dport 22 -j ACCEPT
|
||||
-A INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
|
||||
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A FORWARD -s ${iprange}.0/24 -j ACCEPT
|
||||
COMMIT
|
||||
*nat
|
||||
:PREROUTING ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
:POSTROUTING ACCEPT [0:0]
|
||||
-A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
|
||||
COMMIT
|
||||
EOF
|
||||
else
|
||||
iptables -I INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
|
||||
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
iptables -I FORWARD -s ${iprange}.0/24 -j ACCEPT
|
||||
iptables -t nat -A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
|
||||
/sbin/iptables-save > /etc/iptables.rules
|
||||
fi
|
||||
|
||||
cat > /etc/network/if-up.d/iptables <<EOF
|
||||
#!/bin/sh
|
||||
/sbin/iptables-restore < /etc/iptables.rules
|
||||
EOF
|
||||
chmod +x /etc/network/if-up.d/iptables
|
||||
|
||||
if [ ! -f /etc/ipsec.d/cert9.db ]; then
|
||||
echo > /var/tmp/libreswan-nss-pwd
|
||||
certutil -N -f /var/tmp/libreswan-nss-pwd -d /etc/ipsec.d
|
||||
rm -f /var/tmp/libreswan-nss-pwd
|
||||
fi
|
||||
|
||||
update-rc.d -f xl2tpd defaults
|
||||
|
||||
cp -f /etc/rc.local /etc/rc.local.old.`date +%Y%m%d`
|
||||
sed --follow-symlinks -i -e '/^exit 0/d' /etc/rc.local
|
||||
cat >> /etc/rc.local <<EOF
|
||||
|
||||
# Added by L2TP VPN script
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
/usr/sbin/service ipsec start
|
||||
exit 0
|
||||
EOF
|
||||
chmod +x /etc/rc.local
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
|
||||
/sbin/iptables-restore < /etc/iptables.rules
|
||||
/usr/sbin/service ipsec start
|
||||
/usr/sbin/service xl2tpd restart
|
||||
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
yum_install(){
|
||||
|
||||
config_install
|
||||
|
||||
cp -pf /etc/sysctl.conf /etc/sysctl.conf.bak
|
||||
|
||||
echo "# Added by L2TP VPN" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf
|
||||
|
||||
for each in `ls /proc/sys/net/ipv4/conf/`; do
|
||||
echo "net.ipv4.conf.${each}.accept_source_route=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.accept_redirects=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.send_redirects=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.rp_filter=0" >> /etc/sysctl.conf
|
||||
done
|
||||
sysctl -p
|
||||
|
||||
cat > /etc/firewalld/services/xl2tpd.xml<<EOF
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<service>
|
||||
<short>xl2tpd</short>
|
||||
<description>L2TP IPSec</description>
|
||||
<port protocol="udp" port="4500"/>
|
||||
<port protocol="udp" port="1701"/>
|
||||
</service>
|
||||
EOF
|
||||
chmod 640 /etc/firewalld/services/xl2tpd.xml
|
||||
|
||||
systemctl enable ipsec
|
||||
systemctl enable xl2tpd
|
||||
systemctl enable firewalld
|
||||
|
||||
systemctl status firewalld > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
firewall-cmd --reload
|
||||
echo "Checking firewalld status..."
|
||||
firewall-cmd --list-all
|
||||
echo "add firewalld rules..."
|
||||
firewall-cmd --permanent --add-service=ipsec
|
||||
firewall-cmd --permanent --add-service=xl2tpd
|
||||
firewall-cmd --permanent --add-masquerade
|
||||
firewall-cmd --reload
|
||||
else
|
||||
echo "Firewalld looks like not running, trying to start..."
|
||||
systemctl start firewalld
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Firewalld start successfully..."
|
||||
firewall-cmd --reload
|
||||
echo "Checking firewalld status..."
|
||||
firewall-cmd --list-all
|
||||
echo "adding firewalld rules..."
|
||||
firewall-cmd --permanent --add-service=ipsec
|
||||
firewall-cmd --permanent --add-service=xl2tpd
|
||||
firewall-cmd --permanent --add-masquerade
|
||||
firewall-cmd --reload
|
||||
else
|
||||
echo "Failed to start firewalld. please enable udp port 500 4500 1701 manually if necessary."
|
||||
fi
|
||||
fi
|
||||
|
||||
systemctl restart ipsec
|
||||
systemctl restart xl2tpd
|
||||
echo "Checking ipsec status..."
|
||||
systemctl -a | grep ipsec
|
||||
echo "Checking xl2tpd status..."
|
||||
systemctl -a | grep xl2tpd
|
||||
echo "Checking firewalld status..."
|
||||
firewall-cmd --list-all
|
||||
|
||||
}
|
||||
|
||||
finally(){
|
||||
|
||||
cd ${cur_dir}
|
||||
rm -fr ${cur_dir}/l2tp
|
||||
# create l2tp command
|
||||
cp -f ${cur_dir}/`basename $0` /usr/bin/l2tp
|
||||
|
||||
echo "Please wait a moment..."
|
||||
sleep 5
|
||||
ipsec verify
|
||||
echo
|
||||
echo "###############################################################"
|
||||
echo "# L2TP VPN Auto Installer #"
|
||||
echo "# System Supported: CentOS 6+ / Debian 7+ / Ubuntu 12+ #"
|
||||
echo "# Intro: https://teddysun.com/448.html #"
|
||||
echo "# Author: Teddysun <i@teddysun.com> #"
|
||||
echo "###############################################################"
|
||||
echo "If there is no [FAILED] above, you can connect to your L2TP "
|
||||
echo "VPN Server with the default Username/Password is below:"
|
||||
echo
|
||||
echo "Server IP: ${IP}"
|
||||
echo "PSK : ${mypsk}"
|
||||
echo "Username : ${username}"
|
||||
echo "Password : ${password}"
|
||||
echo
|
||||
echo "If you want to modify user settings, please use below command(s):"
|
||||
echo "l2tp -a (Add a user)"
|
||||
echo "l2tp -d (Delete a user)"
|
||||
echo "l2tp -l (List all users)"
|
||||
echo "l2tp -m (Modify a user password)"
|
||||
echo
|
||||
echo "Welcome to visit our website: https://teddysun.com/448.html"
|
||||
echo "Enjoy it!"
|
||||
echo
|
||||
}
|
||||
|
||||
|
||||
l2tp(){
|
||||
clear
|
||||
echo
|
||||
echo "###############################################################"
|
||||
echo "# L2TP VPN Auto Installer #"
|
||||
echo "# System Supported: CentOS 6+ / Debian 7+ / Ubuntu 12+ #"
|
||||
echo "# Intro: https://teddysun.com/448.html #"
|
||||
echo "# Author: Teddysun <i@teddysun.com> #"
|
||||
echo "###############################################################"
|
||||
echo
|
||||
rootness
|
||||
tunavailable
|
||||
disable_selinux
|
||||
version_check
|
||||
get_os_info
|
||||
preinstall_l2tp
|
||||
install_l2tp
|
||||
finally
|
||||
}
|
||||
|
||||
list_users(){
|
||||
if [ ! -f /etc/ppp/chap-secrets ];then
|
||||
echo "Error: /etc/ppp/chap-secrets file not found."
|
||||
exit 1
|
||||
fi
|
||||
local line="+-------------------------------------------+\n"
|
||||
local string=%20s
|
||||
printf "${line}|${string} |${string} |\n${line}" Username Password
|
||||
grep -v "^#" /etc/ppp/chap-secrets | awk '{printf "|'${string}' |'${string}' |\n", $1,$3}'
|
||||
printf ${line}
|
||||
}
|
||||
|
||||
add_user(){
|
||||
while :
|
||||
do
|
||||
read -p "Please input your Username:" user
|
||||
if [ -z ${user} ]; then
|
||||
echo "Username can not be empty"
|
||||
else
|
||||
grep -w "${user}" /etc/ppp/chap-secrets > /dev/null 2>&1
|
||||
if [ $? -eq 0 ];then
|
||||
echo "Username (${user}) already exists. Please re-enter your username."
|
||||
else
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
pass=`rand`
|
||||
echo "Please input ${user}'s password:"
|
||||
read -p "(Default Password: ${pass}):" tmppass
|
||||
[ ! -z ${tmppass} ] && pass=${tmppass}
|
||||
echo "${user} l2tpd ${pass} *" >> /etc/ppp/chap-secrets
|
||||
echo "Username (${user}) add completed."
|
||||
}
|
||||
|
||||
del_user(){
|
||||
while :
|
||||
do
|
||||
read -p "Please input Username you want to delete it:" user
|
||||
if [ -z ${user} ]; then
|
||||
echo "Username can not be empty"
|
||||
else
|
||||
grep -w "${user}" /etc/ppp/chap-secrets >/dev/null 2>&1
|
||||
if [ $? -eq 0 ];then
|
||||
break
|
||||
else
|
||||
echo "Username (${user}) is not exists. Please re-enter your username."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
sed -i "/^\<${user}\>/d" /etc/ppp/chap-secrets
|
||||
echo "Username (${user}) delete completed."
|
||||
}
|
||||
|
||||
mod_user(){
|
||||
while :
|
||||
do
|
||||
read -p "Please input Username you want to change password:" user
|
||||
if [ -z ${user} ]; then
|
||||
echo "Username can not be empty"
|
||||
else
|
||||
grep -w "${user}" /etc/ppp/chap-secrets >/dev/null 2>&1
|
||||
if [ $? -eq 0 ];then
|
||||
break
|
||||
else
|
||||
echo "Username (${user}) is not exists. Please re-enter your username."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
pass=`rand`
|
||||
echo "Please input ${user}'s new password:"
|
||||
read -p "(Default Password: ${pass}):" tmppass
|
||||
[ ! -z ${tmppass} ] && pass=${tmppass}
|
||||
sed -i "/^\<${user}\>/d" /etc/ppp/chap-secrets
|
||||
echo "${user} l2tpd ${pass} *" >> /etc/ppp/chap-secrets
|
||||
echo "Username ${user}'s password has been changed."
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Main process
|
||||
action=$1
|
||||
if [ -z ${action} ] && [ "`basename $0`" != "l2tp" ]; then
|
||||
action=install
|
||||
fi
|
||||
|
||||
case ${action} in
|
||||
install)
|
||||
l2tp 2>&1 | tee ${cur_dir}/l2tp.log
|
||||
;;
|
||||
-l|--list)
|
||||
list_users
|
||||
;;
|
||||
-a|--add)
|
||||
add_user
|
||||
;;
|
||||
-d|--del)
|
||||
del_user
|
||||
;;
|
||||
-m|--mod)
|
||||
mod_user
|
||||
;;
|
||||
-h|--help)
|
||||
echo "Usage: `basename $0` -l,--list List all users"
|
||||
echo " `basename $0` -a,--add Add a user"
|
||||
echo " `basename $0` -d,--del Delete a user"
|
||||
echo " `basename $0` -m,--mod Modify a user password"
|
||||
echo " `basename $0` -h,--help Print this help information"
|
||||
;;
|
||||
*)
|
||||
echo "Usage: `basename $0` [-l,--list|-a,--add|-d,--del|-m,--mod|-h,--help]" && exit
|
||||
;;
|
||||
esac
|
||||
@@ -1,3 +0,0 @@
|
||||
# Secrets for authentication using CHAP
|
||||
# client server secret IP addresses
|
||||
demo demo demo *
|
||||
@@ -1 +0,0 @@
|
||||
%any %any : PSK "midoks"
|
||||
Reference in New Issue
Block a user