openvpn examples(5) فایل‌های پیکربندی openvpn examples(5)

openvpn examples - مثال‌هایی از راه‌اندازی و پیکربندی دیمن تونل امن IP

این صفحهٔ راهنما چند مثال ساده برای راه‌اندازی OpenVPN و ایجاد فایل‌های پیکربندی ارائه می‌دهد.

این بخش شامل دستورالعمل‌هایی برای ایجاد یک راه‌اندازی کوچک OpenVPN با استفاده از گزینهٔ peer-fingerprint است. مزیت این روش، راه‌اندازی آسان آن است و برای بیشتر محیط‌های آزمایشگاهی کوچک و مصارف خانگی بدون نیاز به زیرساخت کلید عمومی (PKI) مناسب می‌باشد. برای راه‌اندازی‌های در مقیاس بزرگ‌تر، همچنان راه‌اندازی یک PKI (برای مثال از طریق easy-rsa) توصیه می‌شود.

هر دو پیکربندی سرور و کلاینت را می‌توان برای سفارشی‌سازی بیشتر تغییر داد.

1.
نصب openvpn

کامپایل از کد منبع (فایل INSTALL را ببینید) یا نصب از طریق مدیر بسته‌های توزیع (apt/yum/pacman/ports) یا از طریق نصاب (ویندوز).

2.
تولید یک گواهی خودامضا (self-signed) برای سرور:
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:secp384r1 -keyout server.key -out server.crt -nodes -sha256 -days 3650 -subj '/CN=server'
3.
تولید اثر انگشت (fingerprint) SHA256 گواهی سرور

استفاده از ابزار خط فرمان OpenSSL برای مشاهدهٔ اثر انگشت گواهی ایجادشده:

openssl x509 -fingerprint -sha256 -in server.crt -noout

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

SHA256 Fingerprint=00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff
4.
نوشتن فایل پیکربندی سرور (server.conf):
# The server certificate we created in step 1
cert server.crt
key server.key
dh none
dev tun
# Listen on IPv6+IPv4 simultaneously
proto udp6
# The ip address the server will distribute
server 10.8.0.0 255.255.255.0
server-ipv6 fd00:6f76:706e::/64
# A tun-mtu of 1400 avoids problems of too big packets after VPN encapsulation
tun-mtu 1400
# The fingerprints of your clients. After adding/removing one here restart the
# server
<peer-fingerprint>
</peer-fingerprint>
# Notify clients when you restart the server to reconnect quickly
explicit-exit-notify 1
# Ping every 60s, restart if no data received for 5 minutes
keepalive 60 300
# Uncomment the line below if you want to have persistent IP addresses
# ifconfig-pool-persist  /etc/openvpn/server/ipp.txt
# Uncomment the line below to push a DNS server to clients
# push "dhcp-option DNS 1.1.1.1"
5.
افزودن حداقل یک کلاینت مطابق توضیحات بخش کلاینت.
6.
راه‌اندازی سرور.
•
در توزیع‌های مبتنی بر systemd، فایل‌های server.crt، server.key و server.conf را به /etc/openvpn/server منتقل کرده و آن را از طریق systemctl اجرا کنید:
sudo mv server.conf server.key server.crt /etc/openvpn/server
sudo systemctl start openvpn-server@server

1.
نصب OpenVPN
2.
تولید یک گواهی خودامضا برای کلاینت. در این مثال، نام کلاینت alice است. هر کلاینت باید نامی یکتا داشته باشد. alice را با نام متفاوتی برای هر کلاینت جایگزین کنید.
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:secp384r1 -keyout - -nodes -sha256 -days 3650 -subj '/CN=alice'

این دستور یک گواهی و کلید برای کلاینت تولید می‌کند. خروجی دستور چیزی شبیه به این خواهد بود:

