اتصال به یک سرور توسط PPTP و مدیریت ترافیک آن

برای نرم‌افزار یکی از مشتریان ما (به نام «کرمان جنوب») مشکلی پیش آمد و من باید برای حل آن اقدام می‌کردم.ولی دو مشکل وجود داشت:

  • من الان در وضعیت دورکاری هستم.
  • برای اتصال به سرور آنها باید حتما از IP شرکت متصل شوم.

برای رفع این مشکل یک راه حل وجود داشت: کافی بود من به سرور داخل شرکت وصل بشوم و از آنجا یک Connection به سرور مشتری بزنم.یعنی چیزی شبیه این:

اطلاعات سرور شرکت و سرور مشتری

سرور شرکت دارای سیستم عامل Debian 10 می‌باشد.قبلا در آن OpenVPN نصب کرده بودم و می‌توانستم به آن متصل شود و IPای از بازه‌ی 192.168.10.0/24 دریافت کنم.همچنین سرور دارای یک کارت شبکه به نام enp63s0 است که IP آن 192.168.1.150 (در شبکه داخلی شرکت که Gateway آن 192.168.1.1 است) می‌باشد.

برای اتصال به سرور مشتری اطلاعات زیر در دسترس است:

IP:       203.0.113.100
Type:     PPTP
Username: myuser
Password: mypass

در صورت برقراری اتصال،IPهای دریافتی از سرور مشتری به این شرح است:

Local  IP address 10.100.2.181
Remote IP address 10.100.2.1

و البته من بعد از آن باید Remote Desktop به 10.180.36.150 بزنم تا بتوانم به مقصودم برسم.

در تصاویر زیر نحوه اتصال به این سرور را در ویندوز ملاحظه می‌کنید:

نصب PPTP و پیکربندی اتصال

نصب و راه اندازی‌ PPTP در همه سیستم‌های لینوکسی شبیه هم است.برای نصب در Debian باید بسته‌ی pptp-linux را نصب کنید.البته نام این بسته در توزیع های دیگر متفاوت است.مثلا در Arch به نام pptpclient و در fedora به نام pptp شناخته می‌شود.

apt install pptp-linux

حالا فایل /etc/ppp/chap-secrets را ویرایش می‌کنیم و نام کاربری، کلمه عبور و IP را در آن وارد می‌کنیم:

nano /etc/ppp/chap-secrets

حالا نوبت فایل /etc/ppp/options.pptp است.چنانچه نیاز است مقادیر آن را ویرایش کنید (من نیازی به ویرایش نداشتم و از همان تنظیمات پیشفرض آن استفاده کردم).مقادیر موجود به این قرار است:

nano /etc/ppp/options.pptp


lock
noauth
refuse-pap
refuse-eap
refuse-chap
refuse-mschap
nobsdcomp
nodeflate

سپس نوبت به ساخت Connection می‌رسد.برای این کار یک فایل در مسیر /etc/ppp/peers به نام south-kerman ایجاد کنید:

nano /etc/ppp/peers/south-kerman

و مقادیر زیر را در آن وارد کرده و ذخیره نمایید:

pty &quotpptp 203.0.113.100 --nolaunchpppd&quot
name myuser
remotename PPTP
require-mppe-128
file /etc/ppp/options.pptp
ipparam south-kerman

توجه کنید که با توجه به مقادیر وارد شده در chap-secrets هنگام اتصال توسط south-kerman،کلمه عبور به صورت اتوماتیک از این فایل دریافت و اعمال می‌گردد.

حالا همه چیز تمام است.کافیست متصل شوید.

نحوه‌ی اتصال

قبل از بحث در مورد اتصال بهتر است همواره لاگ اتصال به سیستم را به صورت آن لاین بررسی کنیم.این کار می‌تواند توسط دستور زیر رخ دهد.البته حتما به یاد داشته باشید که این دستور را در پنجره‌ی دیگری وارد کنید تا هنگام اتصال بتوانید لاگ‌های ایجاد شده را ببینید.

