Linux iptables การส่งต่อพอร์ต ssh (การปฏิเสธของดาวอังคาร)


12

ฉันมีเกตเวย์ 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

เนื่องจากฉันไม่ได้ใช้ลูปแบ็คสิ่งนี้จะทำให้การปฏิเสธของชาวอังคาร

ฉันยังคงโพสต์คำถามที่นี่ด้วยเหตุผลสองประการ:

  1. ด้วยความหวังว่าคนที่พยายามทำสิ่งที่คล้ายกันในอนาคตอาจพบสิ่งนี้ในการค้นหาของพวกเขาและวิธีแก้ปัญหานี้อาจช่วยพวกเขาได้
  2. ฉันยังคงชอบความคิดในการคงการเชื่อมต่อพอร์ต ssh ของฉันไว้ที่ลูปแบ็คเท่านั้นและสามารถกำหนดเส้นทางให้กับพวกเขาผ่าน iptables ได้ เนื่องจากฉันรู้แน่ชัดว่าแพ็กเก็ตเหล่านี้คืออะไรและกำลังจะไปที่ไหนฉันไม่ควรมีวิธีให้ฉันตั้งค่าสถานะดังกล่าวเพื่อให้ตัวกรอง Linux martian ไม่ปฏิเสธพวกเขา การค้นหาทั้งหมดของฉันในหัวข้อนี้นำไปสู่ ​​rp_filter ซึ่งไม่ได้ช่วยในการทดสอบเลย และแม้ว่ามันจะทำงานได้ แต่ก็ไม่ได้เฉพาะเจาะจงกับแพ็คเก็ตที่แน่นอนที่ฉันพยายามอนุญาต

ฉันสนใจที่จะให้ข้อมูลคำถามและวิธีแก้ปัญหากับการค้นหาทั่วไปเพื่อช่วยคนอื่นชั่วโมงการค้นหาที่ฉันทำเพียงเพื่อหาจุดจบและหวังว่าจะมีคนตอบคำถามลูปแบ็ค / มาร์แทนที่ยังคงเปิดอยู่ ถึงฉัน.


เมื่ออ่านเพิ่มเติมของ Meta โพสต์บน UL vs SF ฉันยังสังเกตเห็นคำขอจาก Michael ที่จะไม่ข้ามทางแยก ฉันเพิ่งโพสต์แบบนี้เพราะมันถูกทำเครื่องหมายเฉพาะหัวข้อที่เอสเอฟดังนั้นถ้ามันเหมาะสมกว่าและเป็นไปได้ที่จะย้ายคำถามดั้งเดิมและปิดคำถามนี้ก็จะดีเช่นกัน
ทำเครื่องหมาย

วาง net.ipv4.conf.default.rp_filter = 0 และ net.ipv4.conf.all.rp_filter = 0 ใน /etc/sysctl.conf ของคุณและทำ "sudo sysctl -p" แก้ปัญหาของคุณหรือไม่
Rui F Ribeiro

ฉันลองใช้ทั้งสองโดยตรงเช่น 'sysctl net.ipv4.conf.default.rp_filter = 0' รวมถึงหนึ่งสำหรับอินเทอร์เฟซส่วนตัวเฉพาะของฉัน ฉันได้ยืนยันแล้วว่าพวกเขาถูกตั้งค่าผ่าน 'sysctl -a' อย่างไรก็ตามแพ็คเก็ตของดาวอังคารถึง 127.0.0.1 ยังคงถูกปฏิเสธ และแม้ว่าสิ่งนี้จะได้ผลการเปิดอินเทอร์เฟซทั้งหมดของฉันให้กับชาวอังคารนั้นไม่ใช่สิ่งที่ฉันต้องการ และฉันยังไม่ต้องการเปิดอินเทอร์เฟซเดียว (albiet ส่วนตัว) ฉันรู้ว่าฉันต้องการอนุญาตให้แพ็กเก็ตบนดาวอังคารดวงไหนและหวังว่าจะได้ iptables NAT / mangle expression เพื่อให้ฉันทำสิ่งนี้สำเร็จ
ทำเครื่องหมาย

คุณอาจต้องการ net.ipv4.conf.default.rp_filter = 2 และกฎ iptables อื่น ๆ
Rui F Ribeiro

คำตอบ:


1

ปัญหาเกี่ยวกับการทำ DNAT เป็น 127.0.0.1,5000 คือเมื่อด้านรีโมตตอบกลับแพ็คเก็ตเหล่านี้กลับเข้าไปในเอ็นจิ้นการจัดเส้นทางราวกับว่าพวกมันมาจากภายในเครื่อง (จาก 127.0.0.1) แต่มีที่อยู่ปลายทางภายนอก SNAT / MASQUERADE ที่ตรงกับอินเทอร์เฟซภายนอกจะจับพวกมันและเขียนใหม่ แต่การตัดสินใจกำหนดเส้นทางที่ต้องทำเพื่อให้แพ็กเก็ตมาถึงอินเตอร์เฟสนั้นมาก่อนและจะไม่อนุญาตแพ็กเก็ตเหล่านี้ซึ่งเป็นการปลอมโดยค่าเริ่มต้น เอ็นจิ้นการกำหนดเส้นทางไม่สามารถรับประกันได้ว่าคุณจะจำได้ว่าต้องเขียนซ้ำในภายหลัง

สิ่งที่คุณควรทำแทนได้คือปฏิเสธการเชื่อมต่อภายนอกใด ๆ กับ 192.168.1.1,5000 ที่ iptables INPUT นอกเหนือจากที่มาจาก 192.168.1.10 โดยใช้!อาร์กิวเมนต์ก่อน-sข้อกำหนดคุณสมบัติของแหล่งที่มา หากคุณใช้การรีเซ็ต TCP เป็นกลไกการปฏิเสธ ( -j REJECT --reject-with tcp-resetแทนที่จะเป็นปลายทาง ICMP เริ่มต้นที่ไม่สามารถเข้าถึงได้) มันจะเหมือนกับสถานการณ์ที่ไม่มีการฟังที่อยู่นั้นส่วนใหญ่: การรวมพอร์ตเท่าที่โลกภายนอกเกี่ยวข้อง


0

ฉันจะใช้ openVPN เพื่อสร้างอุโมงค์จากเราเตอร์ไปยัง RemoteGateway

จากนั้นฉันจะเพิ่มเราเตอร์บนเส้นทาง:

เส้นทางเพิ่ม -host RemoteTarget gw RemoteGateway-VPNaddress

ใช้กฎ iptables ง่าย ๆ ไม่ว่าคุณต้องการ จำกัด พอร์ตใดที่คุณอนุญาตให้ Source เข้าถึง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.