-----BEGIN PRIVATE KEY-----
[base64 content]
-----END PRIVATE KEY-----
-----
-----BEGIN CERTIFICATE-----
[base 64 content]
-----END CERTIFICATE-----
3.
ایجاد یک فایل پیکربندی کلاینت جدید. در این مثال نام فایل را alice.ovpn می‌گذاریم:
# The name of your server to connect to
remote yourserver.example.net
client
# use a random source port instead the fixed 1194
nobind
# Uncomment the following line if you want to route
# all traffic via the VPN
# redirect-gateway def1 ipv6
# To set a DNS server
# dhcp-option DNS 192.168.234.1
<key>
-----BEGIN PRIVATE KEY-----
[Insert here the key created in step 2]
-----END PRIVATE KEY-----
</key>
<cert>
-----BEGIN CERTIFICATE-----
[Insert here the certificate created in step 2]
-----END CERTIFICATE-----
</cert>
# This is the fingerprint of the server that we trust. We generated this fingerprint
# in step 2 of the server setup
peer-fingerprint 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff
# The tun-mtu of the client should match the server MTU
tun-mtu 1400
dev tun
4.
تولید اثر انگشت گواهی کلاینت. برای این کار اجازه می‌دهیم OpenSSL فایل پیکربندی کلاینت را بخواند، زیرا دستور x509 هر چیزی را که بین نشانگرهای شروع و پایان گواهی نباشد نادیده می‌گیرد:
openssl x509 -fingerprint -sha256 -noout -in alice.ovpn

این دستور مجدداً خروجی شبیه به این تولید می‌کند:

SHA256 Fingerprint=ff:ee:dd:cc:bb:aa:99:88:77:66:55:44:33:22:11:00:ff:ee:dd:cc:bb:aa:99:88:77:66:55:44:33:22:11:00
5.
فایل پیکربندی server.conf را ویرایش کرده و اثر انگشت کلاینت جدید را به عنوان یک خط اضافی بین <peer-fingerprint> و </peer-fingerprint> اضافه کنید.

پس از افزودن دو کلاینت، این بخش از پیکربندی به این شکل خواهد بود:

<peer-fingerprint>
ff:ee:dd:cc:bb:aa:99:88:77:66:55:44:33:22:11:00:ff:ee:dd:cc:bb:aa:99:88:77:66:55:44:33:22:11:00
99:88:77:66:55:44:33:22:11:00:ff:ee:dd:cc:bb:aa:99:88:77:66:55:44:33:22:11:00:88:77:66:55:44:33
</peer-fingerprint>
6.
(اختیاری) اگر کلاینت نسخهٔ قدیمی‌تری است که از peer-fingerprint پشتیبانی نمی‌کند (مانند OpenVPN 2.5 و قدیمی‌تر، یا OpenVPN Connect 3.3 و قدیمی‌تر)، می‌توان پیکربندی کلاینت alice.ovpn را برای کار با این کلاینت‌ها تغییر داد.

خطی که با peer-fingerprint شروع می‌شود را حذف کنید. سپس یک بخش جدید <ca> در انتهای فایل پیکربندی با محتوای server.crt که در مرحلهٔ ۲ راه‌اندازی سرور ایجاد شد، اضافه نمایید. انتهای فایل alice.ovpn باید به این صورت باشد:

[...]  # Beginning of the file skipped
</cert>
# The tun-mtu of the client should match the server MTU
tun-mtu 1400
dev tun
<ca>
[contents of the server.crt]
</ca>

توجه داشته باشید که ما بخش <ca> را پس از بخش <cert> قرار می‌دهیم تا تولید اثر انگشت مرحلهٔ ۴ همچنان کار کند، زیرا تنها از اولین گواهی‌ای که پیدا می‌کند استفاده خواهد کرد.

7.
فایل را در کلاینت OpenVPN وارد (Import) کنید یا فقط از دستور openvpn alice.ovpn برای راه‌اندازی VPN استفاده نمایید.

پیش از اجرای این مثال‌ها، باید OpenVPN روی دو رایانه که دارای ارتباط شبکه‌ای با یکدیگر هستند، نصب شده باشد. اگر هنوز OpenVPN را نصب نکرده‌اید، فایل INSTALL موجود در توزیع OpenVPN را مطالعه کنید.

