משהו נפוץ מאוד בניהול שרתים הוא הפניית תעבורה מחדש.
נניח שיש לנו שרת עם שירותים מסוימים הפועלים, אך מכל סיבה שהיא אנו משנים אחד משירותים אלה (אני לא יודע, למשל pop3 שהוא יציאה 110) לשרת אחר. הדבר הרגיל והנפוץ ביותר יהיה פשוט לשנות את ה- IP ברשומת ה- DNS, אולם אם מישהו משתמש ב- IP במקום בתת-הדומיין זה יושפע.
מה לעשות? ... פשוט, הפנה את התעבורה שהשרת מקבל דרך יציאה זו לשרת אחר עם אותו יציאה.
כיצד נתחיל להפנות מחדש את התנועה?
הדבר הראשון הוא שבוודאי אפשרנו את ה- העברה בשרת, לשם כך אנו שמים את הדברים הבאים:
echo "1" > /proc/sys/net/ipv4/ip_forward
אתה יכול גם להשתמש בפקודה אחרת זו, במקרה שהקודמת לא עובדת עבורך (זה קרה לי ככה ב- CentOS):
sysctl net.ipv4.ip_forward=1
ואז נפעיל מחדש את הרשת:
service networking restart
בהפצות סל"ד כמו CentOS ואחרות, זה יהיה:
service nertwork restart
עכשיו נעבור לדבר החשוב, נגיד לשרת דרך iptables מה להפנות:
iptables -t nat -A PREROUTING -p tcp --dport <puerto receptor> -j DNAT --to-destination <ip final>:<puerto de ip final>
במילים אחרות, ובעקבות הדוגמה שהזכרתי, נניח שאנחנו רוצים להפנות את כל התעבורה שהשרת שלנו מקבל דרך יציאה 110 לשרת אחר (למשל: 10.10.0.2), שעדיין יקבלו את התנועה דרך 110 (זה אותו שירות):
iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 10.10.0.2:110
השרת 10.10.0.2 יראה שכל החבילות או הבקשות מגיעות מ- IP של הלקוח, למקרה שהם רוצים לשחות את הבקשות, כלומר שהשרת השני יראה שהבקשות מגיעות עם ה- IP של השרת הראשון (וב אשר אנו מיישמים את ההפניה מחדש), יהיה זה גם לשים את השורה השנייה הזו:
iptables -t nat -A POSTROUTING -j MASQUERADE
כמה שאלות ותשובות
בדוגמה השתמשתי באותו יציאה בשתי הפעמים (110), אולם הם יכולים להפנות תנועה מנמל אחד לאחר ללא בעיות. לדוגמא, נניח שאני רוצה להפנות תנועה מיציאה 80 ל- 443 בשרת אחר, בשביל זה זה יהיה:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.0.2:443
זהו iptables, הם יכולים להשתמש בכל שאר הפרמטרים שאנו מכירים, למשל, אם אנו רוצים להפנות רק תנועה מ- IP ספציפי, זה יהיה על ידי הוספת- s ... לדוגמא אני ינתב רק את התנועה שמגיעה מ 10.10.0.51:
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.51 --dport 80 -j DNAT --to-destination 10.10.0.2:443
או רשת שלמה (/ 24):
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.0/24 --dport 80 -j DNAT --to-destination 10.10.0.2:443
אנו יכולים גם לציין את ממשק הרשת עם -i :
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 10.10.0.2:443
הסוף!
זה כפי שכבר אמרתי, הוא iptables, אתה יכול ליישם את מה שכבר ידוע כדי שהשרת יעשה בדיוק את מה שאתה רוצה שיעשה 😉
ברכות!
20 תגובות, השאר את שלך
אנחנו יכולים לעשות זאת גם מחומת אש המאפשרת העברת יציאות, נכון? (החלת הכללים המתאימים).
כן כמובן, בסופו של דבר חומת אש כמו Pfsense או אחרים, השתמשו ב- iptables מאחור.
ליתר דיוק, pfsense לא משתמשת ב- iptables אלא ב- pf, זכור שמדובר ב- bsd בפנים.
אה נכון, רע שלי!
תודה רבה על הטיפ 🙂
יש לי כמה ספקות:
1 - האם השינוי הוא קבוע? או שהוא אבוד בעת הפעלת השרת מחדש?
2 - יש לי מספר מקרים (נניח A, B ו- C) באותה רשת משנה. למשל A אני מיישם את הכלל לניתוב תעבורה ל- IP חיצוני, ובדיקה עם תלתלים ממופעים B ו- C, הכל עושה פלאים. הבעיה היא שממופע A זה לא עובד. ניסיתי להשתמש גם ב- ip שלך וגם בממשק loopback, ואף אחד מהם לא עובד:
$ iptables -t nat -A PREROUTING -p tcp -port 8080 -j DNAT-ליעד xxxx: 8080
$ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT – ליעד xxxx: 8080
$ curl ip-yyyy: 8080 / hello_world
תלתל: (7) ההתחברות ליציאת ip-yyyy 8080 נכשלה: החיבור נדחה
$ curl localhost: 8080 / hello_world
תלתל: (7) ההתחברות ליציאת localhost 8080 נכשלה: החיבור נדחה
יש לך מושג מה הבעיה?
כן, השינוי אבד בעת אתחול מחדש, יהיה עליכם להשתמש ב- iptables-save & iptables-שחזור או משהו כזה כדי להימנע מכך.
לא ממש הבנתי מה אתה רוצה לעשות, למשל A?
יש לי שרת שתומך רק בחיבורים מ ip מסוים (שרתים A), אני לא יכול או רוצה להוסיף עוד ips לרשימת ההיתרים (לבעיות מדרגיות), אז אני רוצה שכל התעבורה לשרת החיצוני תעבור אמר השרת (A).
לעניין המעשי, יש לי תצורות גלובליות המגדירות באיזו IP להשתמש לכל שירות, כך שבמקרה זה זה משהו כמו "כל מי שרוצה להשתמש בשירות החיצוני חייב להשתמש ב- IP A"
זה הושג בהצלחה באמצעות השיטה במאמר זה, אך אני נתקל בבעיה שכאשר מיישמים אותו, שרת A אינו יכול לגשת לשירות באמצעות ip משלו (אך כל השרתים האחרים כן).
עד כה הטוב ביותר שמצאתי היה להוסיף את המיפוי בקובץ השרת / A / etc / hosts, כשהוא מצביע על ה- IP החיצוני, מבטל את ההגדרה הגלובלית.
טוב מאוד, אם יש לי שרת דואר אחר, אוכל להעביר את התנועה מיציאה 143 משרת 1 לשרת 2 והדואר האלקטרוני יגיע לשרת 2, נכון?
לגבי
בתיאוריה כן, זה עובד ככה. בטח, עליך להתקין כראוי את שרת הדואר בשרת 2 🙂
סוג הפוסטים שאנחנו אוהבים לקרוא, תודה!
מאמר מצוין, יש לי פרויקט בו אני עובד ורציתי לשאול אותך שאלה, ישנם מתגים תעשייתיים עם פונקציית NAT (אני מניח שהם משתמשים בטבלאות IP בהמשך), לתרגם כתובת IP מבלי לבצע שינויים בציוד, לדוגמא, יש לי שרת 10.10.2.1 המתקשר עם מחשבי 10.10.2.X ודרך המתג מתוכנת כך שמחשב שיש לו כתובת 192.168.2.4 נראה למעשה מהשרת כ- 10.10.2.5, זה תרגם את כתובת ה- IP שנראית מהמחשבים האחרים עם כתובת זו, אני רוצה לעשות זאת משרת עם אובונטו או הפצה אחרת, מה יהיו כללי ה- iptables?
מידע טוב מאוד תודה ^ _ ^
צָהֳרַיִים טוֹבִים.
יש לי בעיה לנסות לבצע הפניה מחדש. אני מסביר:
יש לי שרת פרוקסי באובונטו, עם שני כרטיסי רשת:
eth0 = 192.168.1.1 מחובר לשאר הרשת המקומית.
eth1 = 192.168.2.2 מחובר לנתב.
אני זקוק לכל מה שמגיע דרך eth0 כדי לעבור דרך eth1, וגם דרך ה- proxy (אני משתמש ב- Squid, שהיציאה המוגדרת כברירת מחדל היא 3128), ואני לא מוצא את המפתח בתצורת IPTABLES.
אני לא זקוק להגבלה מכל סוג שהוא, אלא רק שרשומה תישאר ביומן כתובות האינטרנט שבהן ביקרת.
אני מקווה שתוכלו לעזור לי מכיוון שזו משימה מסורבלת למדי שמדאיגה אותי כבר כמה ימים.
תודה.
חבר, אני מאוד חדש בשרתים אחרים, אין לי מושג אבל אני מבין את הנושא ואני לומד במהירות, השאלה שלי היא הבאה שיש לי 2 שרתים serv_1 ו- serv_2 שחיברתי לאותו אינטראנט, בשרתים האלה יש לי הגדרת מטבע עצמי, ברצוני לעשות את הפעולות הבאות:
כי טווח מסוים של ips למשל rangeip_1 בעת הצבת ip גישה ל- owncloud (ipowncloud) מופנה כלפי serv_1 ואם מדובר בטווח אחר rangeip_2 ממוקם אותו ipowncloud מופנה ל serv_2, זאת על מנת שני השרתים ממוקמים בשתי ערים שונות וטווחי ה- IP שונים אך כולם באותה רשת, זה יהיה החלק הראשון, השני יהיה ברור לסנכרן את שני השרתים האלה כך שהם יהיו מראות או שיעצו לי זאת בכדי לייעל את הרוחב הלהקה, בבקשה, אם אתה מתכוון להסביר לי איך לעשות זאת צעד אחר צעד לא למתכנת סופר = =
שלום, תסלח לי, יש לי מתג שאחראי על התקשורת של כל המכשירים שמרכיבים את הרשת שלי, ואחרי זה חומת אש ולבסוף יציאת האינטרנט, מה שקורה זה שהייתי רוצה שניתנה ההפניה מחדש ב לעבור ולא צריך להגיע לחומת האש אלא אם כן השירות המבוקש הוא אינטרנט.
באמצעות שיטה זו תוכל להפנות מחדש את HTTPS ל- HTTP?
היי, אולי זה קצת מאוחר, אבל רציתי לשאול אותך, כיצד עלי לגרום ל Squid שלא לשנות את ה- IP של הלקוח כשאני רוצה להתחבר לשרת אינטרנט באותה רשת?
אל תתייחס אליי כשאני מבקש. האם ניתן לעשות זאת ב- Windows?
מידע זה היה שימושי עבורי. כמו תמיד, אפשר לסמוך עלכם, כשאני לא מוצא משהו באנגלית אני בדרך כלל מסתכל בספרדית, באותם הזדמנויות כמעט תמיד אני מגיע לאתר הזה. תודה.
יש לי נתב 4G שהוא לקוח של רשת שאני לא מנהל (כמובן, אני לקוח)... הנתב הזה הוא שער לרשת המרוחקת הזו דרך OpenVPN. בנוסף, הנתב האמור ממלא את הפונקציה של העברת פורטים לגישה ליציאה 80 של השרת של אחת מאותן תת-רשתות בשטח.
זו הייתה ההצהרה שעלי להכניס לנתב בתור כלל מותאם אישית של חומת האש «-t nat -A POSTROUTING -j MASQUERADE»
תודה על העזרה!