לינוקס אבונוטו קבלת נתונים משרת מרוחק באמצעות VPN של Fortinet/הרצת תהליך קבוע
-
עלי לקבל ולכתוב נתונים באמצעות HTTP לבקר הנמצא ברשת חיצונית.
עד עכשיו הבקר היה חשוף ישירות לפורט חיצוני אך עתה הם קיבלו הוראה ממערך הסייבר שעליהם לחסום את הפורט הפתוח ולהתחבר באמצעות VPN בלבד.
יש שם Fortinet והם יצרו שם חשבונות VPN.
ולכן הקמתי שרת מיוחד שיחובר ל VPN (חששתי לשבש את פעילות כרטיס הרשת בשרת שלי + לא להיכנס לבעיות אבטחה שהשרת שלי פתוח מקומי אצל לקוח..)
בלינק זה מצאתי הנחיות איך להתקין שירות התחברות ל VPN של Fortinet וזה עובד מצויין.
הבעיה היא שלא מצאתי דרך מובנית בתוכנה לרוץ ברקע, (למען האמת כלל לא מצאתי תיעוד מסודר) למרות שעל פניו כאן מופיע שיש לזה תמיכה שנוספה לזה בהמשך.
ניסיתי לעבוד עם פתרון של הפעלה התהליך עם screen אבל הבעיה היא שכאשר החיבור נותק אין לי משהו שמזהה את זה ומפעיל את הריצה מחדש.
אין לי נסיון בהפעלת שירותים בלינוקס, ולכן אשמח לעזרה איך ניתן להגדיר כשירות שירוץ קבוע ברקע וכן יופעל אוטומטי בהפעלת השרת + יזהה שהחיבור נפל וינסה להתחבר אוטומטית שוב ושוב.
אציין שאני מתחבר מnodejs לקריאה והכתיבה (השרת שלי היוזם והתקשורת חד כיוונית בקשה מהשרת שלי לבקר המרוחק).
אם יש פתרון שהnodejs יתחבר ישירות באמצעות VPN, ו/או ב PHP זה גם יעזור לי.
תודה רבה -
@חוקר כתב בלינוקס אבונוטו קבלת נתונים משרת מרוחק באמצעות VPN של Fortinet/הרצת תהליך קבוע:
אם יש פתרון שהnodejs יתחבר ישירות באמצעות VPN, ו/או ב PHP זה גם יעזור לי.
אני גם חושב שקודם כל תסדוק את זה.
אין לי נסיון בהפעלת שירותים בלינוקס, ולכן אשמח לעזרה איך ניתן להגדיר כשירות שירוץ קבוע ברקע וכן יופעל אוטומטי בהפעלת השרת + יזהה שהחיבור נפל וינסה להתחבר אוטומטית שוב ושוב.
זה מדריך
https://linuxhandbook.com/create-systemd-services/מדריך קצר משלי, אתה יוצר קובץ בנתיב etc/systemd/system/, עם שם שתזכור עם סיומת .service:
sudo nano /etc/systemd/system/your-name-of-service.service
בקובץ אתה שם תוכן כזה, שים לב לחלקים שעליך לשנות לפי הצרכים שלך:
[Unit] Description=Your Description About This Service [Service] WorkingDirectory=/var/www/helloapp ExecStart=/etc/path-to-exec/proccess Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 SyslogIdentifier=short-name-for-logs User=ubuntu [Install] WantedBy=multi-user.target
תוכל להבין כל מקטע בחיפוש במדריך דלעיל או בגוגל של המילה systemd עם המילה, למשל systemd WantedBy.
אחרי שמירת הקובץ, אתה הופך אותו לזמין באמצעות הפקודהsudo systemctl enable your-name-of-service.service
מפעיל אותו:
sudo systemctl start your-name-of-service.service
ובודק את מצבו:
sudo systemctl status your-name-of-service.service
-
@dovid תודה רבה
זה לא היה כ"כ קל, אבל ב"ה בסוף הצלחתי
בעיה אחת הייתה שזה צריך לרוץ על משתמש רוט, נוסיתי להוסיף sudo לפני הפקודה בשורה של ExecStart אך זה הכשיל את הפקודה, ולכן שיניתי שירוץ כ root.
בנוסף, משום מה לא הצלחתי לעבוד בצורה של הגדרת הנתיב של הפעולה בתיקיית המשתמש של אבונטו שם נמצא קובץ התצורה, ולכן הגדרתי נתיב אבסולוטי לקובץ והשמטתי את ההגדרה של WorkingDirectory ורק אז זה עבד לי.
אצטרך לעקוב בעוד 24 שעות שהחיבור תקין ואז אוכל לוודא שזה מופעל מחדש אוטומטי (לבדוק בלוג בהמערכת האם הייתה הפעלה מחדש), בדר"כ עד כה לא היה לי רצף של 24 שעות.
להלן הקוד המלא ששמתי[Unit] Description=Vpn on Fortinet Fot Project 14 After=network.target [Service] #WorkingDirectory=/var/home/ubuntu/ ExecStart=openfortivpn -c /home/ubuntu/openfortivpn.conf Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 SyslogIdentifier=vpn14-log User=root [Install] WantedBy=multi-user.target
-
@dovid תודה, בדיוק הייתי צריך את זה גם
אבל יש לי בעיה, יש לי שורה בקוד שקוראת את התוכן של קובץ מסויים מהתיקייה בשרת
const fileContent = fs.readFileSync(filePath, 'utf-8');
ובשורה הזו הקוד נופל (בדקתי וזה עובד מצוין ללא זה), ובאופן הרגיל זה כן עובד עם זה, מה יכול להיות הבעיה?
ברגיל אני מריץ את זה כמשתמש ubuntu, וככה הגדרתי (גם לי זה עשה כמה שגיאות עד שהצלחתי ללמוד איך להפעיל את זה ב"ה )
[Unit] Description=node app Service [Service] ExecStart=/home/ubuntu/.nvm/versions/node/v14.17.0/bin/node /var/www/node/index.js Restart=always RestartSec=10 SyslogIdentifier=short-name-for-logs User=ubuntu [Install] WantedBy=multi-user.target
-
@מוטי-מן כתב בלינוקס אבונוטו קבלת נתונים משרת מרוחק באמצעות VPN של Fortinet/הרצת תהליך קבוע:
@dovid תודה, בדיוק הייתי צריך את זה גם
אבל יש לי בעיה, יש לי שורה בקוד שקוראת את התוכן של קובץ מסויים מהתיקייה בשרת
const fileContent = fs.readFileSync(filePath, 'utf-8');
ובשורה הזו הקוד נופל (בדקתי וזה עובד מצוין ללא זה), ובאופן הרגיל זה כן עובד עם זה, מה יכול להיות הבעיה?
ברגיל אני מריץ את זה כמשתמש ubuntu, וככה הגדרתי (גם לי זה עשה כמה שגיאות עד שהצלחתי ללמוד איך להפעיל את זה ב"ה )
[Unit] Description=node app Service [Service] ExecStart=/home/ubuntu/.nvm/versions/node/v14.17.0/bin/node /var/www/node/index.js Restart=always RestartSec=10 SyslogIdentifier=short-name-for-logs User=ubuntu [Install] WantedBy=multi-user.target
ה filePath שכתבת, הוא נתיב ביחס לתיקייה או ביחס לכל השרת?
(האם הוא
${filePath}/var/www/node/
או
/${filePath}
)
-
@צבי-ש לא, זה ללא "/" בכלל, זה קובץ שממוקם באותה תיקייה של הindex.js
זה שהשורה שבה זה נופל
if (await licenseVerification(call.values.idUser, call.ApiDID) === true) {
וזה הפונקציה licenseVerification
function licenseVerification(idUser, numberDid) { const filePath = 'authorized_numbers.ini'; const fileContent = fs.readFileSync(filePath, 'utf-8'); const numbersArray = fileContent.split('\n'); if (numbersArray.includes(numberDid)) { return true; } else { return false; } }
-
@מוטי-מן כתב בלינוקס אבונוטו קבלת נתונים משרת מרוחק באמצעות VPN של Fortinet/הרצת תהליך קבוע:
@צבי-ש לא, זה ללא "/" בכלל, זה קובץ שממוקם באותה תיקייה של הindex.js
תנסה לציין לו את הנתיב המלא.
const filePath = '/var/www/node/authorized_numbers.ini';
-
@צבי-ש אבל אז אני יהיה מוגבל למבנה התיקיות הנוכחי..
יש דרך לקבל את התיקייה שבה נמצא קובץ הjs?עריכה: שאלתי את ג'י פי טי, וזה מה שהוא הביא לי, אנסה בהמשך בעז"ה
const path = require('path'); // נקבל את נתיב התיקייה שבה נמצא הקובץ הנוכחי const currentDirectory = __dirname; // נקבל את נתיב התיקייה המלא של קובץ ה-JavaScript const scriptPath = path.join(currentDirectory, 'index.js'); console.log('Current Directory:', currentDirectory); console.log('Script Path:', scriptPath);
-
@מוטי-מן כתב בלינוקס אבונוטו קבלת נתונים משרת מרוחק באמצעות VPN של Fortinet/הרצת תהליך קבוע:
@צבי-ש אבל אז אני יהיה מוגבל למבנה התיקיות הנוכחי..
יש דרך לקבל את התיקייה שבה נמצא קובץ הjs?עריכה: שאלתי את ג'י פי טי, וזה מה שהוא הביא לי, אנסה בהמשך בעז"ה
אני לא זכרתי בע״פ אז חיפשתי בגוגל
״get path in nodejs״
וזה התוצאה הראשונה
https://stackoverflow.com/questions/3133243 -
@מוטי-מן בדיוק בשביל הבעיה הזאת יש את הworkingDirectory. תבדוק אם זה עוזר.
@חוקר הקיצור ~ הוא לא אמיתי, אלא קיצור של הבש (השפה של הטרמינל באובנטו) כמדומני, אם אני זוכר מה ש@yossiz למדני.
כמו"כ הWorkingDirectory צריך להפנות לנתיב מהוחלט שאתה רוצה שייחשב אצל היישום הרץ "תיקיה נוכחית" (לעניין כתובות יחסיות מתוך היישום). -
@מוטי-מן כתב בלינוקס אבונוטו קבלת נתונים משרת מרוחק באמצעות VPN של Fortinet/הרצת תהליך קבוע:
מי אמר שלינוקס זה מסובך?
https://web.mit.edu/~simsong/www/ugh.pdf
מִזְכֶה (קרדיט) ל @yossiz על שהכיר לי את הספר הזה.