אשמח לשתף במגנון שהשלמתי לאחרונה לשליטה על שרת OpenVPN דרך OpenHAB.
כתבתי את המדריך הבא בצורה יחסית מפורטת כדי שמי שירצה לשכפל את הצעדים יוכל לעשות את זה בצורה פשוטה.
מקווה שלא טעיתי באחד הצעדים, אם מישהו מזהה טעות אשמח להצבעה כדי שאוכל לתקן.
כמו כן, למרות שנראה שמדובר בהרבה פעולות לינקוס מתקדמות, אני למעשה ממש לא מומחה לינקוס והכל כאן תוצאה של התנסויות רבות שחוויתי במשך הזמן.
אם מישהו מהקוראים במקרה כן מומחה לינוקס ויכול להציע דרך טובה/אלגנטית/נכונה יותר- יותר מאשמח לשמוע כדי ללמוד עוד משהו חדש.
הגדרת המטרה:
להיות מסוגל לכבות ולהדליק את שרת ה- VPN מרחוק, כלומר מחוץ ל- LAN הביתי.
הסט-אפ:
OpenHAB 3.0.1
רץ על Raspberry Pi 4 2GB
מערכת הפעלה openhabian
רקע קצר למי שלא מכיר:
מה זה VPN?
ערוץ מוצפן מנקודה לנקודה שרוכב על קווי האינטרנט הרגילים.
שרת VPN שרץ בתוך הרשת הביתית יכול לאפשר למכשיר, שנמצא מחוץ לרשת, לגשת בצורה מאובטחת לרשת ולמעשה להרגיש כמו מחשב בתוך ה- LAN עצמו.
למה לעשות את זה?
השאלה למה לרצות לגשת לרשת הביתית מחוץ לבית יכולה לקבל הרבה תשובות, לכל אחד זה יהיה לצורך אחר.
למשל:
- גישה בטוחה למצלמות רשת שנמצאות בבית ולא רוצים לאפשר להם גישה פתוחה מבחוץ מטעמי שמירה על הפרטיות.
- ביצוע פעולות ברשת הפנימית שלא ניתן לעשות מבחוץ.
- אחת מהפעולות האלה למשל, שהובילה אותי במקור לרצות לעשות את זה, זה לגשת לממשק השליטה של OH גם כשאני מחוץ לבית (ולא רק ל- sitemap)
הצעד הראשון הוא להתקין VPN על ה- RPi. אפשר כמובן להתקין את זה על עוד מחשבים ברשת אבל לטעמי זה נוח יותר על אותה מכונה שרצה עליה OH כי מטבע הדברים זאת תהיה מכונה שעובדת 24/7. בנוסף זה יאפשר לי לשלוט עליו בקלות מתוך OH, על כך בהמשך.
כדאי לציין ש- OH מגיע עם האפשרות להתקין את WireGuard ו- TaliscaleVPN דרך openhabian-config. אני מודה שלאחר שניסיתי ולא ממש הצלחתי בצורה קלה, די זנחתי את הכיוון הזה מבלי לנסות להעמיק בו.
השרת שהתקנתי- OpenVPN באמצעות תוכנה שנקראת PiVPN.
יש הרבה מדריכים, ההתקנה סופר פשוטה, וזה עבד לי על הניסיון הראשון- זה אומר שמישהו שם עשה עבודה טובה.
מדריך לדוגמא (איתו עבדתי אבל יש עוד הרבה):
https://www.pcmag.com/how-to/how-to-cre ... spberry-pi
לא אכנס לעומק של תהליך זה כי המדריכים טובים מאוד- אם תהיה דרישה אכתוב גם על זה בהמשך.
שתי נקדות שכן כדאי לציין (מופיעות במדריך):
- חשוב לזכור להפנות פורט בראוטר ל- IP של ה- RPi. פורט: 1194 (אלא אם שונה במהלך ההתקנה)
- יש אפשרות לעבוד עם שירות DynDNS (כמו DuckDNS), אני בחרתי לא לעשות את זה ולמעשה אני עובד מול ה- IP החיצוני שלי. (ויש לי rule שמתריע לי אם הוא משתנה כי במקרה כזה צריך לייצר הרשאות VPN חדשות).
לאחר התקנת השרת נשים לב שרץ לנו עכשיו במערכת שירות (service) שנקרא openvpn.
נוכל לוודא את זה ע"י הפקודה:
קוד: בחירת הכל
sudo systemctl status openvpn.service
נשאלת השאלה- למה לא לעצור כאן? למה צריך לשלוט (לכבות/להפעיל) את השרת מרחוק?
אז לא באמת חייבים אבל אני העדפתי כן לעשות את זה בעיקר משיקולי אבטחה.
OpenVPN זו אמנם תוכנה פעילה ומתוחזקת אבל זה לא אומר שהיא נטולת חולשות, והרגשתי לא נוח אם זה שיש לי שירות ברשת הביתית שמקשיב באופן קבוע לפניות מבחוץ. בנוסף, תדירות השימוש שלי היא לא גבוהה כך שרוב הזמן השרת פשוט מחכה.
הוספת יכולת שליטה על השרת מתוך OpenHAB
העקרון של שיטת העבודה (הכל יודגם בהמשך):
- במערכת שלי מותקן OpenHAB Cloud Connector שמאפשר לי גישה ל- sitemaps דרך האפליקציה של OH גם מחוץ לרשת הביתית
- דרך ה- sitemap יש לי אפשרות להפעיל או לכבות את ה- VPN, וכן לבדוק את הסטטוס שלו
- לאחר הפעלה של ה- VPN, אני פותח ערוץ באמצעות הקליינט של ה- VPN שעל הנייד שלי
- לאחר חיבור מוצלח לשרת, הנייד שלי למעשה מקבל IP פנימי והוא חלק מה- LAN הביתי
- לאחר סיום עבודה וניתוק ערוץ ה- VPN, אני יכול לכבות את השרת דרך ה- sitemap
items:
קוד: בחירת הכל
String Sys_PublicIP "Systme Public IP [%s]" <ip>
Switch Sys_CheckPublicIP "System Public IP Check" <search>
String Sys_VPNControl "System VPN Control" <vpn>
Switch Sys_VPNCheck "System VPN Check Status"
קוד: בחירת הכל
Text item=Sys_PublicIP label="Public IP [%s]"
Switch item=Sys_CheckPublicIP label="Update Public IP" mappings=[ON="Check"]
Selection item=Sys_VPNControl label="VPN Server [%s]" mappings=[Activate="Activate", Deactivate="Deactivate", Check="Check Status"]
קוד: בחירת הכל
rule "VPN Server Control"
when
Item Sys_VPNControl received command
then
logInfo(filename, "Controling the VPN server: " + receivedCommand)
switch Sys_VPNControl.state {
case "Activate":{
executeCommandLine("sudo","/usr/bin/vpn/startService.sh")
Sys_VPNCheck.sendCommand(ON)
}
case "Deactivate": {
executeCommandLine("sudo","/usr/bin/vpn/stopService.sh")
Sys_VPNCheck.sendCommand(ON)
}
case "Check": {
Sys_VPNCheck.sendCommand(ON)
}
}
end
rule "VPN Server Check Status"
when
Item Sys_VPNCheck received command ON
then
logInfo(filename, "Checking VPN server status")
if (timer===null) {
timer = createTimer(now.plusSeconds(1), [|
val String serviceStatusRaw = executeCommandLine(Duration.ofSeconds(15),"systemctl","status","openvpn.service")
val String serviceStatus = (serviceStatusRaw.split("\n").get(2)).stripLeading().split(" ").get(1)
if (serviceStatus == "inactive") {
Sys_VPNControl.postUpdate("Inactive")
} else if (serviceStatus == "active") {
Sys_VPNControl.postUpdate("Active")
} else {
Sys_VPNControl.postUpdate(serviceStatus)
}
logInfo(filename, "VPN Status is: " + serviceStatus)
timer=null
])
}
end
פעולת ההדלקה והכיבוי מתבצעות ע"י הרצת סקריפט.
הסיבה לכך היא שהפעולה דורשת הרשאות sudo, והדרך היחידה שאני מכיר לאפשר את זה מבלי להיות צריך להקיש סיסמא היא בשיטה שאפרט בהמשך.
כמו שאמרתי אני לא מומחה לינקוס ולכן יכול להיות שזאת דרך טיפה עקומה ושיש יותר טובה ואלגנטית- אם יש למישהו עצה טובה לתת על זה אשמח לשמוע.
דבר בסיסי שחשוב להבין על OH זה שכשהמערכת רצה היא פועלת דרך המשתמש openhab.
כשניגשים ב- SSH ל- RPi נכנסים עם המשתמש openhabian.
ולכן לא כל מה שנצליח להריץ ב- SSH (כ- openhabian) נצליח להריץ מהחוקים (כ- openhab) וצריך לוודא הרשאות.
להלן רצף הפעולות הדרוש להכנת הסקריפטים וסידור ההשראות הדרוש:
1. בחירת מיקום זמין להרצה למשתמש openhab- יצרתי תיקית vpn תחת usr/bin.
2. יצירת קובץ חדש:
קוד: בחירת הכל
sudo nano /usr/bin/vpn/StartService.sh
קוד: בחירת הכל
#!/bin/bash
# This script should start the openvpn service
sudo systemctl start openvpn.service
5. הוספת הרשאת הרצה לסקריפט:
קוד: בחירת הכל
sudo chmod +x /usr/bin/vpn/startService.sh
7. הוספת המשתמש openhab למשתמשים שמותר להם להריץ פקודות sudo:
קוד: בחירת הכל
sudo adduser openhab sudo
קוד: בחירת הכל
sudo visudo -f /etc/sudoers.d/OHAdminPermissions
קוד: בחירת הכל
# Allow openhab user to execute commands
openhab ALL=(ALL) NOPASSWD: /usr/bin/vpn/SartService.sh, /usr/bin/vpn/StopService.sh
לסיכום:
במדריך תיארתי איך יצרתי דרך לגשת בצורה בטוחה לרשת הביתית שלי באמצעות שרת VPN, אבל גם איך יצרתי מנגנון שמאפשר שליטה על השרת באמצעות הגישה שכבר יש לי מרחוק ל- sitemap.
חשוב להדגיש שעצם הדלקת ה- VPN דרך OH לא יוצרת את הערוץ עצמו. בשביל זה צריך להפעיל את ה- VPN דרך קליינט של OpenVPN (מופיע במדריך שקישרתי אליו).
מקווה שמישהו יוכל להיעזר במדריך למטרה הזו או למטרות אחרות.
בהצלחה!