ฉันมีเกตเวย์ Linux ที่ทำงาน NAT สำหรับเครือข่ายในบ้านของฉัน ฉันมีเครือข่ายอื่นที่ฉันต้องการส่งต่อแพ็กเก็ตอย่างโปร่งใส แต่ไปยัง / จาก IP / พอร์ตเฉพาะ (เช่นไม่ใช่ VPN) นี่คือตัวอย่าง IP และพอร์ตที่ใช้งานได้:
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
ฉันต้องการให้เครื่อง Source สามารถพูดคุยกับพอร์ตเฉพาะใน Remote Target ได้ราวกับว่ามันเป็นเส้นทางโดยตรงจากเราเตอร์ บนเราเตอร์ eth0 เป็นเครือข่ายส่วนตัวและ eth1 นั้นเชื่อมต่ออินเทอร์เน็ต Remote Gateway เป็นเครื่องลีนุกซ์ตัวอื่นที่ฉันสามารถเข้าไปได้และสามารถกำหนดเส้นทางไปยัง Remote Target ได้โดยตรง
ความพยายามในการแก้ปัญหาอย่างง่ายของฉันคือการตั้งค่าการส่งต่อพอร์ต ssh บนเราเตอร์เช่น:
ssh -L 5000:192.168.50.50:5000 1.2.3.4
ใช้งานได้ดีกับเราเตอร์ซึ่งตอนนี้สามารถเชื่อมต่อแบบโลคัลกับพอร์ต 5000 ดังนั้น "telnet localhost 5000" จะเชื่อมต่อกับ 192.168.50.50 ต่อ 5000 ตามที่คาดไว้
ตอนนี้ฉันต้องการเปลี่ยนเส้นทางการรับส่งข้อมูลจากแหล่งที่มาและช่องทางผ่านอุโมงค์ ssh ที่สร้างขึ้นในขณะนี้ ฉันพยายามกฎ NAT สำหรับสิ่งนี้:
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
และเนื่องจากเราเตอร์เป็นเกตเวย์ NAT ของฉันอยู่แล้วจึงมีกฎ postrouting ที่จำเป็นอยู่แล้ว:
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
คำถามและคำตอบส่วนใหญ่ในเว็บไซต์นี้หรือที่อื่น ๆ ดูเหมือนว่าจะจัดการกับการส่งต่อพอร์ตของเซิร์ฟเวอร์หรือกิ๊บ NAT ซึ่งทั้งสองอย่างนี้ฉันทำงานได้ดีในที่อื่นไม่ได้นำไปใช้กับสถานการณ์นี้ แน่นอนฉันสามารถ DMZ ส่งต่อพอร์ตเป้าหมายระยะไกลผ่านเกตเวย์ระยะไกล แต่ฉันไม่ต้องการพอร์ตที่เข้าถึงอินเทอร์เน็ตได้ฉันต้องการให้พวกเขาสามารถเข้าถึงได้ผ่านอุโมงค์ SSH ที่ปลอดภัยเท่านั้น
คำตอบที่ดีที่สุดที่ฉันสามารถค้นหาเกี่ยวข้องกับการปฏิเสธตของ Martian ในเคอร์เนล Linux:
iptables จะเปลี่ยนเส้นทางจาก loopback อย่างไร
ฉันได้เปิดใช้งานการบันทึกของ Martians และยืนยันว่าเคอร์เนลปฏิเสธแพ็กเก็ตเหล่านี้ในฐานะ Martians ยกเว้นว่าพวกเขาไม่ได้: ฉันรู้ว่าสิ่งที่แพ็คเก็ตเหล่านี้มีไว้สำหรับที่พวกเขามาจากและที่พวกเขาจะไป (อุโมงค์ ssh ของฉัน)
วิธีแก้ปัญหา "วงเวียน" ที่นำเสนอนั้นใช้ได้กับคำถามเดิมนั้น แต่ไม่ได้ใช้กับกรณีของฉัน
อย่างไรก็ตามในขณะที่เขียน / ค้นคว้าคำถามนี้ฉันได้แก้ไขปัญหาของฉันโดยใช้การผูกแหล่งที่มา IP SSH ดังนี้:
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
เนื่องจากฉันไม่ได้ใช้ลูปแบ็คสิ่งนี้จะทำให้การปฏิเสธของชาวอังคาร
ฉันยังคงโพสต์คำถามที่นี่ด้วยเหตุผลสองประการ:
- ด้วยความหวังว่าคนที่พยายามทำสิ่งที่คล้ายกันในอนาคตอาจพบสิ่งนี้ในการค้นหาของพวกเขาและวิธีแก้ปัญหานี้อาจช่วยพวกเขาได้
- ฉันยังคงชอบความคิดในการคงการเชื่อมต่อพอร์ต ssh ของฉันไว้ที่ลูปแบ็คเท่านั้นและสามารถกำหนดเส้นทางให้กับพวกเขาผ่าน iptables ได้ เนื่องจากฉันรู้แน่ชัดว่าแพ็กเก็ตเหล่านี้คืออะไรและกำลังจะไปที่ไหนฉันไม่ควรมีวิธีให้ฉันตั้งค่าสถานะดังกล่าวเพื่อให้ตัวกรอง Linux martian ไม่ปฏิเสธพวกเขา การค้นหาทั้งหมดของฉันในหัวข้อนี้นำไปสู่ rp_filter ซึ่งไม่ได้ช่วยในการทดสอบเลย และแม้ว่ามันจะทำงานได้ แต่ก็ไม่ได้เฉพาะเจาะจงกับแพ็คเก็ตที่แน่นอนที่ฉันพยายามอนุญาต
ฉันสนใจที่จะให้ข้อมูลคำถามและวิธีแก้ปัญหากับการค้นหาทั่วไปเพื่อช่วยคนอื่นชั่วโมงการค้นหาที่ฉันทำเพียงเพื่อหาจุดจบและหวังว่าจะมีคนตอบคำถามลูปแบ็ค / มาร์แทนที่ยังคงเปิดอยู่ ถึงฉัน.