Score:0

วิธีป้องกันไม่ให้ netfilter เปลี่ยนพอร์ตต้นทางโดยอัตโนมัติ

ฉันสังเกตเห็นว่า netfilter เปลี่ยนพอร์ตต้นทางเมื่อมีการสร้างการเชื่อมต่อในโมดูล conntrack ฉันต้องป้องกันพฤติกรรมนี้

นี่คือสิ่งที่ฉันทำเพื่อจำลองปัญหาของฉัน:

  1. ฉันสร้างกฎ netfilter ที่จะดำเนินการ DNAT จากพอร์ต 2002 ถึง 2003

sudo iptables -w -t nat -A OUTPUT -s 192.168.30.3 -d 192.168.30.1 -p udp --sport 2001 --dport 2002 -j DNAT --to-destination :2003

  1. ฉันจึงสร้างรายการ conntrack เพื่อจำลองการเชื่อมต่อจาก 192.168.30.1:2001 (คอมพิวเตอร์ของฉัน) เป็น 192.168.30.1:2003

sudo /sbin/conntrack -I -s 192.168.30.1 -d 192.168.30.3 -p udp --sport 2003 --dport 2001 --timeout 100000

  1. ในที่สุด ฉันทำการเชื่อมต่อกับ 192.168.30.1:2002 จากคอมพิวเตอร์ของฉันด้วยพอร์ตต้นทาง 2001:

sudo nc -u -p 2544 192.168.30.1 2545

เนื่องจากกฎ netfilter DNAT ฉันคาดหวังแพ็กเก็ตเอาต์พุตที่มีพอร์ตปลายทาง 2003 และพอร์ตต้นทาง 2001 อย่างไรก็ตาม บน wireshark ฉันสังเกตว่าพอร์ตต้นทางเปลี่ยนเป็นตัวเลขสุ่ม ฉันเดาว่าเป็นเพราะคอมพิวเตอร์ของฉันคิดว่ามีการเชื่อมต่ออยู่บนพอร์ต 2001 (เนื่องจากรายการ conntrack) จากนั้นป้องกันไม่ให้พอร์ตต้นทางเป็น 2001 (ใช่ไหม) แต่ฉันไม่ต้องการพฤติกรรมนี้? ฉันจะบังคับใช้หมายเลขพอร์ต 2001 ได้อย่างไร

Tom Yan avatar
in flag
ฉันไม่คิดว่าสิ่งนี้เกี่ยวข้องกับ DNAT หรือ netfilter แต่เป็นเพียงพฤติกรรมของ `nc`
sebastien dontneedtoknowthat avatar
ฉันค่อนข้างมั่นใจว่าไม่ใช่พฤติกรรมของ `nc` (อย่างน้อยเพราะแพ็กเก็ตของฉันเข้าถึงกฎ DNAT ของฉันด้วยพอร์ตต้นทางเดิม )
Score:0
ธง cl
A.B

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

สำหรับตัวอย่างเฉพาะของคุณ ต่อไปนี้เป็นกฎเฉพาะที่จะป้องกันการชนกัน และป้องกันการเขียนพอร์ตต้นทางใหม่:

iptables -t raw -A OUTPUT -s 192.168.30.3 -d 192.168.30.1 -p udp --sport 2001 --dport 2002 -j CT --zone-orig 1

โดยปกติขึ้นอยู่กับกรณีการใช้งาน จะใช้ตัวเลือกที่เหมาะสมกว่า มักใช้ในห่วงโซ่ PREROUTING โดยมีอินเทอร์เฟซขาเข้าเป็น Selector เมื่อกำหนดเส้นทาง และมักเชื่อมโยงกับค่าเครื่องหมาย ดังนั้นการกำหนดเส้นทางอาจได้รับผลกระทบด้วย


