#!/bin/sh
OPENVPN=/usr/sbin/openvpn
PIDFILE="/var/run/openvpn.server.pid"
OPENVPN_CONF="/etc/openvpn/server.conf"
OPENVPN_CONF_PATH="/etc/openvpn"
OPENVPN_CA_FILE="/etc/openvpn/easy-rsa/keys/ca.crt"
VPN_CONF="/etc/config/vpn.conf"
VPN_OPENVPN_CONF_PATH="/etc/config/openvpn"
VPN_ONLINE_LOG="/var/log/openvpn_online_user.log"
NIC_NUM=`/sbin/getcfg "Network" "Interface Number" -d "2"`
use_source_route_for_openvpn()
{
TUN_DEV="tun0"
TUN_IP_ADDR="$(ifconfig ${TUN_DEV} 2> /dev/null | sed -n '/inet /{s/.*addr://;s/ .*//;p}')"
TUN_SUBNET=`grep "^server" ${OPENVPN_CONF} | cut -d' ' -f 2`
for LAN_PREFIX in eth bond
do
for (( i=0; i<$NIC_NUM; i=i+1 ))
do
case "$LAN_PREFIX" in
eth)
let ROUTE_TBL=$i+1
;;
bond)
let ROUTE_TBL=$i+11
;;
esac
LAN=$LAN_PREFIX$i
IP_ADDR="$(ifconfig $LAN 2> /dev/null | sed -n '/inet /{s/.*addr://;s/ .*//;p}')"
if [ x$IP_ADDR != "x" ]; then
/bin/ip route add $TUN_SUBNET/24 via $TUN_IP_ADDR dev ${TUN_DEV} tab $ROUTE_TBL &> /dev/null
fi
done
done
/bin/ip route flush cache
}
init_modules()
{
/bin/echo "init insmod for openvpn"
/bin/echo "1" > /proc/sys/net/ipv4/ip_forward
/sbin/insmod /lib/modules/others/tun.ko 1>>/dev/null 2>&1
if [ ! -L /usr/sbin/vpn_check_account ]; then
/bin/ln -sf /sbin/nasutil /usr/sbin/vpn_check_account
fi
if [ ! -L /usr/sbin/vpn_openvpn_download ]; then
/bin/ln -sf /sbin/nasutil /usr/sbin/vpn_openvpn_download
fi
}
init_iptable_modules()
{
[ -L /usr/lib/libxtables.so.7 ] || /bin/ln -sf /usr/lib/libxtables.so.7.0.0 /usr/lib/libxtables.so.7
[ -L /usr/lib/libxtables.so ] || /bin/ln -sf /usr/lib/libxtables.so.7.0.0 /usr/lib/libxtables.so
[ -L /usr/lib/libip4tc.so.0 ] || /bin/ln -sf /usr/lib/libip4tc.so.0.0.0 /usr/lib/libip4tc.so.0
[ -L /usr/lib/libip4tc.so ] || /bin/ln -sf /usr/lib/libip4tc.so.0.0.0 /usr/lib/libip4tc.so
[ -L /usr/lib/libip6tc.so.0 ] || /bin/ln -sf /usr/lib/libip6tc.so.0.0.0 /usr/lib/libip6tc.so.0
[ -L /usr/lib/libip6tc.so ] || /bin/ln -sf /usr/lib/libip6tc.so.0.0.0 /usr/lib/libip6tc.so
/sbin/lsmod | grep x_tables 1>>/dev/null 2>>/dev/null
if [ $? != 0 ]; then
/bin/echo "insmod iptable modules"
for i in x_tables.ko nf_conntrack.ko xt_tcpudp.ko nf_defrag_ipv4.ko nf_conntrack_ipv4.ko nf_nat.ko \
ip_tables.ko iptable_nat.ko iptable_filter.ko ipt_MASQUERADE.ko ipt_REDIRECT.ko
do
[ ! -f /lib/modules/others/vpn/$i ] || /sbin/insmod /lib/modules/others/vpn/$i
done
fi
}
remove_iptable_modules()
{
for i in ipt_REDIRECT ipt_MASQUERADE iptable_filter iptable_nat ip_tables nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 \
xt_tcpudp nf_conntrack x_tables
do
/sbin/rmmod $i
done
}
init_vars()
{
/bin/rm -rf ${OPENVPN_CONF_PATH}/easy-rsa/vars
/bin/touch ${OPENVPN_CONF_PATH}/easy-rsa/vars
cat >${OPENVPN_CONF_PATH}/easy-rsa/vars <<__EOF__
export EASY_RSA="\`pwd\`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=\`\$EASY_RSA/whichopensslcnf \$EASY_RSA\`
export KEY_DIR="\$EASY_RSA/keys"
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
export KEY_SIZE=1024
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="TW"
export KEY_PROVINCE="Taiwan"
export KEY_CITY="Taipei"
export KEY_ORG="QNAP Systems Inc."
export KEY_EMAIL="admin@qnap.com"
export KEY_CN="TS Series
NAS"
export KEY_NAME="
NAS"
export KEY_OU="
NAS"
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234
__EOF__
/bin/chmod 755 ${OPENVPN_CONF_PATH}/easy-rsa/vars
}
init()
{
/bin/echo "openvpn init."
if [ ! -L /etc/rcK.d/K48vpn_openvpn ]; then
/bin/ln -sf ../init.d/vpn_openvpn.sh /etc/rcK.d/K48vpn_openvpn
fi
/sbin/vpn_util init_openvpn
sleep 1
/sbin/vpn_util init_client
sleep 1
/sbin/vpn_util init_readme
sleep 1
/bin/rm ${OPENVPN_CONF_PATH}/connect.sh
/bin/ln -sf /sbin/nasutil ${OPENVPN_CONF_PATH}/connect.sh
/bin/rm ${OPENVPN_CONF_PATH}/disconnect.sh
/bin/ln -sf /sbin/nasutil ${OPENVPN_CONF_PATH}/disconnect.sh
/bin/rm ${OPENVPN_CONF_PATH}/kick.sh
/bin/ln -sf /sbin/nasutil ${OPENVPN_CONF_PATH}/kick.sh
/bin/rm -rf /etc/openvpn/keys
if [ -d ${VPN_OPENVPN_CONF_PATH} ]; then
ADMIN_NAME=`grep "Subject: C=TW" ${VPN_OPENVPN_CONF_PATH}/keys/myserver.crt | cut -d= -f 9`
if [ "${ADMIN_NAME}" == "peterlai@qnap.com" ]; then
/bin/rm -rf ${VPN_OPENVPN_CONF_PATH}
sleep 1
fi
fi
if [ ! -d ${VPN_OPENVPN_CONF_PATH} ]; then
/bin/mkdir -p /etc/config/openvpn/keys
init_vars
sleep 1
cd /etc/openvpn/easy-rsa
source /etc/openvpn/easy-rsa/vars 1>>/dev/null 2>&1
/etc/openvpn/easy-rsa/clean-all 1>>/dev/null 2>&1
sleep 1
/etc/openvpn/easy-rsa/build-dh 1>>/dev/null 2>&1
sleep 80
/etc/openvpn/easy-rsa/pkitool --initca 1>>/dev/null 2>&1
sleep 1
/etc/openvpn/easy-rsa/pkitool --server myserver 1>>/dev/null 2>&1
sleep 1
if [ ! -f ${OPENVPN_CA_FILE} ]; then
sleep 80
if [ -f ${OPENVPN_CA_FILE} ]; then
/bin/cp -rf /etc/openvpn/easy-rsa/keys /etc/config/openvpn
/bin/ln -sf /etc/config/openvpn/keys /etc/openvpn/keys
else
sleep 100
if [ -f ${OPENVPN_CA_FILE} ]; then
/bin/cp -rf /etc/openvpn/easy-rsa/keys /etc/config/openvpn
/bin/ln -sf /etc/config/openvpn/keys /etc/openvpn/keys
else
/bin/echo "openvpn init ${OPENVPN_CA_FILE} ERROR !." >/var/log/err_openvpn_ca.txt
fi
fi
else
/bin/cp -rf /etc/openvpn/easy-rsa/keys /etc/config/openvpn
/bin/ln -sf /etc/config/openvpn/keys /etc/openvpn/keys
fi
else
if [ -f /etc/config/openvpn/keys/ca.crt ]; then
/bin/ln -sf /etc/config/openvpn/keys /etc/openvpn/keys
else
init_vars
sleep 1
cd /etc/openvpn/easy-rsa
source /etc/openvpn/easy-rsa/vars 1>>/dev/null 2>&1
/etc/openvpn/easy-rsa/clean-all 1>>/dev/null 2>&1
sleep 1
/etc/openvpn/easy-rsa/build-dh 1>>/dev/null 2>&1
sleep 60
/etc/openvpn/easy-rsa/pkitool --initca 1>>/dev/null 2>&1
sleep 1
/etc/openvpn/easy-rsa/pkitool --server myserver 1>>/dev/null 2>&1
sleep 1
if [ ! -f ${OPENVPN_CA_FILE} ]; then
sleep 80
if [ -f ${OPENVPN_CA_FILE} ]; then
/bin/cp -rf /etc/openvpn/easy-rsa/keys /etc/config/openvpn
/bin/ln -sf /etc/config/openvpn/keys /etc/openvpn/keys
else
sleep 100
if [ -f ${OPENVPN_CA_FILE} ]; then
/bin/cp -rf /etc/openvpn/easy-rsa/keys /etc/config/openvpn
/bin/ln -sf /etc/config/openvpn/keys /etc/openvpn/keys
else
/bin/echo "openvpn init ${OPENVPN_CA_FILE} ERROR !." >/var/log/err_openvpn_ca.txt
fi
fi
else
/bin/cp -rf /etc/openvpn/easy-rsa/keys /etc/config/openvpn
/bin/ln -sf /etc/config/openvpn/keys /etc/openvpn/keys
fi
fi
fi
/bin/echo "openvpn init OK !."
}
start()
{
if [ ! -f ${OPENVPN} ]; then
/bin/echo "openvpn is not exit."
exit 1
fi
if [ -f ${PIDFILE} ]; then
/bin/echo "openvpn is aleady run."
exit 1
fi
sleep 1
init
if [ `/sbin/getcfg "OPENVPN" "Enable" -u -d "FALSE" -f "${VPN_CONF}"` = "TRUE" ]; then
/bin/echo "openvpn start."
init_modules
sleep 1
init_iptable_modules
/usr/bin/killall openvpn 1>>/dev/null 2>&1
if [ -f ${VPN_ONLINE_LOG} ]; then
/bin/rm ${VPN_ONLINE_LOG}
fi
sleep 1
/sbin/daemon_mgr openvpn start "${OPENVPN} --writepid ${PIDFILE} --daemon ovpn-server --cd ${OPENVPN_CONF_PATH} --config ${OPENVPN_CONF} --script-security 3"
LOCALIP=`grep "^server" ${OPENVPN_CONF} | cut -d' ' -f 2`
INTERFACE=`/sbin/getcfg "OPENVPN" "interface" -d "eth0" -f "${VPN_CONF}"`
/bin/echo "LOCALIP = ${LOCALIP} INTERFACE = ${INTERFACE}"
/sbin/iptables -t nat -A POSTROUTING -s ${LOCALIP}/24 -o ${INTERFACE} -j MASQUERADE
use_source_route_for_openvpn
else
/bin/echo "openvpn is disabled."
fi
}
stop()
{
/bin/echo "openvpn stop."
LOCALIP=`grep "^server" ${OPENVPN_CONF} | cut -d' ' -f 2`
INTERFACE=`/sbin/getcfg "OPENVPN" "interface" -d "eth0" -f "${VPN_CONF}"`
/bin/echo "LOCALIP = ${LOCALIP} INTERFACE = ${INTERFACE}"
/sbin/iptables -t nat -D POSTROUTING -s ${LOCALIP}/24 -o ${INTERFACE} -j MASQUERADE
if [ -f ${PIDFILE} ]; then
/sbin/daemon_mgr openvpn stop "{OPENVPN}"
/bin/kill -9 `/bin/cat ${PIDFILE}` 1>>/dev/null 2>&1
fi
if [ -f ${PIDFILE} ]; then
/bin/rm -f ${PIDFILE} 1>>/dev/null 2>&1
fi
if [ -f ${VPN_ONLINE_LOG} ]; then
/bin/rm -f ${VPN_ONLINE_LOG} 1>>/dev/null 2>&1
/bin/touch ${VPN_ONLINE_LOG}
fi
sleep 2
/sbin/rmmod tun 1>>/dev/null 2>&1
}
reload()
{
/bin/echo "openvpn reload."
LOCALIP=`grep "^server" ${OPENVPN_CONF} | cut -d' ' -f 2`
INTERFACE=`/sbin/getcfg "OPENVPN" "interface" -d "eth0" -f "${VPN_CONF}"`
/bin/echo "LOCALIP = ${LOCALIP} INTERFACE = ${INTERFACE}"
/sbin/iptables -t nat -D POSTROUTING -s ${LOCALIP}/24 -o ${INTERFACE} -j MASQUERADE
if [ -f ${PIDFILE} ]; then
/bin/kill -s HUP `/bin/cat ${PIDFILE}` 1>>/dev/null 2>&1
fi
LOCALIP=`grep "^server" ${OPENVPN_CONF} | cut -d' ' -f 2`
INTERFACE=`/sbin/getcfg "OPENVPN" "interface" -d "eth0" -f "${VPN_CONF}"`
/bin/echo "LOCALIP = ${LOCALIP} INTERFACE = ${INTERFACE}"
/sbin/iptables -t nat -A POSTROUTING -s ${LOCALIP}/24 -o ${INTERFACE} -j MASQUERADE
use_source_route_for_openvpn
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
/bin/sleep 2
start
;;
init)
init
;;
reload)
reload
;;
*)
echo "Usage: /etc/init.d/$0 {start|stop|restart|reload}"
exit 1
esac
exit 0