اگر دیوارهای آتش بین دو رایانه وجود دارند، باید به گونه‌ای تنظیم شوند که پورتی که OpenVPN برای استفاده از آن پیکربندی شده است را در هر دو جهت عبور دهند. پورت پیش‌فرض برای OpenVPN مقدار 1194/udp است. اگر کنترلی روی دیوارهای آتش بین دو رایانه ندارید، ممکن است همچنان بتوانید با افزودن --ping 15 به هر یک از دستورات openvpn که در مثال‌های زیر به کار رفته‌اند از OpenVPN استفاده کنید (این کار باعث می‌شود هر همتا هر ۱۵ ثانیه یک پینگ UDP به همتای دوردست خود بفرستد، که موجب می‌شود بسیاری از دیوارهای آتشِ مبتنی بر وضعیت (stateful) بسته‌ها را در هر دو جهت بدون نیاز به یک قانون صریح عبور دهند).

لطفاً برای چگونگی پیکربندی دیوار آتش در سیستم خود، راهنماهای سیستم‌عاملتان را مطالعه کنید.

به منظور این مثال‌ها، دو دستگاه ما bob.example.com و alice.example.com نامیده می‌شوند. اگر در حال ساخت یک VPN بر بستر اینترنت هستید، bob.example.com و alice.example.com را با نام میزبان اینترنتی یا آدرس IP که هر رایانه برای ارتباط با دیگری در اینترنت استفاده می‌کند، جایگزین کنید.

اکنون نقاط انتهایی تونل (endpoints) را انتخاب می‌کنیم. نقاط انتهایی تونل، آدرس‌های IP خصوصی هستند که فقط در بستر VPN معنا دارند. هر رایانه از نقطه پایانی تونل رایانهٔ دیگر برای دسترسی به آن از طریق VPN استفاده می‌کند. در مثال ما، نقطه پایانی تونل برای bob.example.com برابر با 10.4.0.1 و برای alice.example.com برابر با 10.4.0.2 خواهد بود.

پس از برقراری VPN، شما اساساً یک مسیر جایگزینِ امن بین دو میزبان ایجاد کرده‌اید که با استفاده از آدرس‌های پایانی تونل قابل دسترس است. شما می‌توانید با انتخاب استفاده از (الف) آدرس پایانی VPN یا (ب) آدرس اینترنتی عمومی برای دسترسی به میزبان دوردست، مشخص کنید که کدام ترافیک شبکه (الف) از طریق VPN یا (ب) مستقل از VPN بین میزبان‌ها تبادل شود. برای مثال، اگر در bob.example.com هستید و می‌خواهید از طریق ssh بدون استفاده از VPN به alice.example.com متصل شوید (زیرا ssh امنیت توکار خود را دارد)، از دستور ssh alice.example.com استفاده می‌کنید. با این حال در همان سناریو، می‌توانید از دستور telnet 10.4.0.2 برای ایجاد یک نشست telnet با alice.example.com از بستر VPN استفاده کنید که به جای ssh، از VPN برای ایمن‌سازی نشست استفاده می‌کند.

شما می‌توانید از هر آدرسی که تمایل دارید برای نقاط پایانی تونل استفاده کنید، اما مطمئن شوید که آن‌ها آدرس‌های خصوصی هستند (مانند آن‌هایی که با 10 یا 192.168 شروع می‌شوند) و متعلق به هیچ‌یک از زیرشبکه‌های موجود در شبکهٔ هیچ‌یک از دو طرف نیستند، مگر اینکه از پل‌زدن (bridging) استفاده کنید. اگر از آدرسی استفاده کنید که بخشی از زیرشبکهٔ محلی شما برای هر یک از نقاط پایانی تونل باشد، با یک حلقهٔ بازخورد (feedback loop) عجیب مواجه خواهید شد.

