commit d5b911abb97e08576435e9bf555666decfcea9aa Author: bvn13 Date: Sat Sep 19 21:27:35 2026 +0300 Add ovpn.sh diff --git a/ovpn.sh b/ovpn.sh new file mode 100644 index 0000000..7058c79 --- /dev/null +++ b/ovpn.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash +# ovpn-p2p.sh — OpenVPN только для связи клиентов между собой. +# Интернет-трафик и DNS клиентов через VPN НЕ идут. +# +# ./ovpn-p2p.sh install <публичный_IP_или_домен> +# ./ovpn-p2p.sh add <имя> # пример: add pc1 10.8.0.11 +# ./ovpn-p2p.sh revoke <имя> +# +# Требования: Debian 11+/Ubuntu 22.04+ (OpenVPN 2.5+), запуск от root. +set -euo pipefail + +PORT="${PORT:-1194}" +NET="10.8.0.0" +MASK="255.255.255.0" +SRV=/etc/openvpn/server +PKI_DIR=$SRV/easy-rsa +OUT=/root/ovpn-clients +export EASYRSA_CRL_DAYS=3650 # иначе через 180 дней CRL протухнет и сервер перестанет пускать всех + +die(){ echo "ERROR: $*" >&2; exit 1; } +[[ $EUID -eq 0 ]] || die "запускай от root" + +update_crl(){ + cd "$PKI_DIR" + ./easyrsa --batch gen-crl + cp pki/crl.pem "$SRV/crl.pem" + chmod 644 "$SRV/crl.pem" +} + +cmd_install(){ + local host="${1:-}" + [[ -n $host ]] || die "usage: $0 install <публичный_IP_или_домен>" + + apt-get update + apt-get install -y openvpn easy-rsa openssl + mkdir -p "$SRV/ccd" /var/log/openvpn "$OUT" + echo "$host" > "$SRV/public_host" + + [[ -d $PKI_DIR ]] || make-cadir "$PKI_DIR" + cd "$PKI_DIR" + [[ -d pki ]] || ./easyrsa --batch init-pki + [[ -f pki/ca.crt ]] || EASYRSA_REQ_CN="p2p-vpn-ca" ./easyrsa --batch build-ca nopass + [[ -f pki/issued/server.crt ]] || ./easyrsa --batch build-server-full server nopass + cp pki/ca.crt pki/issued/server.crt pki/private/server.key "$SRV/" + [[ -f $SRV/ta.key ]] || openvpn --genkey secret "$SRV/ta.key" + update_crl + + cat > "$SRV/server.conf" </dev/null && ufw status | grep -q "Status: active"; then + ufw allow "${PORT}/udp" + fi + + systemctl enable openvpn-server@server + systemctl restart openvpn-server@server + systemctl --no-pager status openvpn-server@server | head -n 5 + echo + echo "Сервер готов. Теперь добавь клиентов: $0 add pc1 10.8.0.11" +} + +cmd_add(){ + local name="${1:-}" ip="${2:-}" + [[ -n $name && -n $ip ]] || die "usage: $0 add <имя> " + [[ -f $SRV/server.conf ]] || die "сначала: $0 install " + [[ $ip =~ ^10\.8\.0\.([0-9]+)$ ]] && (( BASH_REMATCH[1] >= 2 && BASH_REMATCH[1] <= 254 )) \ + || die "IP должен быть в диапазоне 10.8.0.2–10.8.0.254" + + for f in "$SRV"/ccd/*; do + [[ -f $f && $(basename "$f") != "$name" ]] || continue + grep -qx "ifconfig-push $ip $MASK" "$f" && die "IP $ip уже занят клиентом $(basename "$f")" + done + + cd "$PKI_DIR" + [[ -f pki/issued/$name.crt ]] || ./easyrsa --batch build-client-full "$name" nopass + echo "ifconfig-push $ip $MASK" > "$SRV/ccd/$name" + + local host; host=$(cat "$SRV/public_host") + mkdir -p "$OUT" + { + cat <"; cat pki/ca.crt; echo "" + echo ""; openssl x509 -in "pki/issued/$name.crt"; echo "" + echo ""; cat "pki/private/$name.key"; echo "" + echo ""; cat "$SRV/ta.key"; echo "" + } > "$OUT/$name.ovpn" + chmod 600 "$OUT/$name.ovpn" + echo "Готово: $OUT/$name.ovpn (VPN IP: $ip)" +} + +cmd_revoke(){ + local name="${1:-}" + [[ -n $name ]] || die "usage: $0 revoke <имя>" + cd "$PKI_DIR" + ./easyrsa --batch revoke "$name" + update_crl + rm -f "$SRV/ccd/$name" "$OUT/$name.ovpn" + systemctl restart openvpn-server@server + echo "Клиент $name отозван." +} + +case "${1:-}" in + install) shift; cmd_install "$@" ;; + add) shift; cmd_add "$@" ;; + revoke) shift; cmd_revoke "$@" ;; + *) echo "usage: $0 {install | add | revoke }"; exit 1 ;; +esac \ No newline at end of file