این آموزش گام به گام نحوه نصب و راه‌اندازی یک سرور OpenVPN امن روی سیستم‌عامل Ubuntu یا Debian را شرح می‌دهد.

نصب OpenVPN در اوبونتو

قبل از شروع، باید موارد زیر را آماده داشته باشید:

  • سرور لینوکس (اوبونتو یا دبیان).
  • دسترسی ریشه (Root Access) به سرور.
  • آدرس IP سرور – آدرس‌های IPv4 و IPv6 خود را پیدا کنید.

برای مشاهده آدرس IP سیستم، می‌توانید از دستور زیر استفاده کنید:

ip addr show dev eth0

توجه: در دستور بالا، eth0 نام واسط شبکه (Interface) است که ممکن است در سیستم لینوکس شما متفاوت باشد.

راه‌اندازی و پیکربندی سرور OpenVPN

ابتدا، بسته‌های اصلی OpenVPN، IPTables، OpenSSL و CA Certificates را نصب می‌کنیم:

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

دانلود و راه‌اندازی Easy-RSA

پس از نصب، نیاز است تا ابزار Easy-RSA را دانلود کنید. این ابزار برای مدیریت زیرساخت کلید عمومی (PKI) استفاده می‌شود:

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

ایجاد PKI و گواهینامه‌ها

پس از دانلود 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 را تولید کرده و سپس پارامترهای DH (Diffie-Hellman) را با استفاده از گروه از پیش تعریف شده ffdhe2048 ایجاد کنید:

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

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

echo '-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
YdEIqUuyyOP7uWratcDX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==
-----END DH PARAMETERS-----' > /etc/openvpn/dh.pem

ایجاد فایل پیکربندی سرور

وقت آن است که فایل پیکربندی اصلی سرور OpenVPN را بسازید.

تنظیمات اولیه سرور

فایل پیکربندی را با ویرایشگر nano باز کنید:

nano /etc/openvpn/server.conf

تنظیمات زیر را به فایل اضافه کنید. ممکن است بخواهید پورت (port) یا پروتکل (proto) را تغییر دهید:

  • port: پیش‌فرض 1194 است. پورت 443 برای جلوگیری از سانسور ایده‌آل است.
  • proto: پیش‌فرض udp است. پروتکل UDP عملکرد بهتری دارد، اما TCP قابل اعتمادتر است.
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                                       # آدرس IPv4 سرور خود را اینجا قرار دهید
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"

server-ipv6 2a01:4f8:c2c:5fc7:80::/112                      # آدرس IPv6 سرور خود را اینجا قرار دهید
tun-ipv6
push tun-ipv6
ifconfig-ipv6 2a01:4f8:c2c:5fc7::1 2a01:4f8:c2c:5fc7::2     # آدرس IPv6 سرور خود را اینجا قرار دهید
push "route-ipv6 2a01:4f8:c2c:5fc7:2::/64"                  # آدرس IPv6 سرور خود را اینجا قرار دهید
push "route-ipv6 2000::/3"

پیکربندی DNS

باید یک ارائه دهنده DNS انتخاب کنید و آن را به انتهای فایل server.conf اضافه کنید.

گزینه‌های DNS:

ارائه دهنده IPv4 اصلی IPv4 جایگزین IPv6 اصلی IPv6 جایگزین
Cloudflare 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001
Google 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844
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}’` استفاده کنید)

فایل را باز کرده و خطوط زیر را (با جایگزینی آدرس‌های DNS انتخابی) به انتهای آن اضافه کنید:

nano /etc/openvpn/server.conf

 

push "dhcp-option DNS SELECTED-DNS-PROVIDER"
push "dhcp-option DNS SELECTED-DNS-PROVIDER"
# برای IPv6 هم تکرار شود
push "dhcp-option DNS SELECTED-IPV6-DNS-PROVIDER"
push "dhcp-option DNS SELECTED-IPV6-DNS-PROVIDER"

ادامه پیکربندی سرور

تنظیمات نهایی را به انتهای فایل server.conf اضافه کنید:

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

افزودن قوانین فایروال (Firewall Rules)

برای عبور ترافیک VPN، باید قوانین فایروال را اعمال کنید.

استفاده از IPTables

اگر از IPTables استفاده می‌کنید، دستورات زیر را وارد کنید:

iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE
# توجه: اگر از پروتکل tcp استفاده می‌کنید، -p udp را به -p tcp و --dport 1194 را به --dport 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
# توجه: اگر از پروتکل tcp استفاده می‌کنید، -p udp را به -p tcp و --dport 1194 را به --dport 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

استفاده از Firewalld 

اگر از Firewalld استفاده می‌کنید:

# ما از --add-service=openvpn استفاده نمی‌کنیم چون فقط با پورت و پروتکل پیش‌فرض کار می‌کند
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
# تنظیم NAT برای ساب‌نت VPN (SERVER_IP را با آدرس IP سرور خود جایگزین کنید)
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

فعال‌سازی Packet Forwarding

بسیاری از سرویس‌های VPS، انتقال بسته (Packet Forwarding) را غیرفعال دارند. برای فعال‌سازی، فایل /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

ایجاد فایل پیکربندی کلاینت (Client Configuration)

برای اتصال کلاینت‌ها، نیاز به یک فایل پیکربندی پایه دارید.

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

نکته: آدرس IP و پورت در خط remote را با مشخصات سرور خود جایگزین کنید.

اسکریپت مدیریت کاربران OpenVPN

برای اضافه یا حذف آسان کاربران، یک اسکریپت مدیریتی ایجاد می‌کنیم:

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
1) 
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
;;
2)
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
;;
3)
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 openvpn-user-manager.sh

استفاده از اسکریپت مدیریت کاربران

bash openvpn-user-manager.sh

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

OpenVPN is installed.

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

با انتخاب گزینه ۱ و وارد کردن نام دلخواه، فایل پیکربندی کامل کلاینت (CLIENT.ovpn) شامل تمامی گواهینامه‌های لازم در پوشه خانگی شما ایجاد خواهد شد که می‌توانید آن را به کاربر ارسال کنید.

توجه نهایی: اگر پس از اتمام مراحل نمی‌توانید به سرور VPN متصل شوید، VPS خود را راه‌اندازی مجدد (Restart) کنید.