• linux部署校园网绕过53端口服务脚本


    适用于Ubuntu、Debian、AlmaLinux、Rocky Linux、CentOS和Fedora的OpenUPN 安装程序。

    该脚本将在不到一分钟的时间内为您设置自己的虚拟网络服务器,即使您以前没有使用过Open虚拟网络。它被设计为尽可能不引人注目和通用。
    新建这个脚本, 写入最后的内容

    vi openupn-install.sh
    
    • 1

    安装

    运行脚本并按照助手的指示进行操作:
    centos7

    bash openupn-install.sh
    
    • 1

    ubuntu

    ./openupn-install.sh
    
    • 1

    运行后:

    欢迎使用这个OpenUPN Road Warrior安装程序!
    
    应使用哪个IPv4地址?
         1) 10.0.0.18
         2) 172.17.0.1
    IPv4地址 [1]: 1
    
    此服务器位于NAT后面。公共IPv4地址或主机名是什么?
    公共IPv4地址/主机名 [222.219.232.174]: 1
    
    OpenVPN应使用哪种协议?
       1) UDP(推荐)
       2) TCP
    协议 [1]: 1
    
    OpenUPN应监听哪个端口?
    端口 [1194]: 53
    
    为客户端选择一个DNS服务器:
       1) 当前系统解析器
       2) Google
       3) 1.1.1.1
       4) OpenDNS
       5) Quad9
       6) AdGuard
    DNS服务器 [1]: 2
    
    为第一个客户端输入一个名称:
    名称 [client]: yhhdxtn
    
    OpenUPN安装准备开始。
    按任意键继续...
    
    • 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

    脚本内容

    #!/bin/bash
    # Copyright (c) 2013 Nyr. Released under the MIT License.
    
    
    # Detect Debian users running the script with "sh" instead of bash
    if readlink /proc/$$/exe | grep -q "dash"; then
    	echo 'This installer needs to be run with "bash", not "sh".'
    	exit
    fi
    
    # Discard stdin. Needed when running from an one-liner which includes a newline
    read -N 999999 -t 0.001
    
    # Detect OpenVZ 6
    if [[ $(uname -r | cut -d "." -f 1) -eq 2 ]]; then
    	echo "The system is running an old kernel, which is incompatible with this installer."
    	exit
    fi
    
    # Detect OS
    # $os_version variables aren't always in use, but are kept here for convenience
    if grep -qs "ubuntu" /etc/os-release; then
    	os="ubuntu"
    	os_version=$(grep 'VERSION_ID' /etc/os-release | cut -d '"' -f 2 | tr -d '.')
    	group_name="nogroup"
    elif [[ -e /etc/debian_version ]]; then
    	os="debian"
    	os_version=$(grep -oE '[0-9]+' /etc/debian_version | head -1)
    	group_name="nogroup"
    elif [[ -e /etc/almalinux-release || -e /etc/rocky-release || -e /etc/centos-release ]]; then
    	os="centos"
    	os_version=$(grep -shoE '[0-9]+' /etc/almalinux-release /etc/rocky-release /etc/centos-release | head -1)
    	group_name="nobody"
    elif [[ -e /etc/fedora-release ]]; then
    	os="fedora"
    	os_version=$(grep -oE '[0-9]+' /etc/fedora-release | head -1)
    	group_name="nobody"
    else
    	echo "This installer seems to be running on an unsupported distribution.
    Supported distros are Ubuntu, Debian, AlmaLinux, Rocky Linux, CentOS and Fedora."
    	exit
    fi
    
    if [[ "$os" == "ubuntu" && "$os_version" -lt 1804 ]]; then
    	echo "Ubuntu 18.04 or higher is required to use this installer.
    This version of Ubuntu is too old and unsupported."
    	exit
    fi
    
    if [[ "$os" == "debian" ]]; then
    	if grep -q '/sid' /etc/debian_version; then
    		echo "Debian Testing and Debian Unstable are unsupported by this installer."
    		exit
    	fi
    	if [[ "$os_version" -lt 9 ]]; then
    		echo "Debian 9 or higher is required to use this installer.
    This version of Debian is too old and unsupported."
    		exit
    	fi
    fi
    
    if [[ "$os" == "centos" && "$os_version" -lt 7 ]]; then
    	echo "CentOS 7 or higher is required to use this installer.
    This version of CentOS is too old and unsupported."
    	exit
    fi
    
    # Detect environments where $PATH does not include the sbin directories
    if ! grep -q sbin <<< "$PATH"; then
    	echo '$PATH does not include sbin. Try using "su -" instead of "su".'
    	exit
    fi
    
    if [[ "$EUID" -ne 0 ]]; then
    	echo "This installer needs to be run with superuser privileges."
    	exit
    fi
    
    if [[ ! -e /dev/net/tun ]] || ! ( exec 7<>/dev/net/tun ) 2>/dev/null; then
    	echo "The system does not have the TUN device available.
    TUN needs to be enabled before running this installer."
    	exit
    fi
    
    new_client () {
    	# Generates the custom client.ovpn
    	{
    	cat /etc/openvpn/server/client-common.txt
    	echo ""
    	cat /etc/openvpn/server/easy-rsa/pki/ca.crt
    	echo ""
    	echo ""
    	sed -ne '/BEGIN CERTIFICATE/,$ p' /etc/openvpn/server/easy-rsa/pki/issued/"$client".crt
    	echo ""
    	echo ""
    	cat /etc/openvpn/server/easy-rsa/pki/private/"$client".key
    	echo ""
    	echo ""
    	sed -ne '/BEGIN OpenVPN Static key/,$ p' /etc/openvpn/server/tc.key
    	echo ""
    	} > ~/"$client".ovpn
    }
    
    if [[ ! -e /etc/openvpn/server/server.conf ]]; then
    	# Detect some Debian minimal setups where neither wget nor curl are installed
    	if ! hash wget 2>/dev/null && ! hash curl 2>/dev/null; then
    		echo "Wget is required to use this installer."
    		read -n1 -r -p "Press any key to install Wget and continue..."
    		apt-get update
    		apt-get install -y wget
    	fi
    	clear
    	echo 'Welcome to this OpenVPN road warrior installer!'
    	# If system has a single IPv4, it is selected automatically. Else, ask the user
    	if [[ $(ip -4 addr | grep inet | grep -vEc '127(\.[0-9]{1,3}){3}') -eq 1 ]]; then
    		ip=$(ip -4 addr | grep inet | grep -vE '127(\.[0-9]{1,3}){3}' | cut -d '/' -f 1 | grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}')
    	else
    		number_of_ip=$(ip -4 addr | grep inet | grep -vEc '127(\.[0-9]{1,3}){3}')
    		echo
    		echo "Which IPv4 address should be used?"
    		ip -4 addr | grep inet | grep -vE '127(\.[0-9]{1,3}){3}' | cut -d '/' -f 1 | grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' | nl -s ') '
    		read -p "IPv4 address [1]: " ip_number
    		until [[ -z "$ip_number" || "$ip_number" =~ ^[0-9]+$ && "$ip_number" -le "$number_of_ip" ]]; do
    			echo "$ip_number: invalid selection."
    			read -p "IPv4 address [1]: " ip_number
    		done
    		[[ -z "$ip_number" ]] && ip_number="1"
    		ip=$(ip -4 addr | grep inet | grep -vE '127(\.[0-9]{1,3}){3}' | cut -d '/' -f 1 | grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' | sed -n "$ip_number"p)
    	fi
    	# If $ip is a private IP address, the server must be behind NAT
    	if echo "$ip" | grep -qE '^(10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|192\.168)'; then
    		echo
    		echo "This server is behind NAT. What is the public IPv4 address or hostname?"
    		# Get public IP and sanitize with grep
    		get_public_ip=$(grep -m 1 -oE '^[0-9]{1,3}(\.[0-9]{1,3}){3}$' <<< "$(wget -T 10 -t 1 -4qO- "http://ip1.dynupdate.no-ip.com/" || curl -m 10 -4Ls "http://ip1.dynupdate.no-ip.com/")")
    		read -p "Public IPv4 address / hostname [$get_public_ip]: " public_ip
    		# If the checkip service is unavailable and user didn't provide input, ask again
    		until [[ -n "$get_public_ip" || -n "$public_ip" ]]; do
    			echo "Invalid input."
    			read -p "Public IPv4 address / hostname: " public_ip
    		done
    		[[ -z "$public_ip" ]] && public_ip="$get_public_ip"
    	fi
    	# If system has a single IPv6, it is selected automatically
    	if [[ $(ip -6 addr | grep -c 'inet6 [23]') -eq 1 ]]; then
    		ip6=$(ip -6 addr | grep 'inet6 [23]' | cut -d '/' -f 1 | grep -oE '([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}')
    	fi
    	# If system has multiple IPv6, ask the user to select one
    	if [[ $(ip -6 addr | grep -c 'inet6 [23]') -gt 1 ]]; then
    		number_of_ip6=$(ip -6 addr | grep -c 'inet6 [23]')
    		echo
    		echo "Which IPv6 address should be used?"
    		ip -6 addr | grep 'inet6 [23]' | cut -d '/' -f 1 | grep -oE '([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}' | nl -s ') '
    		read -p "IPv6 address [1]: " ip6_number
    		until [[ -z "$ip6_number" || "$ip6_number" =~ ^[0-9]+$ && "$ip6_number" -le "$number_of_ip6" ]]; do
    			echo "$ip6_number: invalid selection."
    			read -p "IPv6 address [1]: " ip6_number
    		done
    		[[ -z "$ip6_number" ]] && ip6_number="1"
    		ip6=$(ip -6 addr | grep 'inet6 [23]' | cut -d '/' -f 1 | grep -oE '([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}' | sed -n "$ip6_number"p)
    	fi
    	echo
    	echo "Which protocol should OpenVPN use?"
    	echo "   1) UDP (recommended)"
    	echo "   2) TCP"
    	read -p "Protocol [1]: " protocol
    	until [[ -z "$protocol" || "$protocol" =~ ^[12]$ ]]; do
    		echo "$protocol: invalid selection."
    		read -p "Protocol [1]: " protocol
    	done
    	case "$protocol" in
    		1|"") 
    		protocol=udp
    		;;
    		2) 
    		protocol=tcp
    		;;
    	esac
    	echo
    	echo "What port should OpenVPN listen to?"
    	read -p "Port [1194]: " port
    	until [[ -z "$port" || "$port" =~ ^[0-9]+$ && "$port" -le 65535 ]]; do
    		echo "$port: invalid port."
    		read -p "Port [1194]: " port
    	done
    	[[ -z "$port" ]] && port="1194"
    	echo
    	echo "Select a DNS server for the clients:"
    	echo "   1) Current system resolvers"
    	echo "   2) Google"
    	echo "   3) 1.1.1.1"
    	echo "   4) OpenDNS"
    	echo "   5) Quad9"
    	echo "   6) AdGuard"
    	read -p "DNS server [1]: " dns
    	until [[ -z "$dns" || "$dns" =~ ^[1-6]$ ]]; do
    		echo "$dns: invalid selection."
    		read -p "DNS server [1]: " dns
    	done
    	echo
    	echo "Enter a name for the first client:"
    	read -p "Name [client]: " unsanitized_client
    	# Allow a limited set of characters to avoid conflicts
    	client=$(sed 's/[^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-]/_/g' <<< "$unsanitized_client")
    	[[ -z "$client" ]] && client="client"
    	echo
    	echo "OpenVPN installation is ready to begin."
    	# Install a firewall if firewalld or iptables are not already available
    	if ! systemctl is-active --quiet firewalld.service && ! hash iptables 2>/dev/null; then
    		if [[ "$os" == "centos" || "$os" == "fedora" ]]; then
    			firewall="firewalld"
    			# We don't want to silently enable firewalld, so we give a subtle warning
    			# If the user continues, firewalld will be installed and enabled during setup
    			echo "firewalld, which is required to manage routing tables, will also be installed."
    		elif [[ "$os" == "debian" || "$os" == "ubuntu" ]]; then
    			# iptables is way less invasive than firewalld so no warning is given
    			firewall="iptables"
    		fi
    	fi
    	read -n1 -r -p "Press any key to continue..."
    	# If running inside a container, disable LimitNPROC to prevent conflicts
    	if systemd-detect-virt -cq; then
    		mkdir /etc/systemd/system/openvpn-server@server.service.d/ 2>/dev/null
    		echo "[Service]
    LimitNPROC=infinity" > /etc/systemd/system/openvpn-server@server.service.d/disable-limitnproc.conf
    	fi
    	if [[ "$os" = "debian" || "$os" = "ubuntu" ]]; then
    		apt-get update
    		apt-get install -y --no-install-recommends openvpn openssl ca-certificates $firewall
    	elif [[ "$os" = "centos" ]]; then
    		yum install -y epel-release
    		yum install -y openvpn openssl ca-certificates tar $firewall
    	else
    		# Else, OS must be Fedora
    		dnf install -y openvpn openssl ca-certificates tar $firewall
    	fi
    	# If firewalld was just installed, enable it
    	if [[ "$firewall" == "firewalld" ]]; then
    		systemctl enable --now firewalld.service
    	fi
    	# Get easy-rsa
    	easy_rsa_url='https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.7/EasyRSA-3.1.7.tgz'
    	mkdir -p /etc/openvpn/server/easy-rsa/
    	{ wget -qO- "$easy_rsa_url" 2>/dev/null || curl -sL "$easy_rsa_url" ; } | tar xz -C /etc/openvpn/server/easy-rsa/ --strip-components 1
    	chown -R root:root /etc/openvpn/server/easy-rsa/
    	cd /etc/openvpn/server/easy-rsa/
    	# Create the PKI, set up the CA and the server and client certificates
    	./easyrsa --batch init-pki
    	./easyrsa --batch build-ca nopass
    	./easyrsa --batch --days=3650 build-server-full server nopass
    	./easyrsa --batch --days=3650 build-client-full "$client" nopass
    	./easyrsa --batch --days=3650 gen-crl
    	# Move the stuff we need
    	cp pki/ca.crt pki/private/ca.key pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn/server
    	# CRL is read with each client connection, while OpenVPN is dropped to nobody
    	chown nobody:"$group_name" /etc/openvpn/server/crl.pem
    	# Without +x in the directory, OpenVPN can't run a stat() on the CRL file
    	chmod o+x /etc/openvpn/server/
    	# Generate key for tls-crypt
    	openvpn --genkey --secret /etc/openvpn/server/tc.key
    	# Create the DH parameters file using the predefined ffdhe2048 group
    	echo '-----BEGIN DH PARAMETERS-----
    MIIBCAKCAQEA//+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
    +8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
    87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
    YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
    7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
    ssbzSibBsu/6iGtCOGEoXJf//wIBAg==
    -----END DH PARAMETERS-----' > /etc/openvpn/server/dh.pem
    	# Generate server.conf
    	echo "local $ip
    port $port
    proto $protocol
    dev tun
    ca ca.crt
    cert server.crt
    key server.key
    dh dh.pem
    auth SHA512
    tls-crypt tc.key
    topology subnet
    server 10.8.0.0 255.255.255.0" > /etc/openvpn/server/server.conf
    	# IPv6
    	if [[ -z "$ip6" ]]; then
    		echo 'push "redirect-gateway def1 bypass-dhcp"' >> /etc/openvpn/server/server.conf
    	else
    		echo 'server-ipv6 fddd:1194:1194:1194::/64' >> /etc/openvpn/server/server.conf
    		echo 'push "redirect-gateway def1 ipv6 bypass-dhcp"' >> /etc/openvpn/server/server.conf
    	fi
    	echo 'ifconfig-pool-persist ipp.txt' >> /etc/openvpn/server/server.conf
    	# DNS
    	case "$dns" in
    		1|"")
    			# Locate the proper resolv.conf
    			# Needed for systems running systemd-resolved
    			if grep '^nameserver' "/etc/resolv.conf" | grep -qv '127.0.0.53' ; then
    				resolv_conf="/etc/resolv.conf"
    			else
    				resolv_conf="/run/systemd/resolve/resolv.conf"
    			fi
    			# Obtain the resolvers from resolv.conf and use them for OpenVPN
    			grep -v '^#\|^;' "$resolv_conf" | grep '^nameserver' | grep -v '127.0.0.53' | grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' | while read line; do
    				echo "push \"dhcp-option DNS $line\"" >> /etc/openvpn/server/server.conf
    			done
    		;;
    		2)
    			echo 'push "dhcp-option DNS 8.8.8.8"' >> /etc/openvpn/server/server.conf
    			echo 'push "dhcp-option DNS 8.8.4.4"' >> /etc/openvpn/server/server.conf
    		;;
    		3)
    			echo 'push "dhcp-option DNS 1.1.1.1"' >> /etc/openvpn/server/server.conf
    			echo 'push "dhcp-option DNS 1.0.0.1"' >> /etc/openvpn/server/server.conf
    		;;
    		4)
    			echo 'push "dhcp-option DNS 208.67.222.222"' >> /etc/openvpn/server/server.conf
    			echo 'push "dhcp-option DNS 208.67.220.220"' >> /etc/openvpn/server/server.conf
    		;;
    		5)
    			echo 'push "dhcp-option DNS 9.9.9.9"' >> /etc/openvpn/server/server.conf
    			echo 'push "dhcp-option DNS 149.112.112.112"' >> /etc/openvpn/server/server.conf
    		;;
    		6)
    			echo 'push "dhcp-option DNS 94.140.14.14"' >> /etc/openvpn/server/server.conf
    			echo 'push "dhcp-option DNS 94.140.15.15"' >> /etc/openvpn/server/server.conf
    		;;
    	esac
    	echo 'push "block-outside-dns"' >> /etc/openvpn/server/server.conf
    	echo "keepalive 10 120
    user nobody
    group $group_name
    persist-key
    persist-tun
    verb 3
    crl-verify crl.pem" >> /etc/openvpn/server/server.conf
    	if [[ "$protocol" = "udp" ]]; then
    		echo "explicit-exit-notify" >> /etc/openvpn/server/server.conf
    	fi
    	# Enable net.ipv4.ip_forward for the system
    	echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-openvpn-forward.conf
    	# Enable without waiting for a reboot or service restart
    	echo 1 > /proc/sys/net/ipv4/ip_forward
    	if [[ -n "$ip6" ]]; then
    		# Enable net.ipv6.conf.all.forwarding for the system
    		echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.d/99-openvpn-forward.conf
    		# Enable without waiting for a reboot or service restart
    		echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
    	fi
    	if systemctl is-active --quiet firewalld.service; 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 --add-port="$port"/"$protocol"
    		firewall-cmd --zone=trusted --add-source=10.8.0.0/24
    		firewall-cmd --permanent --add-port="$port"/"$protocol"
    		firewall-cmd --permanent --zone=trusted --add-source=10.8.0.0/24
    		# Set NAT for the VPN subnet
    		firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to "$ip"
    		firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to "$ip"
    		if [[ -n "$ip6" ]]; then
    			firewall-cmd --zone=trusted --add-source=fddd:1194:1194:1194::/64
    			firewall-cmd --permanent --zone=trusted --add-source=fddd:1194:1194:1194::/64
    			firewall-cmd --direct --add-rule ipv6 nat POSTROUTING 0 -s fddd:1194:1194:1194::/64 ! -d fddd:1194:1194:1194::/64 -j SNAT --to "$ip6"
    			firewall-cmd --permanent --direct --add-rule ipv6 nat POSTROUTING 0 -s fddd:1194:1194:1194::/64 ! -d fddd:1194:1194:1194::/64 -j SNAT --to "$ip6"
    		fi
    	else
    		# Create a service to set up persistent iptables rules
    		iptables_path=$(command -v iptables)
    		ip6tables_path=$(command -v ip6tables)
    		# nf_tables is not available as standard in OVZ kernels. So use iptables-legacy
    		# if we are in OVZ, with a nf_tables backend and iptables-legacy is available.
    		if [[ $(systemd-detect-virt) == "openvz" ]] && readlink -f "$(command -v iptables)" | grep -q "nft" && hash iptables-legacy 2>/dev/null; then
    			iptables_path=$(command -v iptables-legacy)
    			ip6tables_path=$(command -v ip6tables-legacy)
    		fi
    		echo "[Unit]
    Before=network.target
    [Service]
    Type=oneshot
    ExecStart=$iptables_path -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $ip
    ExecStart=$iptables_path -I INPUT -p $protocol --dport $port -j ACCEPT
    ExecStart=$iptables_path -I FORWARD -s 10.8.0.0/24 -j ACCEPT
    ExecStart=$iptables_path -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    ExecStop=$iptables_path -t nat -D POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $ip
    ExecStop=$iptables_path -D INPUT -p $protocol --dport $port -j ACCEPT
    ExecStop=$iptables_path -D FORWARD -s 10.8.0.0/24 -j ACCEPT
    ExecStop=$iptables_path -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT" > /etc/systemd/system/openvpn-iptables.service
    		if [[ -n "$ip6" ]]; then
    			echo "ExecStart=$ip6tables_path -t nat -A POSTROUTING -s fddd:1194:1194:1194::/64 ! -d fddd:1194:1194:1194::/64 -j SNAT --to $ip6
    ExecStart=$ip6tables_path -I FORWARD -s fddd:1194:1194:1194::/64 -j ACCEPT
    ExecStart=$ip6tables_path -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    ExecStop=$ip6tables_path -t nat -D POSTROUTING -s fddd:1194:1194:1194::/64 ! -d fddd:1194:1194:1194::/64 -j SNAT --to $ip6
    ExecStop=$ip6tables_path -D FORWARD -s fddd:1194:1194:1194::/64 -j ACCEPT
    ExecStop=$ip6tables_path -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT" >> /etc/systemd/system/openvpn-iptables.service
    		fi
    		echo "RemainAfterExit=yes
    [Install]
    WantedBy=multi-user.target" >> /etc/systemd/system/openvpn-iptables.service
    		systemctl enable --now openvpn-iptables.service
    	fi
    	# If SELinux is enabled and a custom port was selected, we need this
    	if sestatus 2>/dev/null | grep "Current mode" | grep -q "enforcing" && [[ "$port" != 1194 ]]; then
    		# Install semanage if not already present
    		if ! hash semanage 2>/dev/null; then
    			if [[ "$os_version" -eq 7 ]]; then
    				# Centos 7
    				yum install -y policycoreutils-python
    			else
    				# CentOS 8 or Fedora
    				dnf install -y policycoreutils-python-utils
    			fi
    		fi
    		semanage port -a -t openvpn_port_t -p "$protocol" "$port"
    	fi
    	# If the server is behind NAT, use the correct IP address
    	[[ -n "$public_ip" ]] && ip="$public_ip"
    	# client-common.txt is created so we have a template to add further users later
    	echo "client
    dev tun
    proto $protocol
    remote $ip $port
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    remote-cert-tls server
    auth SHA512
    ignore-unknown-option block-outside-dns
    verb 3" > /etc/openvpn/server/client-common.txt
    	# Enable and start the OpenVPN service
    	systemctl enable --now openvpn-server@server.service
    	# Generates the custom client.ovpn
    	new_client
    	echo
    	echo "Finished!"
    	echo
    	echo "The client configuration is available in:" ~/"$client.ovpn"
    	echo "New clients can be added by running this script again."
    else
    	clear
    	echo "OpenVPN is already installed."
    	echo
    	echo "Select an option:"
    	echo "   1) Add a new client"
    	echo "   2) Revoke an existing client"
    	echo "   3) Remove OpenVPN"
    	echo "   4) Exit"
    	read -p "Option: " option
    	until [[ "$option" =~ ^[1-4]$ ]]; do
    		echo "$option: invalid selection."
    		read -p "Option: " option
    	done
    	case "$option" in
    		1)
    			echo
    			echo "Provide a name for the client:"
    			read -p "Name: " unsanitized_client
    			client=$(sed 's/[^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-]/_/g' <<< "$unsanitized_client")
    			while [[ -z "$client" || -e /etc/openvpn/server/easy-rsa/pki/issued/"$client".crt ]]; do
    				echo "$client: invalid name."
    				read -p "Name: " unsanitized_client
    				client=$(sed 's/[^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-]/_/g' <<< "$unsanitized_client")
    			done
    			cd /etc/openvpn/server/easy-rsa/
    			./easyrsa --batch --days=3650 build-client-full "$client" nopass
    			# Generates the custom client.ovpn
    			new_client
    			echo
    			echo "$client added. Configuration available in:" ~/"$client.ovpn"
    			exit
    		;;
    		2)
    			# This option could be documented a bit better and maybe even be simplified
    			# ...but what can I say, I want some sleep too
    			number_of_clients=$(tail -n +2 /etc/openvpn/server/easy-rsa/pki/index.txt | grep -c "^V")
    			if [[ "$number_of_clients" = 0 ]]; then
    				echo
    				echo "There are no existing clients!"
    				exit
    			fi
    			echo
    			echo "Select the client to revoke:"
    			tail -n +2 /etc/openvpn/server/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') '
    			read -p "Client: " client_number
    			until [[ "$client_number" =~ ^[0-9]+$ && "$client_number" -le "$number_of_clients" ]]; do
    				echo "$client_number: invalid selection."
    				read -p "Client: " client_number
    			done
    			client=$(tail -n +2 /etc/openvpn/server/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | sed -n "$client_number"p)
    			echo
    			read -p "Confirm $client revocation? [y/N]: " revoke
    			until [[ "$revoke" =~ ^[yYnN]*$ ]]; do
    				echo "$revoke: invalid selection."
    				read -p "Confirm $client revocation? [y/N]: " revoke
    			done
    			if [[ "$revoke" =~ ^[yY]$ ]]; then
    				cd /etc/openvpn/server/easy-rsa/
    				./easyrsa --batch revoke "$client"
    				./easyrsa --batch --days=3650 gen-crl
    				rm -f /etc/openvpn/server/crl.pem
    				cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
    				# CRL is read with each client connection, when OpenVPN is dropped to nobody
    				chown nobody:"$group_name" /etc/openvpn/server/crl.pem
    				echo
    				echo "$client revoked!"
    			else
    				echo
    				echo "$client revocation aborted!"
    			fi
    			exit
    		;;
    		3)
    			echo
    			read -p "Confirm OpenVPN removal? [y/N]: " remove
    			until [[ "$remove" =~ ^[yYnN]*$ ]]; do
    				echo "$remove: invalid selection."
    				read -p "Confirm OpenVPN removal? [y/N]: " remove
    			done
    			if [[ "$remove" =~ ^[yY]$ ]]; then
    				port=$(grep '^port ' /etc/openvpn/server/server.conf | cut -d " " -f 2)
    				protocol=$(grep '^proto ' /etc/openvpn/server/server.conf | cut -d " " -f 2)
    				if systemctl is-active --quiet firewalld.service; then
    					ip=$(firewall-cmd --direct --get-rules ipv4 nat POSTROUTING | grep '\-s 10.8.0.0/24 '"'"'!'"'"' -d 10.8.0.0/24' | grep -oE '[^ ]+$')
    					# Using both permanent and not permanent rules to avoid a firewalld reload.
    					firewall-cmd --remove-port="$port"/"$protocol"
    					firewall-cmd --zone=trusted --remove-source=10.8.0.0/24
    					firewall-cmd --permanent --remove-port="$port"/"$protocol"
    					firewall-cmd --permanent --zone=trusted --remove-source=10.8.0.0/24
    					firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to "$ip"
    					firewall-cmd --permanent --direct --remove-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to "$ip"
    					if grep -qs "server-ipv6" /etc/openvpn/server/server.conf; then
    						ip6=$(firewall-cmd --direct --get-rules ipv6 nat POSTROUTING | grep '\-s fddd:1194:1194:1194::/64 '"'"'!'"'"' -d fddd:1194:1194:1194::/64' | grep -oE '[^ ]+$')
    						firewall-cmd --zone=trusted --remove-source=fddd:1194:1194:1194::/64
    						firewall-cmd --permanent --zone=trusted --remove-source=fddd:1194:1194:1194::/64
    						firewall-cmd --direct --remove-rule ipv6 nat POSTROUTING 0 -s fddd:1194:1194:1194::/64 ! -d fddd:1194:1194:1194::/64 -j SNAT --to "$ip6"
    						firewall-cmd --permanent --direct --remove-rule ipv6 nat POSTROUTING 0 -s fddd:1194:1194:1194::/64 ! -d fddd:1194:1194:1194::/64 -j SNAT --to "$ip6"
    					fi
    				else
    					systemctl disable --now openvpn-iptables.service
    					rm -f /etc/systemd/system/openvpn-iptables.service
    				fi
    				if sestatus 2>/dev/null | grep "Current mode" | grep -q "enforcing" && [[ "$port" != 1194 ]]; then
    					semanage port -d -t openvpn_port_t -p "$protocol" "$port"
    				fi
    				systemctl disable --now openvpn-server@server.service
    				rm -f /etc/systemd/system/openvpn-server@server.service.d/disable-limitnproc.conf
    				rm -f /etc/sysctl.d/99-openvpn-forward.conf
    				if [[ "$os" = "debian" || "$os" = "ubuntu" ]]; then
    					rm -rf /etc/openvpn/server
    					apt-get remove --purge -y openvpn
    				else
    					# Else, OS must be CentOS or Fedora
    					yum remove -y openvpn
    					rm -rf /etc/openvpn/server
    				fi
    				echo
    				echo "OpenVPN removed!"
    			else
    				echo
    				echo "OpenVPN removal aborted!"
    			fi
    			exit
    		;;
    		4)
    			exit
    		;;
    	esac
    fi
    
    • 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
  • 相关阅读:
    【业务功能篇112】Springboot + Spring Security 权限管理-登录模块开发实战
    详解AUTOSAR:什么是AUTOSAR?
    Springboot 集成 nacos (小白已测)
    KITTI 数据集简介
    我又学会了使用Range实现网络文件下载的断点续传
    弹性响应蒸馏 | 用弹性响应蒸馏克服增量目标检测中的灾难性遗忘
    格式转换 ▏Python 实现Word转HTML
    appium+python自动化测试
    【案例回顾】春节一次较波折的MySQL调优
    谨以此篇纪念我的csdn创作两周年
  • 原文地址:https://blog.csdn.net/m0_48096446/article/details/134338464