از آنجایی که tun نوع پیش‌فرض دستگاه است، گزینهٔ --dev اختیاری است؛ هنگامی که حذف شود، OpenVPN دستگاهی با نام پویا مانند tunX ایجاد می‌کند. در مثال‌های زیر، برای شفافیت بیشتر، نام دستگاه صراحتاً (--dev tun1) قید شده است.

در bob:

openvpn --remote alice.example.com --dev tun1 \
         --ifconfig 10.4.0.1 10.4.0.2 --verb 9

در alice:

openvpn --remote bob.example.com --dev tun1 \
         --ifconfig 10.4.0.2 10.4.0.1 --verb 9

اکنون با پینگ کردن از طریق تونل، کارکرد آن را بررسی کنید.

در bob:

ping 10.4.0.2

در alice:

ping 10.4.0.1

گزینهٔ --verb 9 خروجی مفصلی شبیه به برنامهٔ tcpdump(8) تولید می‌کند. برای اینکه OpenVPN با جزئیات کمتر و آرام اجرا شود، گزینهٔ --verb 9 را حذف کنید.

ابتدا یک گواهی خودامضا روی bob بسازید و اثر انگشت آن را نمایش دهید:

openssl req -x509 -newkey ec:<(openssl ecparam -name secp384r1) -keyout bob.pem -out bob.pem -nodes -sha256 -days 3650 -subj '/CN=bob'
openssl x509 -noout -sha256 -fingerprint -in bob.pem

و به همین ترتیب در alice:

openssl req -x509 -newkey ec:<(openssl ecparam -name secp384r1) -keyout alice.pem -out alice.pem -nodes -sha256 -days 3650 -subj '/CN=alice'
openssl x509 -noout -sha256 -fingerprint -in alice.pem

این دستورات یک فایل متنی به نام bob.pem یا alice.pem (در قالب ascii) ایجاد می‌کنند که شامل گواهی خودامضا و کلید است و اثر انگشت گواهی‌ها را نمایش می‌دهد. اثر انگشت‌ها را از طریق یک بستر امن مانند برنامه‌های scp(1) یا ssh(1) انتقال دهید.

در bob:

openvpn --ifconfig 10.4.0.1 10.4.0.2 --tls-server --dev tun --dh none \
        --cert bob.pem --key bob.pem --cipher AES-256-GCM \
        --peer-fingerprint "$fingerprint_of_alices_cert"

در alice:

openvpn --remote bob.example.com --tls-client --dev tun1   \
        --ifconfig 10.4.0.2 10.4.0.1 --cipher AES-256-GCM  \
        --cert alice.pem --key alice.pem                   \
        --peer-fingerprint "$fingerprint_of_bobs_cert"

اکنون با پینگ کردن از طریق تونل، کارکرد آن را بررسی کنید.

در bob:

ping 10.4.0.2

در alice:

ping 10.4.0.1

نکته: این مثال از یک منحنی بیضوی (secp384) استفاده می‌کند که اجازه می‌دهد --dh روی none تنظیم شود.

برای این آزمایش، ما bob را به عنوان کلاینت TLS و alice را به عنوان سرور TLS تعیین می‌کنیم.

نکته:
تعیین کلاینت یا سرور فقط برای زیرسیستم TLS معنا دارد و هیچ تأثیری بر مدل ارتباطی نظیربه‌نظیر (peer-to-peer) مبتنی بر UDP در OpenVPN ندارد.

ابتدا یک جفت گواهی/کلید مجزا برای هر دو میزبان bob و alice ایجاد کنید (برای اطلاعات بیشتر به توضیحات --cert مراجعه کنید). سپس پارامترهای دیفی-هلمن (Diffie Hellman) را بسازید (برای اطلاعات بیشتر به توضیحات --dh مراجعه کنید). همچنین می‌توانید از فایل‌های آزمایشی موجود شامل client.crt، client.key، server.crt، server.key و ca.crt استفاده کنید. فایل‌های .crt گواهی‌ها/کلیدهای عمومی، فایل‌های .key کلیدهای خصوصی، و ca.crt مرجع صدور گواهی است که هر دو فایل client.crt و server.crt را امضا کرده است. برای پارامترهای دیفی-هلمن می‌توانید از فایل موجود dh2048.pem استفاده کنید.