กรณีการใช้งานดั้งเดิมที่ทำให้ตัวเลือกนี้ปรากฏขึ้นคือเมื่อ คอนแทรค บนสแตกเครือข่ายเดียวกัน (ไม่มีเนมสเปซเครือข่ายเพิ่มเติม) ที่มีการตั้งค่าการกำหนดเส้นทางที่ซับซ้อน (เช่น: การกำหนดเส้นทางระหว่าง LAN ส่วนตัวที่แตกต่างกัน 4 แห่งโดยใช้ที่อยู่ IP เดียวกัน เช่น ระหว่าง 192.168.1.0/24 eth0 <-> eth1 10.1.0.0/24 และ อีกครั้ง 192.168.1.0/24 eth2 <-> 10.1.0.0/24 eth3) สามารถเห็นสองโฟลว์ที่ไม่เกี่ยวข้องซึ่งมีที่อยู่/พอร์ตเดียวกัน เนื่องจาก เน็ตฟิลเตอร์ และ คอนแทรค ไม่รู้อะไรเลยเกี่ยวกับการกำหนดเส้นทาง (the คอนแทรค ตารางการค้นหามีเฉพาะแอดเดรส) จะต้องได้รับการสอนให้พิจารณาโฟลว์เหล่านี้แยกกันโดยการเพิ่มคุณสมบัติโซนที่เชื่อมโยงกับโทโพโลยีการกำหนดเส้นทางด้วยตนเองใน คอนแทรค ตารางการค้นหา

(นี่คือ ลิงค์ LWN เมื่อมีการเสนอคุณลักษณะนี้ในตอนแรก)

Score:0
ธง in

NAT เปลี่ยนพอร์ตต้นทางเพื่อลดความเสี่ยงของความขัดแย้งของพอร์ต จะเกิดอะไรขึ้นหาก sport 2002 นั้นไม่ว่างในเครื่อง NAT

หากคุณมีข้อกำหนดเฉพาะสำหรับพอร์ตเฉพาะ คุณสามารถเพิ่มเฉพาะได้ สแนท กฎสำหรับสิ่งนั้น แต่อีกครั้ง จะเกิดอะไรขึ้นหากไคลเอ็นต์ภายในหลายเครื่องพยายามใช้พอร์ตต้นทางเดียวกัน

เราควรกลับไปรับทราบว่า NAT เป็นแฮ็คที่สร้างขึ้นเพื่อลดปัญหาการขาดที่อยู่ IP สาธารณะ การแก้ไขที่แท้จริงคือการให้ทุกคนมี IP สาธารณะที่ไม่ใช่ NAT

เมื่อพูดถึง NAT ในทุกวันนี้ เรามักหมายถึงที่อยู่ IP ส่วนตัวที่อยู่หลัง IP เดียว ในกรณีเหล่านี้ จริงๆ แล้วก็คือ แนปคำถามที่คล้ายกันที่เกี่ยวข้องกับสิ่งนั้นฉันกำลังคิดเกี่ยวกับ สวมหน้ากาก เป้าหมายและไม่ ดีเอ็นเอท

Tom Yan avatar
in flag
ไม่มีทางที่ DNAT จะทำให้พอร์ตต้นทางเปลี่ยนแปลง (ไม่ใช่สำหรับทราฟฟิก *ดั้งเดิม*) เพราะนั่นหมายความว่าเป็นการบอกเป็นนัยถึง SNAT หากทำเช่นนั้น แสดงว่า SNAT ที่คุณแนะนำ/ร้องขอโดยผู้ใช้ให้เป็น SNAT "ครั้งที่สอง" ซึ่งไม่สมเหตุสมผลเลย (กับ *หนึ่ง* "เครื่อง NAT") อย่าลืมว่า SNAT ทุกตัวต้องการ "reverse DNAT" สำหรับการตอบกลับ เรื่องราวที่คุณกำลังเล่าในที่นี้เกี่ยวกับ SNAT แต่คุณแนะนำ SNAT เป็นวิธีแก้ปัญหา (หรือวิธีแก้ไข อะไรก็ตาม)
in flag
หากคุณทำ NAT การผสานแพ็กเก็ตทั้งหมดจะเสร็จสิ้นตามต้องการ แม้ว่าคุณจะตั้งใจสำหรับ DNAT หรือ SNAT เท่านั้น
Score:0
ธง in

