IPTables - พอร์ตไปยัง ip & พอร์ตอื่น (จากด้านใน)


10

ขณะนี้ฉันมีกล่อง NAS ที่ทำงานภายใต้พอร์ต 80 ในการเข้าถึง NAS จากภายนอกฉันได้แมปพอร์ต 8080 กับพอร์ต 80 บน NAS ดังต่อไปนี้:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.32.25.2:80

มันใช้งานได้อย่างมีเสน่ห์ อย่างไรก็ตามสิ่งนี้ใช้ได้เฉพาะเมื่อฉันเข้าถึงเว็บไซต์จากนอกเครือข่าย (ที่ทำงานที่บ้านที่แตกต่างกัน ฯลฯ ) ดังนั้นเมื่อฉันพิมพ์mywebsite.com:8080, IPTables ทำงานได้อย่างถูกต้องและทุกอย่างทำงานได้ดี

ตอนนี้ปัญหาที่ฉันมีคือฉันจะเปลี่ยนเส้นทางพอร์ตนี้จากภายในเครือข่ายได้อย่างไร ชื่อโดเมนของฉันmywebsite.comชี้ไปที่เราเตอร์ของฉัน (เซิร์ฟเวอร์ linux ของฉัน) จากด้านใน (10.32.25.1) แต่ฉันต้องการเปลี่ยนเส้นทางพอร์ต 8080 ไปยังพอร์ต 80 บน 10.32.25.2 จากด้านใน

เบาะแสใด ๆ

แก้ไข # 1

ความพยายามที่จะช่วยอำนวยความสะดวกให้กับคำถามนี้ฉันได้รวบรวมแผนภาพนี้ไว้ด้วยกัน โปรดอัปเดตหากไม่ถูกต้องหรือแสดงสิ่งที่คุณต้องการอย่างผิด ๆ

                                 iptables
                                     |                   .---------------.
    .-,(  ),-.                       v               port 80             |
 .-(          )-.        port 8080________               |               |
(    internet    )------------>[_...__...°]------------->|      NAS      |
 '-(          ).-'     10.32.25.2    ^   10.32.25.1      |               |
     '-.( ).-'                       |                   |               |
                                     |                   '---------------'
                                     |
                                     |
                                   __  _ 
                                  [__]|=|
                                  /::/|_|

@slm แน่นอน ไม่มีสิ่งใดเกิดขึ้นใน 10.32.25.2:8080 เนื่องจากเซิร์ฟเวอร์อยู่ที่พอร์ต 80 จากภายนอก NAT จะเปลี่ยนเส้นทางจากพอร์ต 8080 ไปยังพอร์ต 80 บน IP ที่ระบุ (10.32.25.2) NET -> NAT: 8080 -> 10.32.25.2:80 ฉันต้องการกฎจากข้างในและฉันไม่รู้ว่าต้องใส่อะไร
David Bélanger

@slm ใช่ ฉันไม่รู้ว่าฉันจะประสบความสำเร็จได้อย่างไร ผมอยากจะบอกการเปลี่ยนเส้นทางไปยัง10.32.25.1:8080 10.32.25.2:80กฎของฉันด้านบนใช้งานได้จากภายนอก แต่ไม่ใช่จากภายในเครือข่ายของฉัน ดังนั้นถ้าฉันอยู่ที่สำนักงานฉันสามารถเข้าถึง NAS ของฉันได้จากwebsite.com:8080และมันโปร่งใสอย่างสมบูรณ์ จากบ้านของฉัน website.com:8080 ชี้ไปที่ 10.32.25.1 เนื่องจากเป็นเราเตอร์เซิร์ฟเวอร์ Linux ของเรา ฉันต้องการเปลี่ยนเส้นทางพอร์ต 8080 ไปยัง NAS ด้วยบนพอร์ต 80 แต่อีกครั้งอย่างโปร่งใส
David Bélanger

@slm ใช่ทุกอย่างเรียบร้อยดีและใช้งานได้ ฉันแค่ต้องการเปลี่ยนเส้นทางพอร์ต 10.32.25.1:8080 ถึง 10.32.25.2:80 จากเครือข่ายภายใน
David Bélanger

ยังพูดถึงอินเทอร์เฟซเช่นeth0 10.32.25.2เพื่อให้เราสามารถเขียน iptables ใช้ขึ้นอยู่กับอินเทอร์เฟซขาเข้า
Rahul Patil

ขออภัยที่ฉันเพิ่งเห็น .. คุณแก้ปัญหาได้แล้ว ..
ราหุลปาติล

คำตอบ:


13

ในที่สุดฉันก็พบวิธีการ ก่อนอื่นฉันต้องเพิ่ม-i eth1กฎ "ภายนอก" (eth1 คือการเชื่อมต่อ WAN ของฉัน) ฉันต้องเพิ่มกฎอีกสองข้อ ในที่สุดสิ่งที่ฉันมาพร้อมกับ:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A POSTROUTING -p tcp -d 10.32.25.2 --dport 80 -j MASQUERADE

2
ไม่จำเป็นต้องใช้กฎที่สองเนื่องจากกฎข้อแรกมีแล้ว ...
machineaddict

1
กฎข้อแรก จำกัด การกำหนดเส้นทางล่วงหน้าเฉพาะเมื่อมีการมาถึงบนอินเตอร์เฟส eth1 กฎข้อที่สองนั้นมีความทั่วไปมากกว่าเนื่องจากมันใช้กับอินเตอร์เฟสทั้งหมด ระวังลูป!
tu-Reinstate Monica-dor duh

4

คุณลืมที่จะพูดถึงว่าควรเปิดใช้การส่งต่อแพคเกจเพื่อให้สามารถดำเนินการ NAT ปลายทางได้ โดยปกติจะปิดอยู่ดังนั้นกฎ iptables จะไม่ทำงาน มันสามารถเปิดใช้งานโดยการออก:

echo 1 > /proc/sys/net/ipv4/ip_forward

ขอบคุณมากสำหรับสิ่งนี้ฉันจะดึงผมออกมาหลายชั่วโมง!
ColinM

3

ก่อนอื่นให้ส่งต่อด้วย

echo 1 > /proc/sys/net/ipv4/ip_forward

จากนั้นตั้งค่ากฎ iptable ด้วย

IF=eth1
PORT_FROM=8080
PORT_TO=80
DEST=10.32.25.2
iptables -t nat -A PREROUTING -i $IF -p tcp --dport $PORT_FROM -j DNAT --to $DEST:$PORT_TO
iptables -t nat -A POSTROUTING -p tcp -d $DEST --dport $PORT_TO -j MASQUERADE

คุณสามารถใส่บรรทัดเหล่านี้เป็น/etc/rc.localตัวอย่างได้ หมายเหตุ: เนื่องจาก Debian jessie ทำให้สามารถเรียกใช้และเปิดใช้งานบริการ rc.local ผ่าน

systemctl enable rc-local.service

0

ก่อนอื่นคุณต้องยืนยันว่าคุณเปิดใช้งานการส่งต่อ:

cat /proc/sys/net/ipv4/ip_forward

ถ้าไม่ได้วิ่ง1echo 1 > /proc/sys/net/ipv4/ip_forward

หากคุณต้องการรับส่งข้อมูลปริมาณการรับส่งข้อมูล 10.32.25.1 บนพอร์ต 80 และ 443 จะถูกส่งต่อไปยัง 80 พอร์ตของ 10.32.25.2 คุณควรใช้กฎด้านล่าง:

iptables -t nat -A PREROUTING -d 10.32.25.1 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.32.25.2:80
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.