هشدار:
تمام گواهی‌ها و کلیدهای کلاینت، سرور و مرجع صدور گواهی موجود در توزیع OpenVPN کاملاً ناامن بوده و صرفاً باید برای مقاصد آزمایشی استفاده شوند.

در bob:

openvpn --remote alice.example.com --dev tun1    \
        --ifconfig 10.4.0.1 10.4.0.2             \
        --tls-client --ca ca.crt                 \
        --cert client.crt --key client.key       \
        --reneg-sec 60 --verb 5

در alice:

openvpn --remote bob.example.com --dev tun1      \
        --ifconfig 10.4.0.2 10.4.0.1             \
        --tls-server --dh dh1024.pem --ca ca.crt \
        --cert server.crt --key server.key       \
        --reneg-sec 60 --verb 5

اکنون با پینگ کردن از طریق تونل، کارکرد آن را بررسی کنید.

در bob:

ping 10.4.0.2

در alice:

ping 10.4.0.1

به گزینهٔ --reneg-sec 60 که در بالا استفاده کردیم توجه کنید. این گزینه به OpenVPN می‌گوید که کلیدهای کانال داده را در هر دقیقه دوباره مذاکره (renegotiate) کند. از آنجا که در بالا از --verb 5 استفاده کردیم، اطلاعات وضعیت را در هر مذاکرهٔ کلید جدید مشاهده خواهید کرد.

برای عملیات واقعی و محیط‌های تولید (production)، فاصلهٔ مذاکرهٔ مجدد کلید به مدت ۶۰ ثانیه احتمالاً بیش از حد مکرر است. برای استفاده از مقدار پیش‌فرض OpenVPN یعنی بازهٔ یک ساعته، گزینهٔ --reneg-sec 60 را حذف کنید.

با فرض اینکه بتوانید از طریق تونل پینگ بگیرید، گام بعدی مسیریابی یک زیرشبکهٔ واقعی از روی تونل امن است. فرض کنید bob و alice هر کدام دو رابط شبکه دارند؛ یکی متصل به اینترنت و دیگری متصل به یک شبکهٔ خصوصی. هدف ما اتصال امن این دو شبکهٔ خصوصی به یکدیگر است. فرض می‌کنیم زیرشبکهٔ خصوصی bob برابر با 10.0.0.0/24 و برای alice برابر با 10.0.1.0/24 باشد.

ابتدا مطمئن شوید فورواردینگ IP (IP forwarding) روی هر دو همتا فعال است. در لینوکس، مسیریابی را فعال کنید:

echo 1 > /proc/sys/net/ipv4/ip_forward

این تنظیم پایدار (persistent) نیست. لطفاً مستندات سیستم‌عامل خود را برای چگونگی پیکربندی مناسب فورواردینگ IP که پس از راه‌اندازی مجدد سیستم نیز پایدار بماند، مطالعه کنید.

اگر سیستم شما با دیوار آتش پیکربندی شده است، لطفاً راهنمای سیستم‌عامل خود را دربارهٔ چگونگی پیکربندی دیوار آتش مطالعه کنید. معمولاً می‌بایست اجازهٔ عبور ترافیک ورودی و خروجی از آداپتور tun/tap را که OpenVPN برای استفاده از آن پیکربندی شده است، بدهید.

در bob:

route add -net 10.0.1.0 netmask 255.255.255.0 gw 10.4.0.2

در alice:

route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.4.0.1

اکنون هر رایانه‌ای در زیرشبکهٔ 10.0.0.0/24 می‌تواند به هر رایانه‌ای در زیرشبکهٔ 10.0.1.0/24 از طریق تونل امن دسترسی داشته باشد (و برعکس).

در یک محیط عملیاتی، می‌توانید دستور(های) route را در یک اسکریپت قرار داده و آن را با گزینهٔ --up اجرا کنید.