เพื่อให้ DNAT ทำงาน (ในแง่ที่ว่า เพื่อให้โปรแกรมสามารถจดจำการตอบกลับได้) ให้ "reverse NAT" ที่เปลี่ยนพอร์ตต้นทางของการตอบกลับทราฟฟิกจาก 192.168.30.1 (ถึง 192.168.30.3:2001) จาก 2003 ถึง 2002 จะต้องดำเนินการ

อย่างไรก็ตามเมื่อมีการจราจรมาจาก 192.168.30.1:2003 ถึง 192.168.30.3:2001 จากมุมมองของ conntrack ไม่ได้เป็นผลมาจาก DNAT (เนื่องจากตามรายการ conntrack ที่สร้างขึ้น โฮสต์ไม่ใช่โฮสต์ที่เริ่มต้นการเชื่อมต่อ) NAT แบบย้อนกลับจะไม่เหมาะสม

ดังนั้น netfilter จึง "ถูกบังคับ" ให้ดำเนินการ SNAT สำหรับการรับส่งข้อมูลที่ตรงกับกฎ DNAT เพื่อให้สามารถแยกความแตกต่างของการรับส่งข้อมูลตอบกลับ (ซึ่งมาจาก 192.168.30.1:2003) โดยปลายทาง 192.168.30.3:$สุ่ม.

ฉันถือว่า netfilter จะทำการย้อนกลับ NAT สำหรับ DNAT (ซึ่งเป็น SNAT) ก่อนที่จะย้อนกลับ NAT สำหรับ SNAT (ซึ่งเป็น DNAT) หรือจัดการเพื่อใช้ปลายทางก่อน NAT ย้อนกลับสำหรับ SNAT (เช่น 192.168.30.3:$สุ่ม) เป็นการจับคู่ NAT แบบย้อนกลับสำหรับ DNAT มิฉะนั้น SNAT ที่บังคับจะไม่มีประโยชน์(อย่างไรก็ตาม ในกรณีที่ไม่ใช่การกลับรายการ AFAIK ทั้งสองกรณีจะไม่เป็นจริง: DNAT จะถูกดำเนินการใน PREROUTING ก่อน SNAT ใน INPUT และการจับคู่ปลายทางในกฎ SNAT หากมี จะใช้ค่าที่เป็นผลลัพธ์ใน DNAT)


ประเด็นคือ เรื่องราวข้างต้น / "ปัญหา" ในคำถามของคุณแทบจะไม่สมเหตุสมผลเลยในความเป็นจริง ใช้ wireguard VPN สองโฮสต์เป็นตัวอย่าง: สมมติว่าคุณต้องการมี จุดสิ้นสุด= ตั้งค่าบนโฮสต์ทั้งสอง (เพื่อให้โฮสต์ใดโฮสต์หนึ่งสามารถเริ่มต้นการสื่อสารได้) และไม่ต้องการให้ค่าถูก "อัปเดต" โดยไม่คาดคิดเนื่องจากการบังคับ SNAT (สมมติว่าสามารถเรียกใช้งานได้จริง) สิ่งที่คุณควรทำคือ "เสมอ -บน" SNAT ที่ "เสริม" DNAT / เทียบเท่ากับ NAT สำรอง:

iptables -t nat -A INPUT -s 192.168.30.1 -d 192.168.30.3 -p udp --sport 2003 --dport 2001 -j SNAT --to-source :2002

ซึ่งปกติแล้วไม่จำเป็นในโมเดลไคลเอนต์-เซิร์ฟเวอร์ เนื่องจาก NAT ย้อนกลับอัตโนมัติสำหรับ DNAT

ป.ล. คุณยังไปไม่ถึง 192.168.30.1:2003 โดย 192.168.30.1:2003 แม้ว่ามิฉะนั้น NAT แหล่งที่มาที่ถูกบังคับจะเกิดขึ้นหากคุณเข้าถึงอีกครั้งโดย 192.168.30.1:2002 ก่อนที่รายการ conntrack ของอดีตจะหลุดออกไป กฎ SNAT เพิ่มเติมใน INPUT ไม่ควรสร้างปัญหาเพิ่มเติมให้กับคุณเช่นกัน

โพสต์คำตอบ

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