לאחסן שרת בבית? זה לגמרי אפשרי

האם אפשר להתקין שרת בבית ולחשוף אותו באופן מאובטח החוצה בלי שאיראני ישתלט לי על המקרר? התשובה היא כן.

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

אבל זה מה שאנשים עשו עד לא מזמן!

בעבר הרחוק מאד, כלומר ממש בשנות ה-90 וה-2000, אנשים אכן חיברו את המחשב שלהם לאינטרנט והפעילו עליו שרת. זה לא מורכב כמו שאנחנו חושבים. שרת אינטרנט זה בסופו של דבר תוכנה שיודעת לקבל תנועה מפורט מסוים (80 ו-443) ולהחזיר תשובה. בדיוק כמו שיש שרת מיינקראפט שאפשר להפעיל בבית על מחשב קטן. שרתי אינטרנט מקצוענים משתמשים באותן תוכנות, אבל אין מניעה. אם יש לכם מחשב, להפעיל עליו תוכנת שרת. בחלונות או בלינוקס וזה מה שהיה בעבר!

הבעיות

אך מה הבעיה עם זה? ראשית תפעולית: זה אומר שצריך לטפל במחשב, לעדכן אותו, לוודא שהוא עובד וכל השנניגנס. בעיה תפעולית נוספת היא כתובת ה-IP. כשאני קונה שם מתחם, אני צריך לחבר אותו לכתובת IP. מן הסתם זו תהיה כתובת ה-IP הביתית שלי. (אפשר למצוא את כתובת ה-IP שלנו באמצעות https://whatismyipaddress.com ודומיו) כתובת IP אצל רוב הספקים היא משתנה מפעם לפעם מסיבות שונות וזה אומר מרדף מתמיד של לחבר את כתובת ה-IP שלכם לשם המתחם.
כדי להוסיף על השמחה והששון ולכל ילד בלון, יש לנו גם CGNAT – כלומר ספקים שמחלקים כתובת IP אחת לכמה לקוחות ואז כמובן הוסטינג הוא בלתי אפשרי בלי קונפיגורציה נוספת.
פתרון טוב לזה הוא בקשת כתובת IP סטטית מהספק. זה אומר, אגב, לשלם לו כסף. זה מה שהיו עושים בעבר כשהיו רוצים לאחסן אתרים בבית ואין מניעה לעשות את זה עכשיו.

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

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

לבנות אתר בחינם

כן חשוב לציין שאם אני רוצה לבנות אתר סטטי – כלומר רק HTML, CSS ו-JS ללא מסד נתונים או שפת תכנות שרצה בשרת (כמו פייתון). יש פתרון חינמי כמו Github pages או פתרונות זולים מאד כמו להשתמש ב-Amazon S3 כבסיס לאתר כזה. מדובר בעלות של שקלים בודדים לחודש אפילו ברמות תנועה משוגעות. אפשר גם להשתמש ב-Vercel למשל ואם רוצים וורדפרס אז יש לוורדפרס.קום תוכנית חינמית ואם רוצים להשקיע כמה שקלים אז גם לאלמנטור.

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

התבלין הסודי: Cloudflare

קלאודפלייר היא חברת תשתית רצינית מאד שמחזיקה חלק עצום מהאינטרנט. היא מספקת פיירוול למלא אתרים ושירותים. גם אני משתמש בה. אם יש לכם אתר ואתם לא מכירים את קלאודפלייר – הפוסט הזה יסגור לכם את הפינה. הם מספקים המון כלים תשתיתיים לגמרי בחינם ואחד מהם הוא Cloudflare Tunnel. מדובר בתשתית שמספקת קישור בין שרת שרץ מקומית ברשת שלנו לבין קלאודפלייר בלי שאנחנו נצטרך להגדיר שום דבר במערכת שלנו. אם ה-IP שלנו ישתנה? קלאודפלייר תדאג שהמידע עדיין יעבור. גם מבחינת אבטחה, קלאודפלייר ממסכת את כתובת ה-IP שלנו ואף אחד לא יכול לדעת את כתובת ה-IP שלנו.

הערה חשובה: כמובן שאם השרת שלנו לא מעודכן או שיש בו חולשות אבטחה אז תוקף יכול לחגוג עליו. אבל למשל nmap וכלי סריקות אחרים לא יוכלו לעלות על שום דבר כי כתובת ה-IP הגלויה היא של קלאודפלייר.

ה-Tunnel לא שונה קונספטואלית מ-VPN.

אז מה שאנחנו צריכים זה להרים שרת על המכונה המקומית, שיכולה להיות רספברי פיי ואז להרים את ה-Tunnel.

חיבור שם המתחם לקלאודפלייר

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

זה די פשוט, אבל כתבתי מדריך על התקנת קלאודפלייר באתר אינטרנט ושם מתחם שמשתמש ב-Godaddy.

אחרי החיבור, יש צורך להמתין מעט כדי שהכל יעבוד כמו שצריך. לוקח לשרתי ה-DNS זמן להתעדכן. התעדכן? כשאתם עושים ping לשם המתחם שלכם אתם מקבלים את ה-IP של קלאודפלייר? אפשר להתחיל לעשות Tunnel!

פינג לשם המתחם שלי שמחזיר כתובת IP של קלאודפלייר

יצירת האתר/התקנת השרת

אפשר להתקין וורדפרס על כל מחשב. עם רספברי פיי זה קל במיוחד. אפשר גם לא להתקין וורדפרס אלא כל שרת שהוא שיגיש גם דף סטטי. מה זה משנה בכלל? נבדוק כשהכל עובד אם נקליד את כתובת ה-IP המקומית בדפדפן ונראה שאנחנו מגיעים לאתר. אני אתקין סתם איזה Nginx כדי לראות שהכל בסדר.

איך מתקינים? אשתמש ב-RaspberryPi ואלך לי אל ChatGPT ואשאל אותו – תגיד, איך מתקינים Nginx על רספברי? הוא יחפור לנצח אבל מה שאנחנו צריכים זה:

sudo apt-get update -y 
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx

ו… זהו. נבדוק את הסטטוס עם:

sudo systemctl status nginx

אם הכל תקין, נוכל לצאת עם נקודתיים ואז q ואז אנטר. נו, זה vim 🙂

פלט של טרמינל בתגובה לפקודות שפירטתי מוקדם יותר במאמר.

נבדוק על ידי הכנסת כתובת ה-IP הפנימית של הרספברי שלנו. אם מופיע לנו מסך התקנה של Nginx, אנחנו מוכנים לחגיגה!

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

בניית ה-Tunnel

על מנת להגדיר את קלאודפלייר ואת ה-Tunnel, אנו נדרשים להקין את Cloudflare CLI. זה כלי שמאפשר לנו לעבוד בטרמינל ולתקשר עם קלאודפלייר.

ההתקנה שלו במק או בלינוקס רגילים היא די פשוטה – brew או apt get ל cloudflared. ברספברי פיי זה קצת טריקי. הלכתי כמובן ל-ChatGPT והוא טען שברספברי פיי אין apt-get ושלח אותי למנהרת ארנב. מזל שאני מבין משהו ועצרתי את הטירוף והלכתי לבדוק בעצמי. אז קודם כל בודקים אם יש לנו מערכת של 32ביט או 64 ביט. עם:

uname -m

ואז מורידים את החבילה בהתאם:

# For ARMv7 (32-bit):
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm -O cloudflared

# OR for ARM64 (64-bit):
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 -O cloudflared

השלב הבא הוא הפעלה:

chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/

ובדיקה עם:

cloudflared --version

הכל תקין אם רואים גרסה.

עכשיו אנחנו מוכנים!

cloudflared login

זה יפתח לנו את הדפדפן ונוכל לעשות לוגין.

בלוגין אני אצטרך לבחור שם מתחם משמות המתחם שיש לי בקלאודפלייר.

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

cloudflared tunnel create my-home-server

נוצר לנו Tunnel! יש לו מספר מזהה שמופיע ממש בטרמינל וקובץ ההרשאות של ה-Tunnel בסיומת JSON. מאד חשוב להעתיק את הנתיב הזה לשלב הבא.

השלב הבא – קובץ קונפיגורציה!

sudo mkdir /etc/cloudflared
sudo nano /etc/cloudflared/config.yml

ואז נכניס לשם את הפרטים – זוכרים את את הנתיב של ה-JSON? אז זה נכנס לפה. ה Tunnel וגם הכתובת שאנו רוצים. במקרה שלי זה היה home.internet-israel.com

tunnel: my-home-server
credentials-file: /YOUR_PATH/<tunnel-ID>.json  # Remember the JSON?

ingress:
  - hostname: home.yourdomain.com
    service: http://localhost:80
  - service: http_status:404

שומרים עם קונטרול x ואז Y. ואז… cloudflared tunnel run my-home-server! אם משהו לא בסדר (למשל טעיתם בקובץ ה-JSON) תקבלו התראה ותצטרכו לתקן. אבל אם הכל עובד אז… תוכלו לראות לוג שרץ.

האתר באוויר! היישר מהרספברי פיי שלי!

דף של Nginx פעיל שיושב ברספברי פיי אבל בכתובת https://home.internet-israel.com/

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

sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

בגדול… כל מה שנשאר לעשות זה לשחק עם האתר ולבנות אותו.

להרוג את ה-Tunnel

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

cloudflared tunnel delete my-home-server

ולמחוק את ה-record של home מה-DNS שלכם.

כמה מילים על אבטחה

בגדול זה פתרון שאמור להיות בטוח, כתובת ה-IP שלנו חשופה מאיראני משוטט או כל האקר או קראקר. אבל אם האתר או השרת שלנו לא מעודכנים – זה אומר שמי שיחדור אליהם יכול גם בתיאוריה להכנס אל הרשת הביתית שלנו. אם למשל בשרת ה-Nginx השארתי RCE פתוח (ראשי תבות של Remote Code Execution – פרצה שתוקף יכול להריץ בה קוד כרצונו בשרת) בגלל באג, אדם יכול להריץ קוד שבודק את מה שיש על המחשב או מנסה לבדוק דברים אחרים ברשת. למרות שה-IP שלנו לא חשוף. נכון, אם השרת מאובטח כמו שצריך לא אמורה להיות בעיה אם מדובר במשחקים ושעשועים או שרת שאנחנו מרימים לקצת זמן לא אמורה להיות בעיה. אבל אם אתם באמת חושבים על הרמת פרודקשן, כדאי מאד לעשות את הצעדים הבאים:

  1. התקנת פיירוול על השרת עצמו. עם רספברי פיי למשל יש לי פוסט שמסביר את זה.
  2. הצבת המכשיר ברשת נפרדת, ב-Vlan או ב-DMZ כלשהו.
  3. הציבו כלי ניטור על הרשת הזו כדי לגלות הפתעות שונות.

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

סיכום

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

פוסטים נוספים שכדאי לקרוא

גלילה לראש העמוד