מדריך: הפעלה ושליטה על שרת OpenVPN דרך OpenHAB

SIRI, CORTANA, ALEXA, ECHO, GOOGLE HOME, HOME PAD, שלטים חכמים, KEY PADS, אפליקציות
chenta (פותח השרשור)
חבר פעיל מאוד
חבר פעיל מאוד
הודעות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

מדריך: הפעלה ושליטה על שרת OpenVPN דרך OpenHAB

נושא שלא נקרא #1 

שלום לכולם,
אשמח לשתף במגנון שהשלמתי לאחרונה לשליטה על שרת OpenVPN דרך OpenHAB.
כתבתי את המדריך הבא בצורה יחסית מפורטת כדי שמי שירצה לשכפל את הצעדים יוכל לעשות את זה בצורה פשוטה.
מקווה שלא טעיתי באחד הצעדים, אם מישהו מזהה טעות אשמח להצבעה כדי שאוכל לתקן.
כמו כן, למרות שנראה שמדובר בהרבה פעולות לינקוס מתקדמות, אני למעשה ממש לא מומחה לינקוס והכל כאן תוצאה של התנסויות רבות שחוויתי במשך הזמן.
אם מישהו מהקוראים במקרה כן מומחה לינוקס ויכול להציע דרך טובה/אלגנטית/נכונה יותר- יותר מאשמח לשמוע כדי ללמוד עוד משהו חדש.

הגדרת המטרה:
להיות מסוגל לכבות ולהדליק את שרת ה- VPN מרחוק, כלומר מחוץ ל- LAN הביתי.

הסט-אפ:
OpenHAB 3.0.1
רץ על Raspberry Pi 4 2GB
מערכת הפעלה openhabian

רקע קצר למי שלא מכיר:
מה זה VPN?
ערוץ מוצפן מנקודה לנקודה שרוכב על קווי האינטרנט הרגילים.
שרת VPN שרץ בתוך הרשת הביתית יכול לאפשר למכשיר, שנמצא מחוץ לרשת, לגשת בצורה מאובטחת לרשת ולמעשה להרגיש כמו מחשב בתוך ה- LAN עצמו.

למה לעשות את זה?
השאלה למה לרצות לגשת לרשת הביתית מחוץ לבית יכולה לקבל הרבה תשובות, לכל אחד זה יהיה לצורך אחר.
למשל:
  • גישה בטוחה למצלמות רשת שנמצאות בבית ולא רוצים לאפשר להם גישה פתוחה מבחוץ מטעמי שמירה על הפרטיות.
  • ביצוע פעולות ברשת הפנימית שלא ניתן לעשות מבחוץ.
  • אחת מהפעולות האלה למשל, שהובילה אותי במקור לרצות לעשות את זה, זה לגשת לממשק השליטה של OH גם כשאני מחוץ לבית (ולא רק ל- sitemap)
התקנת שרת VPN
הצעד הראשון הוא להתקין VPN על ה- RPi. אפשר כמובן להתקין את זה על עוד מחשבים ברשת אבל לטעמי זה נוח יותר על אותה מכונה שרצה עליה OH כי מטבע הדברים זאת תהיה מכונה שעובדת 24/7. בנוסף זה יאפשר לי לשלוט עליו בקלות מתוך OH, על כך בהמשך.
כדאי לציין ש- OH מגיע עם האפשרות להתקין את WireGuard ו- TaliscaleVPN דרך openhabian-config. אני מודה שלאחר שניסיתי ולא ממש הצלחתי בצורה קלה, די זנחתי את הכיוון הזה מבלי לנסות להעמיק בו.
השרת שהתקנתי- OpenVPN באמצעות תוכנה שנקראת PiVPN.
יש הרבה מדריכים, ההתקנה סופר פשוטה, וזה עבד לי על הניסיון הראשון- זה אומר שמישהו שם עשה עבודה טובה. :wink:
מדריך לדוגמא (איתו עבדתי אבל יש עוד הרבה):
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
טוב אז יש לנו שרת VPN פעיל ואם נפעיל את הקליינט בנייד, נתחבר לרשת הפנימית ונקבל IP פנימי כאילו אנחנו ב- WiFi הביתי.
נשאלת השאלה- למה לא לעצור כאן? למה צריך לשלוט (לכבות/להפעיל) את השרת מרחוק?
אז לא באמת חייבים אבל אני העדפתי כן לעשות את זה בעיקר משיקולי אבטחה.
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"                                           
sitemap:

