Hallo Zusammen,
wir haben aus diversen Foren und Eigenarbeit folgendes Script erstellt, um für die Mobydick gültige Zertifikate herzustellen die es ermöglichen eine VPN Verbindung mit z.B Usern oder Telefonen aufzubauen. Wir sind jetzt nicht wirklich die Zertifikatprofis, daher besteht unsererseits die Frage ob dies schon einmal jemand in ähnlicher oder besserer Form gemacht hat. Und uns sagt ob dies so korrekt ist oder wir hier einen groben Fehler drin haben.
#!/bin/bash
# OpenVPN für Pascom TK-Anlagen angepasst durch Computer-Rausch M-CR
# Vor der Ausführung des Skriptes empfehlen wir noch die Anpassungen an der MobyDick
# vorzunehmen.
#Es kann via SSH admin login und erhöhen der Rechte mittels sudo -i der folgende Part ausgeführt werden.
# cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /root/easy-rsa/
#In diesem Ordner befindet sich eine vars Datei, in dem folgende Inhalte für Ihr Unternehmen angepasst werden sollten:
# (nano /root/easy-rsa/vars)
# --
# export KEY_SIZE=2048
# export KEY_COUNTRY="DE"
# export KEY_PROVINCE="RLP"
# export KEY_CITY="Guellesheim"
# export KEY_ORG="Computer-Rausch M-CR"
# export KEY_EMAIL="support@m-cr.de (http://m-cr.de)"
# Wechseln in das Verzichnis der PKI:
# cd /root/easy-rsa/. ./vars
# ./clean-all
#Das Skript kopieren Sie am Basten mittels SFTP in das home Verzeichnis des Administrators,
# /etc/admin
#Dieses Skript muss mit folgendem Befehl ausgeführt werden,
#die Anlage sollte bereits im Netzwerk konfiguriert sein und eine Internetverbindung haben.
#+++++++++++++++ bash MobyDick_Zert_install.sh ++++++++++++++++
# Nach dem Ausführen des Skriptes und der Zertifikatanlage für die Benutzer(Endgeräte) können diese,
# via SFTP in dem Orner /etc/USER-PKI mit der entsprechenden angelegten Bezeichner heruntergeladen werden.
# In der XXX.tar Datei sind alle erforderlichen Dateien für den Client z.B. Yealink enthalten.
# Detect Debian users running the script with "sh" instead of bash
if readlink /proc/$$/exe | grep -qs "dash"; then
echo "Dieses Skript muss als bash ausgeführt werden und nicht mit sh"
exit 1
fi
if [[ "$EUID" -ne 0 ]]; then
echo "Sie müssen dieses Skript erneut als ROOT ausführen"
exit 2
fi
if [[ ! -e /dev/net/tun ]]; then
echo "The TUN device is not available
You need to enable TUN before running this script"
exit 3
fi
if grep -qs "CentOS release 5" "/etc/redhat-release"; then
echo "CentOS 5 is too old and not supported"
exit 4
fi
if [[ -e /etc/debian_version ]]; then
OS=debian
GROUPNAME=nogroup
RCLOCAL='/etc/rc.local'
elif [[ -e /etc/centos-release || -e /etc/redhat-release ]]; then
OS=centos
GROUPNAME=nobody
RCLOCAL='/etc/rc.d/rc.local'
else
echo "Dieses Skript ist für diese Pascom Version nicht geeignet"
exit 5
fi
newclient () {
# Generates the custom client.ovpn
cp /etc/openvpn/client-common.txt ~/$1.ovpn
echo "<ca>" >> ~/$1.ovpn
cat /etc/openvpn/easy-rsa/pki/ca.crt >> ~/$1.ovpn
echo "</ca>" >> ~/$1.ovpn
echo "<cert>" >> ~/$1.ovpn
cat /etc/openvpn/easy-rsa/pki/issued/$1.crt >> ~/$1.ovpn
echo "</cert>" >> ~/$1.ovpn
echo "<key>" >> ~/$1.ovpn
cat /etc/openvpn/easy-rsa/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
# Kopieren der Dateien Nach USER-PKI und TAR erzeugen
mkdir -p /etc/USER-PKI
cp /etc/root/$1.ovpn /etc/USER-PKI/
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/USER-PKI/
cp /etc/openvpn/easy-rsa/pki/issued/$1.crt /etc/USER-PKI/
cp /etc/openvpn/easy-rsa/pki/private/$1.key /etc/USER-PKI/
cp /etc/openvpn/ta.key /etc/USER-PKI/
cd /etc/USER-PKI
tar czf $1.tar $1.ovpn $1.crt $1.key ca.crt
echo "Die TAR Datei wird im Verzeichnis /etc/USER-PKI/XXX.tar abgelegt dies kann 10 Sekunden dauern!"
sleep 10
chown admin:admin /etc/USER-PKI/$1.tar
}
# Try to get our IP from the system and fallback to the Internet.
# I do this to make the script compatible with NATed servers (lowendspirit.com)
# and to avoid getting an IPv6.
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 für Pascom bereits installiert"
echo ""
echo "Was möchten Sie tun?"
echo " 1) Benutzer hinzufügen"
echo " 2) Benutzer löschen"
echo " 3) !!! Achtung !!! OpenVPN auf der Pascom TK-Anlage entfernen"
echo " 4) Skript Beenden"
read -p "Bitte wählen Sie die gewünschte Option [1-4]: " option
case $option in
1)
echo ""
echo "Bitte geben Sie den Namen für das Client Zertifikat ein"
echo "Bitte nur Buchstaben und Zahlen und keine Sonderzeichen verwenden!"
#Beginn des Testes
echo "Folgende Zertifikate sind bereits vorhanden"
tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') '
echo "Bitte wählen Sie eine nicht vorhandene Bezeichnung"
read -p "Zertifikatname: " -e -i MCRTK"$CLIENTNUMBER" CLIENT
cd /etc/openvpn/easy-rsa/
./easyrsa build-client-full $CLIENT nopass
# Generates the custom client.ovpn
newclient "$CLIENT"
echo ""
echo "Der Benutzer mit dem Namen $CLIENT wurde hinzugefügt, die Konfiguration ist unter folgendem Namen zu finden" ~/"$CLIENT.ovpn"
exit
;;
2)
# This option could be documented a bit better and maybe even be simplimplified
# ...but what can I say, I want some sleep too
NUMBEROFCLIENTS=$(tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep -c "^V")
if [[ "$NUMBEROFCLIENTS" = '0' ]]; then
echo ""
echo "Sie haben keine Zertifikate zum löschen angelegt!"
exit 6
fi
echo ""
echo "Bitte wählen Sie das zu löschende Zertifikat aus"
tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') '
if [[ "$NUMBEROFCLIENTS" = '1' ]]; then
read -p "Bitte wählen Sie ein Zertifikat [1]: " CLIENTNUMBER
else
read -p "Bitte wählen Sie ein Zertifikat [1-$NUMBEROFCLIENTS]: " CLIENTNUMBER
fi
CLIENT=$(tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | sed -n "$CLIENTNUMBER"p)
cd /etc/openvpn/easy-rsa/
./easyrsa --batch revoke $CLIENT
EASYRSA_CRL_DAYS=3650 ./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/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem
# CRL is read with each client connection, when OpenVPN is dropped to nobody
chown nobody:$GROUPNAME /etc/openvpn/crl.pem
cd /etc/
rm -rf /etc/USER-PKI/$CLIENT.crt
rm -rf /etc/USER-PKI/$CLIENT.key
rm -rf /etc/USER-PKI/$CLIENT.tar
rm -rf /etc/USER-PKI/$CLIENT.ovpn
echo ""
echo "Das Zertifikat $CLIENT wurde gelöscht"
exit
;;
3)
echo ""
read -p "Möchten Sie wirklich OpenVPN von dieser Pascom TK-Anlage entfernen? [y/n]: " -e -i n REMOVE
if [[ "$REMOVE" = 'y' ]]; then
PORT=$(grep '^port ' /etc/openvpn/server.conf | cut -d " " -f 2)
PROTOCOL=$(grep '^proto ' /etc/openvpn/server.conf | cut -d " " -f 2)
if pgrep firewalld; then
IP=$(firewall-cmd --direct --get-rules ipv4 nat POSTROUTING | grep '\-s 192.168.10.0/24 '"'"'!'"'"' -d 192.168.10.0/24 -j SNAT --to ' | cut -d " " -f 10)
# Using both permanent and not permanent rules to avoid a firewalld reload.
firewall-cmd --zone=public --remove-port=$PORT/$PROTOCOL
firewall-cmd --zone=trusted --remove-source=192.168.10.0/24
firewall-cmd --permanent --zone=public --remove-port=$PORT/$PROTOCOL
firewall-cmd --permanent --zone=trusted --remove-source=192.168.10.0/24
firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j SNAT --to $IP
firewall-cmd --permanent --direct --remove-rule ipv4 nat POSTROUTING 0 -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j SNAT --to $IP
else
IP=$(grep 'iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j SNAT --to ' $RCLOCAL | cut -d " " -f 14)
iptables -t nat -D POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j SNAT --to $IP
sed -i '/iptables -t nat -A POSTROUTING -s 192.168.10.0\/24 ! -d 192.168.10.0\/24 -j SNAT --to /d' $RCLOCAL
if iptables -L -n | grep -qE '^ACCEPT'; then
iptables -D INPUT -p $PROTOCOL --dport $PORT -j ACCEPT
iptables -D FORWARD -s 192.168.10.0/24 -j ACCEPT
iptables -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
sed -i "/iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT/d" $RCLOCAL
sed -i "/iptables -I FORWARD -s 192.168.10.0\/24 -j ACCEPT/d" $RCLOCAL
sed -i "/iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT/d" $RCLOCAL
fi
fi
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
if [[ "$OS" = 'debian' ]]; then
apt-get remove --purge -y openvpn
else
yum remove openvpn -y
fi
rm -rf /etc/openvpn
echo ""
echo "OpenVPN für Pascom wurde entfernt!"
else
echo ""
echo "Das entfernen von OpenVPN für Pascom wurde abgebrochen!"
fi
exit
;;
4) exit;;
esac
done
else
clear
echo 'Willkomen zur Installation von OpenVPN für Pascom "road warrior" '
echo ""
# OpenVPN setup and first user creation
echo "Wir benötigen während der Installation einige Informationen"
echo "Sie können die Standardeinträge stehen lassen,"
echo "empfehlen jedoch diese individuell anzupassen"
echo ""
echo "Zuerst benötigen wir die IPv4 Adresse bei der OpenVPN für Pascom,"
echo "angesprochen werden soll"
echo "Wir haben die folgende bereits für Sie ermittelt"
read -p "IP-Addresse: " -e -i $IP IP
echo ""
echo "Bitte wählen Sie welches Protokoll bei OpenVPN für Pascom verwenden soll?"
echo " 1) UDP (standard)"
echo " 2) TCP"
read -p "Protokoll [1-2]: " -e -i 1 PROTOCOL
case $PROTOCOL in
1)
PROTOCOL=udp
;;
2)
PROTOCOL=tcp
;;
esac
echo ""
echo "Bitte wählen Sie den zu öffnenden Firewall-Port bei OpenVPN für Pascom,"
echo "auf dem die Kommunikation stattfinden wird?"
read -p "Port: " -e -i 1194 PORT
echo ""
echo "Welche DNS Server möchten Sie auf dem Ethernet Port einstellen?"
echo "Wir empfehlen Aktuelle Systemeinstellungen beizubehalten"
echo " 1) Aktuelle Systemeinstellungen"
echo " 2) Google"
echo " 3) OpenDNS"
echo " 4) NTT"
echo " 5) Hurricane Electric"
echo " 6) Verisign"
read -p "DNS [1-6]: " -e -i 1 DNS
echo ""
echo "Zum Schluss, erstellen wir nun das Zertifikat für den Client"
echo "Bitte nur Buchstaben und Zahlen verwenden, keine Sonderzeichen"
read -p "Zertifikatname: " -e -i MCRTK"$CLIENTNUMBER+1" CLIENT
echo ""
echo "Nun haben wir alle Informationen zusammen und die Installation kann beginnen"
read -n1 -r -p "Zum Fortsetzen beliebige Taste drücken"
if [[ "$OS" = 'debian' ]]; then
apt-get update
apt-get install openvpn iptables openssl ca-certificates -y
else
# Else, the distro is CentOS
yum install epel-release -y
yum install openvpn iptables openssl wget ca-certificates -y
fi
# An old version of easy-rsa was available by default in some openvpn packages
if [[ -d /etc/openvpn/easy-rsa/ ]]; then
rm -rf /etc/openvpn/easy-rsa/
fi
# Get easy-rsa
wget -O ~/EasyRSA-3.0.3.tgz "https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz"
tar xzf ~/EasyRSA-3.0.3.tgz -C ~/
# Temporal fix for issue #353, which is caused by OpenVPN/easy-rsa#135
# Will be removed as soon as a new release of easy-rsa is available
sed -i 's/\[\[/\[/g;s/\]\]/\]/g;s/==/=/g' ~/EasyRSA-3.0.3/easyrsa
mv ~/EasyRSA-3.0.3/ /etc/openvpn/
mv /etc/openvpn/EasyRSA-3.0.3/ /etc/openvpn/easy-rsa/
chown -R root:root /etc/openvpn/easy-rsa/
rm -rf ~/EasyRSA-3.0.3.tgz
cd /etc/openvpn/easy-rsa/
# Create the PKI, set up the CA, the DH params and the server + client certificates
./easyrsa init-pki
./easyrsa --batch build-ca nopass
./easyrsa gen-dh
./easyrsa build-server-full server nopass
./easyrsa build-client-full $CLIENT nopass
EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
# Move the stuff we need
cp pki/ca.crt pki/private/ca.key pki/dh.pem pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn
# CRL is read with each client connection, when OpenVPN is dropped to nobody
chown nobody:$GROUPNAME /etc/openvpn/crl.pem
# Generate key for tls-auth
openvpn --genkey --secret /etc/openvpn/ta.key
# Generate server.conf
echo "port $PORT
proto $PROTOCOL
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-auth ta.key 0
topology subnet
server 192.168.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt" > /etc/openvpn/server.conf
echo 'push "redirect-gateway def1 bypass-dhcp"' >> /etc/openvpn/server.conf
# DNS
case $DNS in
1)
# Obtain the resolvers from resolv.conf and use them for 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
;;
3)
echo 'push "dhcp-option DNS 208.67.222.222"' >> /etc/openvpn/server.conf
echo 'push "dhcp-option DNS 208.67.220.220"' >> /etc/openvpn/server.conf
;;
4)
echo 'push "dhcp-option DNS 129.250.35.250"' >> /etc/openvpn/server.conf
echo 'push "dhcp-option DNS 129.250.35.251"' >> /etc/openvpn/server.conf
;;
5)
echo 'push "dhcp-option DNS 74.82.42.42"' >> /etc/openvpn/server.conf
;;
6)
echo 'push "dhcp-option DNS 64.6.64.6"' >> /etc/openvpn/server.conf
echo 'push "dhcp-option DNS 64.6.65.6"' >> /etc/openvpn/server.conf
;;
esac
echo "keepalive 10 120
cipher AES-256-CBC
comp-lzo
user nobody
group $GROUPNAME
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem" >> /etc/openvpn/server.conf
# Enable net.ipv4.ip_forward for the system
sed -i '/\<net.ipv4.ip_forward\>/c\net.ipv4.ip_forward=1' /etc/sysctl.conf
if ! grep -q "\<net.ipv4.ip_forward\>" /etc/sysctl.conf; then
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
fi
# Avoid an unneeded reboot
echo 1 > /proc/sys/net/ipv4/ip_forward
if pgrep firewalld; then
# Using both permanent and not permanent rules to avoid a firewalld
# reload.
# We don't use --add-service=openvpn because that would only work with
# the default port and protocol.
firewall-cmd --zone=public --add-port=$PORT/$PROTOCOL
firewall-cmd --zone=trusted --add-source=192.168.10.0/24
firewall-cmd --permanent --zone=public --add-port=$PORT/$PROTOCOL
firewall-cmd --permanent --zone=trusted --add-source=192.168.10.0/24
# Set NAT for the VPN subnet
firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j SNAT --to $IP
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j SNAT --to $IP
else
# Needed to use rc.local with some systemd distros
if [[ "$OS" = 'debian' && ! -e $RCLOCAL ]]; then
echo '#!/bin/sh -e
exit 0' > $RCLOCAL
fi
chmod +x $RCLOCAL
# Set NAT for the VPN subnet
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j SNAT --to $IP
sed -i "1 a\iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j SNAT --to $IP" $RCLOCAL
if iptables -L -n | grep -qE '^(REJECT|DROP)'; then
# If iptables has at least one REJECT rule, we asume this is needed.
# Not the best approach but I can't think of other and this shouldn't
# cause problems.
iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT
iptables -I FORWARD -s 192.168.10.0/24 -j ACCEPT
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
sed -i "1 a\iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT" $RCLOCAL
sed -i "1 a\iptables -I FORWARD -s 192.168.10.0/24 -j ACCEPT" $RCLOCAL
sed -i "1 a\iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT" $RCLOCAL
fi
fi
# If SELinux is enabled and a custom port or TCP was selected, we need this
if hash sestatus 2>/dev/null; then
if sestatus | grep "Current mode" | grep -qs "enforcing"; then
if [[ "$PORT" != '1194' || "$PROTOCOL" = 'tcp' ]]; then
# semanage isn't available in CentOS 6 by default
if ! hash semanage 2>/dev/null; then
yum install policycoreutils-python -y
fi
semanage port -a -t openvpn_port_t -p $PROTOCOL $PORT
fi
fi
fi
# And finally, restart OpenVPN
if [[ "$OS" = 'debian' ]]; then
# Little hack to check for systemd
if pgrep systemd-journal; then
systemctl restart openvpn@server.service
else
/etc/init.d/openvpn restart
fi
else
if pgrep systemd-journal; then
systemctl restart openvpn@server.service
systemctl enable openvpn@server.service
else
service openvpn restart
chkconfig openvpn on
fi
fi
# Try to detect a NATed connection and ask about it to potential LowEndSpirit users
EXTERNALIP=$(wget -4qO- "http://whatismyip.akamai.com/")
if [[ "$IP" != "$EXTERNALIP" ]]; then
echo ""
echo "Es sieht so, dass Ihre Telefonanlage NAT benötigt!"
echo ""
echo "Falls Sie NAT benötigen,"
echo "müssen Sie Ihre externe Feste-IP oder den DYNDNS Namen eintragen"
echo "Falls Sie eine Fest zugewiesene IP Benutzen,"
echo "können Sie das Feld leer lassen oder die IP eintragen"
read -p "ext. IP oder DYNDNS: " -e USEREXTERNALIP
if [[ "$USEREXTERNALIP" != "" ]]; then
IP=$USEREXTERNALIP
fi
fi
# client-common.txt is created so we have a template to add further users later
echo "client
dev tun
proto $PROTOCOL
sndbuf 0
rcvbuf 0
remote $IP $PORT
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
comp-lzo
setenv opt block-outside-dns
key-direction 1
verb 3" > /etc/openvpn/client-common.txt
# Generates the custom client.ovpn
newclient "$CLIENT"
echo ""
echo "Abgeschlossen!"
echo ""
echo "Ihr Zertifikat ist unter folgendem Namen verfügbar" ~/"$CLIENT.ovpn"
echo "Falls Sie weitere Zertifikate erstellen möchten,"
echo "führen Sie das Skript einfach erneut aus!"
fi
```