שאלה איך אני יכול לצאת קדימה עם iptables?


אני רוצה חיבורים נכנסים על ppp0 בנמל 8001 להיות מנותב ל 192.168.1.200 על eth0 בנמל 8080.

יש לי שני הכללים האלה

-A PREROUTING  -p tcp -m tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

וזה לא עובד. מה אני מפספס?


110
2017-12-05 21:06




NAT HOWTO - Paul Tomblin
אני הולך עם N-p-r תג (למרות זאת יכול להיות קשור לתכנות, אם כי ניסוח גרוע כמובן.) - Mihai Limbăşan
מה דעתך על זה: אני מתכנת מנסה להקים סביבה, כך אני יכול לאתר באגים את יישום השרת שלי ליקוי הליקוי נקרא מן הפנימי. מספיק קרוב?
בטח, זה מה שהתכוונתי על ידי "ניסוח גרוע" ... אתה יכול לערוך את השאלה בהתאם? - Mihai Limbăşan


תשובות:


קודם כל - אתה צריך לבדוק אם העברת מותר בכלל:

cat /proc/sys/net/ipv4/conf/ppp0/forwarding 
cat /proc/sys/net/ipv4/conf/eth0/forwarding 

אם שניהם מחזירים 1 זה בסדר. אם לא תעשה את הפעולות הבאות:

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

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

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

שני הכללים מוחלים רק על תעבורת TCP (אם אתה רוצה לשנות גם UDP, אתה צריך לספק כללים דומים אבל עם -p udp אפשרות להגדיר).

אחרון, אבל לא פחות הוא תצורת ניתוב. IT

ip route

ובדוק אם 192.168.1.0/24 הוא בין החזרות ניתוב ערכים.


91
2018-03-24 11:24



אני אישית מעדיף את sysctl תחביר כמו sysctl net.ipv4.conf.eth0.forwarding=1 - Doud
כיצד ניתן להסיר את הכלל שהוזן בצורה שגויה? - Nickolai Leschov
השורה השנייה: "iptables -A FORWARD-p tcp-d 192.168.1.2006 - dport 8080 -m state -state חדש, שהוקם, קשור- JJPT" אינו נדרש אם אין לך הגבלות חומת אש / אבטחה, אשר הוא המקרה עם רוב LANs הביתה, אחרת להיות זהירים עם -A, להיות סיבה זה יוסיף את זה אחרי הגבלות / אבטחה ולא יכול לעבוד (כדי לבדוק - במקום זאת, זה מוסיף בחזית הכללים iptables) - THESorcerer
@ ÁronLőrincz, לא. כללים Iptables הם נדיפים אלא אם כן נטען במפורש בעת אתחול. - sherrellbc
@ ניקולאי Leschov, להזין אותו החלפת -A עם -D - Alexei Martianov


אני חושב שמה שאתה רוצה זה:

iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state 
    NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination
    192.168.1.200:8080

14
2017-12-05 21:43



ummm ... זה מה שכבר יש לי. אני משתמש iptables- לשחזר לטעון אותו כל כך הוא בסעיף משלה, אבל זה מה שכתבתי לעיל.
אוקיי, התחביר נראה רע במקור. האם ניסית את הכללים? מה הבעיה בדיוק? - Robert Gamble


שכחת את כתובת המקור SNAT 'ing:

sysctl net.ipv4.ip_forward=1
yours_wan_ip=101.23.3.1
-A PREROUTING  -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

ואל תשכחו להגדיר את חומת האש של לינוקס כשער ברירת המחדל במחשב עם כתובת 192.168.1.200.


12
2018-06-09 11:09



יש לך את זה בחזרה על POSTROUNTING שלב. בשלב זה השיחה עדיין על --destination ולא --source. - sherrellbc


יצרתי את התסריט הבאש הבא עבור עושה את זה על הנתב לינוקס שלי. זה באופן אוטומטי infers את ה- IP WAN ומאשר את הבחירות שלך לפני שתמשיך.

#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# figure out our WAN ip
wan_addr=`curl -4 -s icanhazip.com`

# auto fill our dest lan port if we need to
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# print info for review
echo "Destination LAN Address: $dest_addr_lan"
echo "Destination Port WAN: $dest_port_wan"
echo "Destination Port LAN: $dest_port_lan"
echo "WAN Address: $wan_addr"

# confirm with user
read -p "Does everything look correct? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
  if [[ "remove" == "$action" ]]; then
    iptables -t nat -D PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport     $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule removed"
  else
    iptables -t nat -A PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule added"
  fi
else
  echo "Info not confirmed, exiting..."
fi

השימוש בסקריפט הוא פשוט פשוט להעתיק ולהדביק אותו לקובץ ולאחר מכן.

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

כדי להסיר את אותו כלל

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

חשבתי שזה עשוי לחסוך זמן מישהו על הנתב בהתאמה.


5
2017-12-14 22:02





נסה

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

קבצים אלה אומרים את הקרנל זה מותר להעביר מנות בין ממשקים.


1
2017-12-10 02:58





היה לי את המשימה להפוך את MACHINE_A לחשוב כי השירות פועל פיזית על MACHINE_B, אבל באופן שקוף מחדש התוואי כל בקשות MACHINE_C.

הטריק היה להשתמש MASQUERADE.

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C

iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE

שים לב שאולי תרצה לצבוט את הפקודות:

  1. כדי לאפשר העברת מנות על ממשק ספציפי בלבד. לדוגמה:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. כדי לאפשר לא רק MACHINE_A, אלא גם כל האחרים להשתמש בהעברת יציאות, הסר:

    -s MACHINE_A
    

1
2018-03-17 09:02





פקודה זו לא עובדת בשבילי:

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

יש לי 2 ממשקי LAN ו- FORWARD עבודה כאשר אני אכתוב:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • ממשק LAN_IFF - LAN (לדוגמה, eth1, br0 ...)
  • FW_PORD - ported port (על מארח המארח)
  • LAN_IP - כתובת IP על ממשק LAN (על הנתב)

PREROUTING ו FORWARD הם הכרחיים מדי, כמובן :)


0
2018-05-24 12:04