انشاء شبكة خاصة افتراضية (VPN) باستخدام SSH (الجزء الأول)
كتب بواسطة مسلم عادل بتاريخ 2008/09/08
تعتبر الشبكات الافتراضية الخاصة (VPNs) أدوات مفيدة جدا في شتى المجالات، سواء كان عبر استخدامها للاتصال الى شبكة عبر الانترنت، او كان لزيادة حماية الشبكات اللاسلكية (wireless). أو ربط مختلف فروع مؤسسة او شركة مع بعضها البعض عبر الانترنت.
ولكن كثير من البرامج الخاصة بعمل VPN تتصف ببعض الصعوبة، مما يجعل تطبيقها صعب قليلا.
في هذا المقال، ساشرح كيفية عمل VPN باستخدام أداة معروفة للجميع الا وهي SSH.
ملاحظة: هذا المقال مقسم الى قسمين، القسم الأول وهو ما سنقوم شرحه الان هو ربط جهاز بشبكة، والجزء الثاني سيكون للعدد القادم هو ربط شبكة بشبكة.
ولكن قبل ان نخوض في الشرح، لنتأمل الصورة التالية:
من الصورة، نلاحظ أننا نريد ان ندمج الجهاز B في الشبكة A. وهذا ما سنفعله حيث اننا سندمج الجهاز B في الشبكة A عبر الجهاز A. ولكن قبل البداية، تأكد انك تملك صلاحيات root على الجهاز A (اما ان يكون لديك root او sudo تكفي).
الخطوة الاولى: التأكد من إصدار SSH
قبل المباشرة بالخطوات التالية، عليك التاكد من أن ssh server مركب في الجهاز A ورقم اصداره هو على الاقل 4.3. اذا كان الاصدار المركب يحمل رقم اقل من هذا، قم بترقيته والا لن تعمل هذه الخاصية.
ونفس الكلام ينطبق على الجهاز B تأكد من أن ssh client يحمل رقم 4.3 او اكبر.
في ديبيان/اوبونتو يمكنك تركيب SSH باستخدام الامر التالي:
root@laptop:~# apt-get install openssh-serverالخطوة الثانية: تحرير ملف الإعداد
root@laptop:~# nano /etc/ssh/sshd_config تاكد من وجود/اضافة السطرين التاليين:
PermitRootLogin yes
PermitTunnel yes
بعد الاضافة، قم بحفظ الملف، واعد تشغيل خادم الـ ssh
root@laptop:~# /etc/init.d/ssh restartالخطوة الثالثة: انشاء الجسر بين جهازك والخادم
نفذ هذا الأمر في الجهاز A (ويفضل تنفيذه في B أيضا):
root@laptop_A:~# echo 1 > /proc/sys/net/ipv4/ip_forwardفي جهاز B نفذ:
root@laptop_B:~# ssh -w 0:0 1.2.3.4هذا الأمر يقوم بانشاء كرت شبكة افتراضي اسمه tun0 في الجهازين (A و B). يمكنك التأكد منه عبر استخدام الأمر في كلا الجهازين:
root@laptop:~# ifconfig tun0الخطوة الرابعة: اعداد الشبكة:
في جهاز A نفذ:
root@laptop_A:~# ifconfig tun0 10.0.0.100 pointopoint 10.0.0.200في جهاز B نفذ:
root@laptop_B:~# ifconfig tun0 10.0.0.200 pointopoint 10.0.0.100للتأكد انه يوجد اتصال بين الجهازين:
في جهاز B نفذ:
root@laptop_B:~# ping 10.0.0.100
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.
64 bytes from 10.0.0.100: icmp_seq=1 ttl=64 time=74.8 ms
64 bytes from 10.0.0.100: icmp_seq=2 ttl=64 time=73.6 ms
64 bytes from 10.0.0.100: icmp_seq=3 ttl=64 time=74.3 ms
--- 10.0.0.100 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 73.649/74.278/74.880/0.549 msفي جهاز A نفذ:
$ ping 10.0.0.200
PING 10.0.0.200 (10.0.0.200) 56(84) bytes of data.
64 bytes from 10.0.0.200: icmp_seq=1 ttl=64 time=75.2 ms
64 bytes from 10.0.0.200: icmp_seq=2 ttl=64 time=74.0 ms
64 bytes from 10.0.0.200: icmp_seq=3 ttl=64 time=74.0 ms
— 10.0.0.200 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 74.029/74.424/75.208/0.554 ms
الان اصبح لديك اتصال مباشر بين الجهاز B والجهاز A، ولكن جهاز B لا يمكنه الوصول الى باقي أجهزة الشبكة، سيكون علينا عمل بعض التعديلات.
في الجهاز B نفذ:
$ sudo route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.200 tun0
في الجهاز A:
# arp -sD 10.0.0.200 eth0 pub
** eth0 هي الواجهة المتصلة ببقية اجهزة الشبكة.
هذا الامر يجعل أجهزة الشبكة ترسل الخاصة بالجهاز B الى جهاز A وهو بدوره يقوم بارسالها الى جهاز B
بهذا انتهينا من ضم الجهاز B الى الشبكة A واصبح بامكان B استخدام كل الموارد الموجودة في الشبكة A بالاضافة ان اجهزة الشبكة A بامكانها الاستفادة من الموارد الموجودة في الجهاز B
الخطوة الخامسة: حفظ الاعدادات
بقي علينا الان هو حفظ الاعدادات لانه في حال قمنا باعادة تشغيل الجهاز A او B سيكون علينا اعادة العمل من جديد.
في الجهاز A حرر الملف /etc/network/interfaces/ واضف الاتي:
iface tun0 inet static
pre-up sleep 5
address 10.0.0.100
pointopoint 10.0.0.200
netmask 255.255.255.0
up arp -sD 10.0.0.200 eth0 pub
في الجهاز B حرر نفس الملف واكتب التالي:
iface tun0 inet static
pre-up ssh -f -w 0:0 1.2.3.4 ‘ifdown tun0; ifup tun0′
pre-up sleep 5
address 10.0.0.200
pointopoint 10.0.0.100
netmask 255.255.255.0
up route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.200 tun0