קוד: בחירת הכל

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:

קוד: בחירת הכל

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
3. הוספת השורות הבאות לקובץ:

קוד: בחירת הכל

#!/bin/bash
# This script should start the openvpn service
sudo systemctl start openvpn.service
4. הכנת סקריפט דומה לעצירת השירות (להחליף את ה- start ב- stop)
5. הוספת הרשאת הרצה לסקריפט:

קוד: בחירת הכל

sudo chmod +x /usr/bin/vpn/startService.sh
6. ביצוע אותו לדבר לסקריפט שעוצר
7. הוספת המשתמש openhab למשתמשים שמותר להם להריץ פקודות sudo:

קוד: בחירת הכל

sudo adduser openhab sudo
8. יצירת קובץ הרשאות למשתמש שיכיל את הפקודות המותרות להרצה ללא סיסמא:

קוד: בחירת הכל

sudo visudo -f /etc/sudoers.d/OHAdminPermissions
9. הוספת השורות הבאות לקובץ:

קוד: בחירת הכל

# 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 (מופיע במדריך שקישרתי אליו).

מקווה שמישהו יוכל להיעזר במדריך למטרה הזו או למטרות אחרות.
בהצלחה!
נא להרשם/להכנס לחשבון בפורום על מנת לצפות בקבצים או בתמונות המצורפים לשרשור

jagheadg
חבר ותיק
חבר ותיק
הודעות: 1148
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים
נתן תודות: 52 פעמים
קיבל תודות: 112 פעמים

Re: מדריך: הפעלה ושליטה על שרת OpenVPN דרך OpenHAB

נושא שלא נקרא #2 

היי. תודה על ההשקעה.
בעניין האבטחה לכיבוי שרת ה VPN זו סיבה אחרת.
בעיה אחת שנתקלתי בה בעבר הייתה שהשרת של OH השתבש מאיזושהי סיבה ואי אפשר היה לדבר איתו דרך הענן (ניתוק רגעי של האינטרנט או החשמל גרם לשיבוש).
בשיטה הנ"ל אי אפשר יהיה להדליק את השרת ולגשת לרשת הפנימית לאתחל את OH.
מהסיבה הזו יש לי כיום עוד RPI3 נפרד זרוק בבית ומחובר על הרשת כשאחד מהתפקידים שלו זה להריץ שרת VPN.
בדרך הזו יש הפרדת מערכות וגם גישה לרשת בלתי תלויה במערכת אחרת.

chenta (פותח השרשור)
חבר פעיל מאוד
חבר פעיל מאוד
הודעות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

Re: מדריך: הפעלה ושליטה על שרת OpenVPN דרך OpenHAB

נושא שלא נקרא #3 

הי העלית כאן כמה נקודות מאוד נכונות. תודה על הפידבק.

אני מודה שבהתחלה ה vpn שלי רץ באמת על rpi נפרד. האמת היא שלא בגלל שחשבתי שתהיה לי בעיית נגישות ל oh, בעיקר בגלל חוסר התלות והפרדת הרשויות שציינת.
הגדלתי את התלות ב oh בחיבור הזה, אבל באמת כמו שגם ציינת, הרווחתי את זה שה vpn לא פתוח בצורה רציפה.

מקבל לחלוטין את כל מה שאמרת.
ואם אגיע למצב שהשרת הרבה פעמים מפסיק להגיב והגישה מהענן לא מתאפשרת, זאת באמת תהיה דחיפה לכיוון הפרדה מחדש.

שלח תגובה

חזור אל “עוזרות קוליות, שליטה ובקרה”