نصب و راه اندازی Openvpn

OpenVPN یک پروژه متن باز است که توسط جیمز یونان ساخته شده و در سال ۲۰۰۲ منتشر شد. OpenVPN با استفاده از پروتکل های امنیتی سفارشی، امنیت بالایی را با استفاده از اتصالات نقطه به نقطه یا سایت به سایت ارائه می دهد. ما را همراهی کنید تا به شما نحوه نصب OpenVPN در اوبونتو یا دبیان با پشتیبانی IPv6 را آموزش دهیم.

آدرس IPv4:

ip addr show dev eth0 | grep "inet" | awk '{ print $2 }' 

خروجی باید شبیه به این باشد:

root@ubuntu-2gb-nbg1-1:~# ip addr show dev eth0 | grep "inet" | awk '{ print $2 }' 
116.203.180.222/34

IPv4 ما 116.203.180.222 است و دارای / ۳۲ subnet mask است.

آدرس IPv6:

#IPv6
ip addr show dev eth0 | grep "inet6 " | awk '{ print $2 }' 

خروجی باید شبیه به این باشد:

root@ubuntu-2gb-nbg1-1:~# ip addr show dev eth0 | grep "inet6" | awk '{ print $2 }' 
2a01:4f8:c2c:5fc7::1/64
fe80::9400:ff:fe27:10db/64

مرحله ۱ – نصب و پیکربندی:

مرحله ۱.۱ نصب:

نصب بسته های گواهی OpenVPN ،IPTables ،OpenSSL و ca-گواهینامه ها.

apt-get install openvpn iptables openssl ca-certificates -y

پس از اتمام نصب، ما نیاز به بارگیری easy-rsa داریم.

wget -O ~/easyrsa.tgz https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz 2>/dev/null || curl -Lo ~/easyrsa.tgz https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar xzf ~/easyrsa.tgz -C ~/
mv ~/EasyRSA-v3.0.6/ /etc/openvpn/
mv /etc/openvpn/EasyRSA-v3.0.6/ /etc/openvpn/easy-rsa/
rm -f ~/easyrsa.tgz

بعد از بارگیری easy-rsa، باید PKI ایجاد کنیم و گواهی های CA و سرور / مشتری را تنظیم کنیم.

توجه: گواهینامه ها در مدت ۳۶۵۰ روز (۱۰ سال) منقضی می شوند، می توانید ارزش را تغییر دهید.

توجه: می توانید نام گواهی مشتری (CLIENT) را تغییر دهید، اما از کاراکترهای ویژه استفاده نکنید.

cd /etc/openvpn/easy-rsa/
./easyrsa init-pki
./easyrsa --batch build-ca nopass

EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-server-full server nopass
EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full CLIENT nopass
EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl

اکنون گواهینامه ها را در پوشه OpenVPN جابجا می کنیم و مجوزهای گروه و مالک آنها را تغییر می دهیم.

cp pki/ca.crt pki/private/ca.key pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn
chown nobody:nogroup /etc/openvpn/crl.pem