tail -n 0 -f  /var/log/syslog | grep 'ppp\|PPP\|pptp'

و برای اتصال داریم:

pon south-kerman

و در لاگ:

May 31 17:01:49 MT-SERVER pppd[806]: pppd 2.4.7 started by smah1, uid 0
May 31 17:01:49 MT-SERVER kernel: [  136.098669] PPP generic driver version 2.4.2
May 31 17:01:49 MT-SERVER pptp[810]: anon log[main:pptp.c:353]: The synchronous pptp option is NOT activated
May 31 17:01:49 MT-SERVER pppd[806]: Using interface ppp0
May 31 17:01:49 MT-SERVER pppd[806]: Connect: ppp0 <--> /dev/pts/2
May 31 17:01:49 MT-SERVER pptp[818]: anon log[ctrlp_rep:pptp_ctrl.c:259]: Sent control packet type is 1 'Start-Control-Connection-Request'
May 31 17:01:49 MT-SERVER pptp[818]: anon log[ctrlp_disp:pptp_ctrl.c:781]: Received Start Control Connection Reply
May 31 17:01:49 MT-SERVER pptp[818]: anon log[ctrlp_disp:pptp_ctrl.c:815]: Client connection established.
May 31 17:01:50 MT-SERVER pptp[818]: anon log[ctrlp_rep:pptp_ctrl.c:259]: Sent control packet type is 7 'Outgoing-Call-Request'
May 31 17:01:50 MT-SERVER pptp[818]: anon log[ctrlp_disp:pptp_ctrl.c:900]: Received Outgoing Call Reply.
May 31 17:01:50 MT-SERVER pptp[818]: anon log[ctrlp_disp:pptp_ctrl.c:939]: Outgoing call established (call ID 15306, peer's call ID 9104).
May 31 17:02:10 MT-SERVER pptp[818]: anon log[ctrlp_disp:pptp_ctrl.c:977]: Call disconnect notification received (call id 15306)
May 31 17:02:10 MT-SERVER pptp[818]: anon log[ctrlp_disp:pptp_ctrl.c:830]: Received Stop Control Connection Request.
May 31 17:02:10 MT-SERVER pptp[818]: anon log[ctrlp_rep:pptp_ctrl.c:259]: Sent control packet type is 4 'Stop-Control-Connection-Reply'
May 31 17:02:10 MT-SERVER pptp[818]: anon log[callmgr_main:pptp_callmgr.c:269]: Closing connection (shutdown)
May 31 17:02:10 MT-SERVER pptp[818]: anon log[ctrlp_rep:pptp_ctrl.c:259]: Sent control packet type is 12 'Call-Clear-Request'
May 31 17:02:10 MT-SERVER pptp[818]: anon log[call_callback:pptp_callmgr.c:84]: Closing connection (call state)
May 31 17:02:10 MT-SERVER pppd[806]: Modem hangup
May 31 17:02:10 MT-SERVER pppd[806]: Connection terminated.
May 31 17:02:10 MT-SERVER pppd[806]: Exit.

همانطور که ملاحظه می‌کنید،ارتباط با سرور برقرار می‌شود (Outgoing call established) ولی بعد از حدود 20 ثانیه فرآیند Disconnect شروع شده و ارتباط پایان می‌یابد و سیستم IP هم دریافت نمی‌کند.پس یعنی مشکلی وجود دارد!

رفع مشکل

با کمی جستجو در اینترنت متوجه شدم که برای پایدار نگه داشتن اتصال نیاز به بارگذاری ماژول nf_conntrack_pptp دارم.برای این کار در خط فرمان عبارت زیر را وارد کنید:

modprobe nf_conntrack_pptp

که البته با Restart سیستم دوباره بارگذاری نمی‌شود.برای بارگذاری در هر بار کافیست فایل زیر را ویرایش (در صورت نیاز ایجاد کنید):

nano /etc/modules-load.d/pptp.conf

و عبارت زیر را به آن بیافزایید:

nf_conntrack_pptp

تست دوباره اتصال

با دو دستور زیر می‌توانید اتصال را برقرار کنید و یا آن را خاتمه بدهید:

pon south-kerman
poff south-kerman

و در لاگ خروجی داریم:

May 31 17:30:41 MT-SERVER pppd[1706]: pppd 2.4.7 started by smah1, uid 0
May 31 17:30:41 MT-SERVER pppd[1706]: Using interface ppp0
May 31 17:30:41 MT-SERVER pptp[1709]: anon log[main:pptp.c:353]: The synchronous pptp option is NOT activated
May 31 17:30:41 MT-SERVER pppd[1706]: Connect: ppp0 <--> /dev/pts/2
May 31 17:30:41 MT-SERVER pptp[1720]: anon log[ctrlp_rep:pptp_ctrl.c:259]: Sent control packet type is 1 'Start-Control-Connection-Request'
May 31 17:30:41 MT-SERVER pptp[1720]: anon log[ctrlp_disp:pptp_ctrl.c:781]: Received Start Control Connection Reply
May 31 17:30:41 MT-SERVER pptp[1720]: anon log[ctrlp_disp:pptp_ctrl.c:815]: Client connection established.
May 31 17:30:42 MT-SERVER pptp[1720]: anon log[ctrlp_rep:pptp_ctrl.c:259]: Sent control packet type is 7 'Outgoing-Call-Request'
May 31 17:30:42 MT-SERVER pptp[1720]: anon log[ctrlp_disp:pptp_ctrl.c:900]: Received Outgoing Call Reply.
May 31 17:30:42 MT-SERVER pptp[1720]: anon log[ctrlp_disp:pptp_ctrl.c:939]: Outgoing call established (call ID 6496, peer's call ID 9111).
May 31 17:30:42 MT-SERVER pppd[1706]: CHAP authentication succeeded
May 31 17:30:42 MT-SERVER kernel: [ 1869.179509] PPP MPPE Compression module registered
May 31 17:30:42 MT-SERVER pppd[1706]: MPPE 128-bit stateless compression enabled
May 31 17:30:44 MT-SERVER pppd[1706]: local  IP address 10.100.2.181
May 31 17:30:44 MT-SERVER pppd[1706]: remote IP address 10.100.2.1
.........
May 31 17:31:14 MT-SERVER pptp[1720]: anon log[callmgr_main:pptp_callmgr.c:269]: Closing connection (shutdown)
May 31 17:31:14 MT-SERVER pppd[1706]: Terminating on signal 15
May 31 17:31:14 MT-SERVER pptp[1720]: anon log[ctrlp_rep:pptp_ctrl.c:259]: Sent control packet type is 12 'Call-Clear-Request'
May 31 17:31:14 MT-SERVER pptp[1720]: anon log[call_callback:pptp_callmgr.c:84]: Closing connection (call state)
May 31 17:31:14 MT-SERVER pppd[1706]: Connect time 0.5 minutes.
May 31 17:31:14 MT-SERVER pppd[1706]: Sent 0 bytes, received 0 bytes.
May 31 17:31:14 MT-SERVER pppd[1706]: MPPE disabled
May 31 17:31:14 MT-SERVER pppd[1706]: Child process pptp 203.0.113.100 --nolaunchpppd (pid 1708) terminated with signal 15
May 31 17:31:14 MT-SERVER pppd[1706]: Modem hangup
May 31 17:31:14 MT-SERVER pppd[1706]: Connection terminated.
May 31 17:31:14 MT-SERVER pppd[1706]: Exit.

این دفعه ظاهرا همه چیز روبراه است و حتی سیستم IP هم دریافت کرده است.شما با زدن دستور زیر می‌توانید ببیند که یک interface شبکه جدید به نام ppp0 اضافه شده است:

ip addr show

دسترسی

برای بررسی دسترسی کافیست از سه IP زیر ping بگیریم:

ping 10.100.2.181
ping 10.100.2.1
ping 10.180.36.150

که داریم:

به عبارت دیگر با اینکه ارتباط برقرار شده است ولی دسترسی به 10.180.36.150 نداریم!

برای بررسی دقیق این مشکل، فرایند route درخواست‌ها را بررسی می‌کنیم:

ip -o route get 8.8.8.8
ip -o route get 10.100.2.181
ip -o route get 10.180.36.150

که خروجی آن به این شکل است:

# ip -o route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev enp63s0 src 192.168.1.150 uid 0 \    cache
# ip -o route get 10.100.2.181
local 10.100.2.181 dev lo src 10.100.2.181 uid 0 \    cache <local>
# ip -o route get 10.180.36.150
10.180.36.150 via 192.168.1.1 dev enp63s0 src 192.168.1.150 uid 0 \    cache

که این خروجی نشان می‌دهد که درخواست‌های 10.180.36.150 به جای ارسال توسط pptp tunnel همچنان بر روی کارت شبکه عادی ارسال می‌شود.نتیجه اینکه، باید به سیستم بگوییم که تمام درخواست‌های روی 10.0.0.0/8 رو بر روی ppp0 (نام همان pptp tunnel) ارسال کند.پس دستور زیر را وارد کنید:

ip route add 10.0.0.0/8 via 10.100.2.1 dev ppp0

حالا داریم:

# ip -o route get 10.180.36.150
10.180.36.150 via 10.100.2.1 dev ppp0 src 10.100.2.181 uid 0 \    cache

که به این معنی است که اکنون شما می‌توانید از 10.180.36.150 پینگ بگیرید.

دسترسی از روی سیستم شخصی

حالا به قسمت اصلی ماجرا رسیدیم.از روی سیستم خودم VPN به سرور شرکت ایجاد کرده و IP دریافت شد.حالا از سه IP بالا ping می‌گیرم:

همانطور که می‌بینید به جز 10.100.2.181 (که درون سرور شرکت قرار دارد) به هیچ کدام دسترسی ندارم.پس باید به سرور اعلام کنم که در خواست های من را FORWARD کند.برای این کار ابتدا باید ip forwarding را در سرور فعال کنم.برای این منظور دو راه است.راه اول دستور زیر را بزنید:

sysctl -w net.ipv4.ip_forward=1

که البته با Reset سیستم به مقدار پیشفرض (یعنی صفر) بر می‌گردد.راه دوم که حالت پایدار است ویرایش فایل زیر است:

nano /etc/ufw/sysctl.conf

و در آن عبارت زیر را فعال کنید:

net/ipv4/ip_forward=1

بعد از این مرحله باید به firewall اجازه forwarding بین این دو شبکه را بدهیم یعنی:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j MASQUERADE

که صریحا این اجازه را بین دو شبکه می‌دهد.در این جا کار تمام می‌شود و ping برای IP سرور مشتری بر روی سیستم شخصی ظاهر می‌شود.

ذکر این نکته ضروریست که iptable بعد از reset سیستم به مقادیر پیشفرض برمی‌گردد.پس چنانچه می‌خواهید این تنظیم را پایدار کنید حتما از ufw استفاده کنید.

جمع بندی

برای اتصال می‌توانید از توالی دستورات زیر استفاده کنید:

pon south-kerman
ip route add 10.0.0.0/8 via 10.100.2.1 dev ppp0
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j MASQUERADE

و برای Diconnect هم دستورات زیر مورد نیاز است:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j MASQUERADE
ip route del 10.0.0.0/8 via 10.100.2.1 dev ppp0
poff south-kerman

و برای عیب یابی احتمالی شاید دستورات زیر کار ساز باشد:

iptables -t nat -L -v
traceroute -4 10.180.36.150
ip addr show
ip route show
route -n

و البته اگر می‌خواهید به صورت اتوماتیک ارتباط pptp شما برقرار شود می‌توانید این منبع را مطالعه کنید.