Score:0

เหตุใด MASQUERADE SNAT จึงบล็อกการเชื่อมต่อ localhost ได้

ฉันสังเกตเห็นพฤติกรรมแปลก ๆ บน linux:

ก่อนอื่น ฉันล้างเส้นทางและกฎ iptables ทั้งหมด:

ip เส้นทางล้างตารางหลัก
เริ่มต้นตารางล้างเส้นทาง ip
เส้นทาง ip ล้างตารางในเครื่อง
iptables -P อินพุตที่ยอมรับ
iptables -P ยอมรับไปข้างหน้า
iptables -P เอาต์พุตที่ยอมรับ
iptables -t แนท -F
iptables -t mangle -F
iptables -F
iptables -X
ip6tables -P อินพุตที่ยอมรับ
ip6tables -P ส่งต่อการยอมรับ
ip6tables -P เอาต์พุตที่ยอมรับ
ip6tables -t แนท -F
ip6tables -t พังเกิล -F
ip6tables -F
ip6tables -X

จากนั้นฉันเพิ่มเส้นทางท้องถิ่น:

เส้นทาง ip เพิ่ม local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 table local

จากนั้น บนเทอร์มินัล ฉันเปิดพอร์ตด้วย nc -lp 12345 และในเทอร์มินัลอื่นที่ฉันเชื่อมต่อกับมัน nc 127.0.0.1 12345 และฉันสามารถส่งและรับข้อมูลระหว่างเซิร์ฟเวอร์ netcat และไคลเอนต์ได้ สำหรับตอนนี้ทุกอย่างดี

ตอนนี้จากมันและหลังจากฆ่าเซิร์ฟเวอร์และไคลเอนต์ netcat ก่อนหน้าแล้ว ถ้าฉันรัน:

iptables -t nat -A โพสต์ -j MASQUERADE

และฉันรีสตาร์ทเซิร์ฟเวอร์ netcat จากนั้นไคลเอ็นต์ไม่สามารถเชื่อมต่อได้ คุณรู้ไหมว่าทำไม?

ฉันสังเกตเห็นว่าการเพิ่ม เส้นทาง ip เพิ่ม local 192.168.0.10 dev wlan0 proto kernel scope host src 192.168.0.10 table local ทำให้การเชื่อมต่อ netcat ใช้งานได้อีกครั้ง อย่างไรก็ตาม ฉันไม่เข้าใจว่าทำไมอินเทอร์เฟซ wlan0 (ที่มี 192.168.0.10 เป็น IP) จึงส่งผลต่ออินเทอร์เฟซย้อนกลับได้

สำหรับข้อมูล ฉันใช้ ArchLinux

Saïmonn avatar
in flag
ฉันเดาว่ากฎ MASQUERADE เปลี่ยนพอร์ตแพ็กเก็ตต้นทาง ซึ่งทำให้แพ็กเก็ตส่งคืนยุ่งเหยิง คุณสามารถโพสต์เอาต์พุตจาก tcpdump ที่ทำงานบน localhost ในขณะที่คุณเล่นกับ netcat ได้หรือไม่ ฉันแน่ใจว่าสิ่งนี้จะทำให้เราเข้าใกล้คำตอบที่ตรวจสอบได้
Score:1
ธง in

ฉันไม่รู้ว่ามันเป็นข้อบกพร่องหรือพฤติกรรมสำรองโดยเจตนา แต่จากสิ่งที่ฉันเห็นที่นี่ มันไม่มีส่วนเกี่ยวข้องใดๆ กับ wlan0 เส้นทางท้องถิ่นที่คุณพูดถึงหรือเกตเวย์เริ่มต้นทั้งหมด blah blah (ไม่มีความผิด แต่แทบไม่มีเหตุผลสำหรับฉัน) ที่ระบุไว้ในคำตอบอื่น ๆ / "ถูกต้อง"

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

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

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

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

ในกรณีที่คุณต้องการกฎที่เปิดใช้งานจริงๆ สวมหน้ากาก บนอินเทอร์เฟซทั้งหมด แต่ แท้จริง, คุณสามารถมี:

iptables -t แนท -A โพสต์ ! -o lo -j สวมหน้ากาก
Score:1
ธง us