بعد از انتقال گواهینامه ها، می خواهیم کلید تأیید اعتبار را با استفاده از (tls (tls-auth تولید کنیم، پس از آن باید پارامترهای DH را ایجاد کنیم و از گروه از پیش تعریف شده ffdhe2048 استفاده خواهیم کرد.

openvpn --genkey --secret /etc/openvpn/ta.key

گروه های تعریف شده DHE توسط Task Force مهندسی اینترنت (IETF) در RFC 7919 توصیه می شود. این گروه ها قرار است در مقابل حملات نسبت به گروه هایی که به طور تصادفی تولید می شوند، مقاوم تر باشند.

echo '-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
+۸yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
۸۷VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
۷MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==
-----END DH PARAMETERS-----' > /etc/openvpn/dh.pem
مرحله ۱.۲ پیکربندی:

اکنون زمان آن رسیده است که پیکربندی سرور OpenVPN را ایجاد کنیم.

تنظیماتی که ممکن است تغییر دهید:

پورت: ۱۱۹۴ (پیش فرض) یا ۴۴۳

proto: udp (پیش فرض) یا tcp

توجه: بهتر است پورت را تغییر دهید زیرا می توان پورت OpenVPN 1194 را مسدود کرد.

علاوه بر این، پورت ۴۴۳ برای جلوگیری از سانسور ایده آل است زیرا ترافیک OpenVPN با ترافیک منظم SSL یکسان است.

توجه: پروتکل UDP عملکرد بهتری نسبت به پروتکل TCP دارد، اما چندان قابل اعتماد نیست.

nano /etc/openvpn/server.conf

port 1194
proto udp
dev tun
sndbuf 0
rcvbuf 0

ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
auth SHA512
tls-auth /etc/openvpn/ta.key 0

topology subnet

server 10.8.0.0 255.255.255.0
local 116.203.180.222                                       #Here you should add the server ipv4 address
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"

server-ipv6 2a01:4f8:c2c:5fc7:80::/112                      #Here you should add the server ipv6 address
tun-ipv6
push tun-ipv6
ifconfig-ipv6 2a01:4f8:c2c:5fc7::1 2a01:4f8:c2c:5fc7::2     #Here you should add the server ipv6 address
push "route-ipv6 2a01:4f8:c2c:5fc7:2::/64"                  #Here you should add the server ipv6 address
push "route-ipv6 2000::/3"

اکنون قسمت DNS است، شما باید چند گزینه را انتخاب کنید:

از سیستم پیش فرض DNS استفاده کنید

Cloudflare DNS

Google DNS

Quad9 DNS

سیستم DNS:
grep -v '#' /run/systemd/resolve/resolv.conf | grep 'nameserver' | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

خروجی باید شبیه به این باشد

5.200.200.200
217.218.127.127

Cloudflare DNS:

IPV4:
    Primary     DNS: 1.1.1.1
    Alternative DNS: 1.0.0.1
IPV6
    Primary     DNS: 2606:4700:4700::1111
    Alternative DNS: 2606:4700:4700::1001

Google DNS:

IPV4:
    Primary     DNS: 8.8.8.8
    Alternative DNS: 8.8.4.4
IPV6
    Primary     DNS: 2001:4860:4860::8888
    Alternative DNS: 2001:4860:4860::8844

Quad9 DNS:

IPV4:
    Primary     DNS: 9.9.9.9
    Alternative DNS: 149.112.112.112
IPV6
    Primary     DNS: 2620:fe::fe
    Alternative DNS: 2620:fe::9

بعد از انتخاب ارائه دهنده DNS، آنها را در انتهای پرونده اضافه کنید.

توجه: شما باید هر دو سرور DNS و (IPv4 و IPv6) را اضافه کنید، اولین سرور اصلی DNS و دوم سرور جایگزین DNS است.

nano /etc/openvpn/server.conf
push "dhcp-option DNS SELECTED-DNS-PROVIDER"
push "dhcp-option DNS SELECTED-DNS-PROVIDER"

پس از اتمام کار با قسمت DNS، زمان آن است که با بقیه پرونده پیکربندی ادامه دهیم.

بقیه پیکربندی را در انتهای پرونده اضافه کنید.

nano /etc/openvpn/server.conf
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
client-to-client
status /etc/openvpn/openvpn-status.log
verb 3
crl-verify /etc/openvpn/crl.pem

حال باید قوانین فایروال را اضافه کنیم. اگر از Firewalld استفاده می کنید کدهای زیر را اضافه کنید:

# We are not going to use --add-service=openvpn because that would only work with default port and protocol
firewall-cmd --zone=public --add-port=1194/udp
firewall-cmd --zone=trusted --add-source=10.8.0.0/24
firewall-cmd --permanent --zone=public --add-port=1194/udp
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 SERVER_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 SERVER_IP
firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD_direct 0 -i tun0 -o eth0 -j ACCEPT

اگر از iptables استفاده می کنید کدهای زیر را وارد کنید:

iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE
#Note: If you use tcp protocol you must change -p udp to -p tcp and --ddport 1194 to --ddport 443
iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

#Note: If you use tcp protocol you must change -p udp to -p tcp and --ddport 1194 to --ddport 443
ip6tables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
ip6tables -A INPUT -i tun0 -j ACCEPT
ip6tables -A FORWARD -i tun0 -o eth0 -s 2a01:4f8:c2c:5fc7:80::/112 -m state --state NEW -j ACCEPT

iptables را ذخیره کنید:

iptables-save > /etc/iptables.rules
ip6tables-save > /etc/ip6tables.rules

حال باید یک فایل پیکربندی client ایجاد کنیم.

nano  /etc/openvpn/client.txt

کل پیکربندی را اضافه کنید.

client
dev tun
proto udp
sndbuf 0
rcvbuf 0
tun-mtu 1500
mssfix 1420
remote 116.203.180.222 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
auth-nocache
cipher AES-256-CBC
setenv opt block-outside-dns
key-direction 1
verb 3

در پایان پیکربندی سرور OpenVPN باید شبیه به این باشد:

نمایش پرونده server.conf

port 1194
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
auth SHA512
tls-auth /etc/openvpn/ta.key 0

topology subnet

server 10.8.0.0 255.255.255.0
local 116.203.180.222               #Here you should add the server ipv4 address
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"

#ipv6 support
server-ipv6 2a01:4f8:c2c:5fc7:80::/112  #Here you should add the server ipv6 address
tun-ipv6
push tun-ipv6
ifconfig-ipv6 2a01:4f8:c2c:5fc7::1 2a01:4f8:c2c:5fc7::2 #Here you should add the server ipv6 address
push "route-ipv6 2a01:4f8:c2c:5fc7:2::/64"               #Here you should add the server ipv6 address
push "route-ipv6 2000::/3"
push "dhcp-option DNS 2606:4700:4700::1111"
push "dhcp-option DNS 2606:4700:4700::1001"


keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
client-to-client
status /etc/openvpn/openvpn-status.log
verb 3
crl-verify /etc/openvpn/crl.pem

مرحله ۱.۳ (اختیاری):

برخی از VPS ها packet forwarding IPv4 / IPv6 غیرفعال کرده اند. برای فعال کردن ارسال IPv4 باید /etc/sysctl.conf را ویرایش کنید:

nano /etc/sysctl.conf

خطوط زیر را جستجو کنید:

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1 
net.ipv4.ip_forward=1 

# Uncomment the next line to enable packet forwarding for IPv6
#net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1

سپس دستور زیر را اجرا کنید:

sysctl -p

مرحله ۲ – مشتری OpenVPN ایجاد کنید:

برای اینکه یک کاربر جدید اضافه کنیم ، قصد داریم یک اسکریپت جدید ایجاد کنیم. این اسکریپت ۲ گزینه دارد:

1- کاربر جدیدی اضافه کنید

2- کاربر موجود را حذف کنید

cd ~
nano openvpn-user-manager.sh

پیکربندی زیر را کپی و جایگذاری کنید:

#!/usr/bin/env bash

if readlink /proc/$$/exe | grep -q "dash"; then
	echo "This script needs to be run with bash, not sh."
	exit
fi

if [[ "$EUID" -ne 0 ]]; then
	echo "Sorry, you need to run this as root"
	exit
fi

newclient () {
	# Generates the custom client.ovpn
	cp /etc/openvpn/client.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
	sed -ne '/BEGIN CERTIFICATE/,$ p' /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
	sed -ne '/BEGIN OpenVPN Static key/,$ p' /etc/openvpn/ta.key >> ~/$1.ovpn
	echo "</tls-auth>" >> ~/$1.ovpn
}

if [[ -e /etc/openvpn/server.conf ]]; then
	while :
	do
	clear
		echo ""
		echo "What do you want to do?"
		echo "   1) Add a new user"
		echo "   2) Remove an existing user"
		echo "   3) Exit"
		read -p "Select an option [1-3]: " option
		case $option in
			۱) 
			echo
			echo "Please don't use special characters, only clear words."
			read -p "Client name: " -e CLIENT
			cd /etc/openvpn/easy-rsa/
			EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full $CLIENT nopass
			newclient "$CLIENT"
			echo
			echo "Client $CLIENT added, configuration is available at:" ~/"$CLIENT.ovpn"
			exit
			;;
			۲)
			NUMBEROFCLIENTS=$(tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep -c "^V")
			if [[ "$NUMBEROFCLIENTS" = '0' ]]; then
				echo
				echo "We were not able to find existing clients!"
				exit
			fi
			echo
			echo "Select the existing client certificate you want to revoke:"
			tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') '
			if [[ "$NUMBEROFCLIENTS" = '1' ]]; then
				read -p "Select one client [1]: " CLIENTNUMBER
			else
				read -p "Select one client [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)
			echo
			read -p "Do you actually desire to revoke the access of the client? $CLIENT? [y/N]: " -e REVOKE
			if [[ "$REVOKE" = 'y' || "$REVOKE" = 'Y' ]]; then
				cd /etc/openvpn/easy-rsa/
				./easyrsa --batch revoke $CLIENT
				EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
				rm -f pki/reqs/$CLIENT.req
				rm -f pki/private/$CLIENT.key
				rm -f pki/issued/$CLIENT.crt
				rm -f /etc/openvpn/crl.pem
				cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem
				chown nobody:nogroup /etc/openvpn/crl.pem
				echo
				echo "Certificate for the client $CLIENT is revoked!"
			else
				echo
				echo "Certificate revocation for client $CLIENT aborted!"
			fi
			exit
			;;
			۳)
			exit
			;;
        esac
	done
else
    clear
    echo "OpenVPN is not installed."
    echo "Install OpenVPN first"
    echo "https://community.hetzner.com/tutorials/install-and-configure-openvpn-on-ubuntu-and-debian"
fi

مجوز های مورد نیاز را وارد کنید:

chmod 755 ~/root/openvpn-user-manager.sh

توجه: اگر نمی توانید به سرور vpn وصل شوید، VPS را مجدداً راه اندازی کنید. اگر پس از راه اندازی مجدد مشکل وجود دارد، مرحله ۱.۳ را دنبال کنید.

مرحله ۳ – استفاده از مدیر کاربر (OpenVPN (openvpn-user-manager.sh:

اسکریپت را اجرا کنید:

bash openvpn-user-manager.sh

خروجی باید شبیه به این باشد:

OpenVPN is installed.

What do you want to do?
   ۱) Add a new user
   ۲) Remove an existing user
   ۳) Exit
Select an option [1-3]:

به همین راحتی می توانید OpenVPN را در اوبونتو یا دبیان نصب کنید.

امیدواریم از این مقاله بهره لازم را برده و برای شما مفید بوده باشد.