برای نرمافزار یکی از مشتریان ما (به نام «کرمان جنوب») مشکلی پیش آمد و من باید برای حل آن اقدام میکردم.ولی دو مشکل وجود داشت:
برای رفع این مشکل یک راه حل وجود داشت: کافی بود من به سرور داخل شرکت وصل بشوم و از آنجا یک 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 در همه سیستمهای لینوکسی شبیه هم است.برای نصب در 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 "pptp 203.0.113.100 --nolaunchpppd" 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 شما برقرار شود میتوانید این منبع را مطالعه کنید.