นี่คือการเดาที่มีการศึกษา เดอะ สวมหน้ากาก ตัวเลือกจะแทนที่ที่อยู่ IP ต้นทางในแพ็กเก็ต IP ด้วยที่อยู่ที่จะตัดสินใจใช้ ฉันคิดว่าในกรณีนี้ มันจะแทนที่ที่อยู่ต้นทางด้วยที่อยู่อินเทอร์เฟซที่สามารถเข้าถึงเกตเวย์เริ่มต้นได้

ดังนั้น หากเกตเวย์เริ่มต้นของคุณคือ 192.168.0.1ที่อยู่ต้นทางของแพ็กเก็ตจะถูกแทนที่ด้วย 192.168.0.1. ปลายทางคือ 127.0.0.1และสิ่งนี้ทำงานไม่ถูกต้อง

คุณควรจำกัด สวมหน้ากาก ไปยังแพ็กเก็ตที่อินเทอร์เฟซขาออกเป็นเกตเวย์เริ่มต้นเท่านั้น

คุณสามารถทำได้โดยใช้คำสั่งต่อไปนี้:

iptables -t nat -A โพสต์ -o <if> -j MASQUERADE
Score:0

นอกจากคำตอบอื่นๆ แล้ว ฉันได้ทำการทดลองอื่นๆ โปรดทราบว่าต่อไปนี้เป็นเพียงข้อสรุปของฉัน ฉันไม่ได้ค้นหาภายในแหล่งเคอร์เนล (แต่หากคุณมีเอกสารโปรดแบ่งปัน)

แท้จริงดูเหมือนว่า แท้จริง อินเทอร์เฟซและ 127.0.0.1 ปฏิบัติตามกฎของตนเอง

สำหรับอินเทอร์เฟซอื่นๆ ต่อไปนี้เป็นวิธีที่ฉันเชื่อว่า IP ต้นทางถูกกำหนดให้กับแพ็กเก็ต (โดยไม่ต้องพูดถึง MASQUERADE หรือสิ่งต่างๆ เช่น ซ็อกเก็ตดิบ):

เมื่อมีคนพยายามส่งแพ็กเก็ตไปยัง IP ปลายทาง ลินุกซ์จะค้นหากฎการกำหนดเส้นทางที่ตรงกันเพิ่มเข้ามา เช่น:

เส้นทาง ip เพิ่ม <NETWORK>/<PREFIX> dev <INTERFACE_XX> [src <SRC_IP>]

ถ้าพารามิเตอร์ src มีให้ (นี่ดูเหมือนจะเป็นการเพิ่มกฎเช่น เส้นทาง ip เพิ่มท้องถิ่น <SRC_IP> dev <INTERFACE_YY> ก่อน. โปรดทราบว่า INTERFACE_XX และ INTERFACE_YY ไม่จำเป็นต้องเหมือนกันอย่างน่าประหลาดใจ) จากนั้นแพ็กเก็ตจะถูกส่งบนอินเทอร์เฟซ INTERFACE_XX กับ SRC_IP เป็น IP ต้นทาง

ถ้าพารามิเตอร์ src ไม่มีให้ มันจะส่งแพ็กเก็ตบน INTERFACE_XX และที่อยู่ต้นทางจะถูกเลือกโดยการค้นหา IP ที่ถูกต้องตัวแรกบนอินเทอร์เฟซจากตัวเริ่มต้นตัวแรกไปจนถึงตัวสุดท้าย (ที่ข้อยกเว้นของ lo) หากไม่พบ IP IP ต้นทางจะถูกตั้งค่าเป็น 0.0.0.0 หากอินเทอร์เฟซมีหลาย IP ให้เลือกอันแรก ค่อนข้างน่าแปลกใจ หมายความว่าแพ็กเก็ตไม่จำเป็นต้องมี IP ของเอาต์พุตอินเทอร์เฟซที่ส่งไป

ฉันเดาว่า MASQUERADE เลือก IP ต้นทางในลักษณะเดียวกัน

โปรดแก้ไขฉันด้วย คุณคิดว่ามีบางอย่างผิดปกติ

โพสต์คำตอบ

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