การนำเสนอ
ปัญหานี้สามารถแก้ไขได้โดยใช้เนมสเปซของเครือข่าย ดังนั้นจึงแยกระบบ Pi เดี่ยวออกเป็นเราเตอร์ X ที่ทำ NAT นั่นคือสิ่งที่ควรทำ อนิจจาฉันไม่รู้วิธีเขียนคำตอบที่ไม่เพียงต้องรวมวิธีย้ายอินเทอร์เฟซ Wifi ไปยังเนมสเปซเครือข่ายใหม่ (ต้องใช้ไดรเวอร์ที่เข้ากันได้และ iw phy phyX ตั้งค่าเน็ต ...
แทน ip link ตั้ง wlanX ... netns ...
) แต่โดยเฉพาะอย่างยิ่ง ที่เกี่ยวข้องของพวกเขา wpa_supplicant
และดีมอนไคลเอ็นต์ DHCP พร้อมการปรับแต่งการรวมระบบที่สอดคล้องกัน สิ่งนี้ต้องการความรู้ที่ดีเกี่ยวกับการกำหนดค่าระบบเฉพาะด้วยระบบไร้สายและ DHCP
คำตอบนี้หลีกเลี่ยงการใช้เนมสเปซเครือข่ายและหลีกเลี่ยงการกำหนดค่าการจัดการใหม่ wpa_supplicant และไคลเอ็นต์ DHCP: ใช้การกำหนดเส้นทางนโยบาย
เครื่องหมายที่เกี่ยวข้องในการกำหนดเส้นทางนโยบายเป็นสิ่งที่หลีกเลี่ยงไม่ได้สำหรับกรณีนี้ ซึ่งสแต็กการกำหนดเส้นทางจะเห็นเฉพาะพอร์ตปลายทาง 443 แทนที่จะเป็น 4431/4432 (DNAT เปลี่ยนไปก่อนหน้านี้แล้ว) เครื่องหมายจะเป็นผู้ใช้ในการตั้งค่าโซน conntrack (ตอบกลับ) เพื่อให้แน่ใจว่าจะจัดการกับกรณีที่กล้องหลายตัวกำหนดที่อยู่ IP เดียวกันให้กับอินเทอร์เฟซโฮสต์ที่ตรงกัน
การส่งต่อเส้นทางย้อนกลับที่เข้มงวด (SRPF) จะต้องเป็น ผ่อนคลาย ถึง RPF หลวม ในกรณีที่ตั้งค่า Strict เป็นค่าเริ่มต้น เนื่องจากการจัดการ ARP จะไม่ได้รับเครื่องหมายและอาจถูกบล็อกได้
เนื่องจากกล้องอาจไม่ได้ตั้งค่าเส้นทางเริ่มต้นไปยังไคลเอนต์ แต่อาจมีเพียงเส้นทาง LAN ดังนั้น NAT สองเท่า (ต้นทางและปลายทาง) จะถูกดำเนินการด้วย
ติดตั้ง
เนื่องจาก OP ไม่ได้จัดเตรียมไว้เลย eth0 การตั้งค่า ไม่มีที่นี่ คำตอบพยายามไม่ขึ้นอยู่กับสิ่งนี้มากเกินไป แต่ OP จะต้องปรับเปลี่ยนหากจำเป็น (โดยเฉพาะอย่างยิ่งหากอินเทอร์เฟซไร้สาย 7 รายการไม่ได้มีชื่อขึ้นต้นด้วย wlx
).
มาปรับเป้าหมายกัน:
192.168.42.0/24 แสดงถึงเครือข่าย IP ที่ทับซ้อนกันหลายเครือข่ายที่ต้องไม่เข้าถึงโดยตรง เพื่อป้องกันไคลเอ็นต์ภายนอกจากความซับซ้อนในการกำหนดเส้นทางที่เป็นไปได้ทั้งหมด
ดังนั้นที่อยู่ 192.168.42.250 จะไม่ถูกใช้ ที่อยู่ที่มองเห็นได้ของ Pi 192.168.0.205 จะถูกใช้จากไคลเอนต์ระยะไกล
การเข้าถึง HTTPS ใด ๆ จะได้รับใบรับรองที่ไม่ถูกต้อง จัดการกับมัน: ฉันให้คำตอบตามการตั้งค่าเครือข่ายที่ปรับแต่ง แต่จะไม่รวมการตั้งค่าพร็อกซีย้อนกลับเพื่อซ่อนปัญหาใบรับรอง การเพิ่มพร็อกซีย้อนกลับนั้นต้องการการปรับแต่งเครือข่ายเพิ่มเติม (เพิ่มเป็นตัวเลือกในตอนท้าย) การทดสอบสามารถทำได้จากไคลเอนต์ (แต่ไม่ใช่ RPi) ด้วย:
ขด --ไม่ปลอดภัย https://192.168.0.205:4431/
ขด --ไม่ปลอดภัย https://192.168.0.205:4432/
นอกจากนี้ เพื่อแสดงตัวอย่างด้านล่าง ฉันใช้กรณีที่กล้องทั้งสองตัวกำหนดที่อยู่ IP เดียวกันให้กับโฮสต์ ดังนั้นมันจึงปรากฏบนสองอินเทอร์เฟซ เพื่อยกระดับมาตรฐาน มันไม่สำคัญ การตั้งค่าเหล่านี้ส่วนใหญ่ต้องทำหลังจากการเชื่อมต่อไร้สายเสร็จสิ้นแทนที่จะเป็นก่อนหน้านี้ ฉันจะไม่จัดการกับวิธีการรวมสิ่งนี้กับระบบปฏิบัติการ Linux เฉพาะที่จัดการ
คำสั่งทั้งหมดควรรันในฐานะรูท
ตัวอย่างขึ้นอยู่กับ:
# เส้นทางไอพี
เริ่มต้นผ่าน 192.168.0.1 dev wlan0
192.168.0.0/24 dev wlan0 โปรโตเคอร์เนลขอบเขตลิงก์ src 192.168.0.205
192.168.42.0/24 dev wlxb8b7f16a0602 โปรโตเคอร์เนลขอบเขตลิงก์ src 192.168.42.10 เมตริก 600
192.168.42.0/24 dev wlxb8b7f16a04cd โปรโตเคอร์เนลขอบเขตลิงก์ src 192.168.42.10 เมตริก 600
กฎการกำหนดเส้นทางเพื่อเลือกตารางเส้นทางเพิ่มเติมที่จะแยก LAN ของกล้องแต่ละตัวที่ซ้ำกันออกจาก LAN ของกล้องอื่น:
กฎ ip เพิ่ม fwmark 1 ค้นหา 4431
กฎ ip เพิ่ม fwmark 2 ค้นหา 4432
เส้นทาง ip เพิ่ม 192.168.42.0/24 dev wlxb8b7f16a0602 ตาราง 4431
เส้นทาง ip เพิ่ม 192.168.42.0/24 dev wlxb8b7f16a04cd ตาราง 4432
ซึ่งจะทำให้การกำหนดเส้นทางจากไคลเอ็นต์ไปยังกล้องทำงานได้ (หาก RPi ไม่มีเส้นทางเริ่มต้น ตัวอย่างด้านล่างที่ใช้ 192.0.2.2 เพื่อทดสอบเส้นทางอาจใช้ 192.168.0.101 แทน):
# เส้นทาง ip รับเครื่องหมาย 2 จาก 192.0.2.2 iif wlan0 192.168.42.1
192.168.42.1 จาก 192.0.2.2 dev wlxb8b7f16a04cd ตาราง 4432 เครื่องหมาย 2
แคช iif wlan0
แต่ยังไม่ตอบกลับหากเปิดใช้งาน SRPF:
# เส้นทาง ip รับเครื่องหมาย 2 จาก 192.168.42.1 iif wlxb8b7f16a04cd 192.0.2.2
คำตอบ RTNETLINK: ลิงก์ข้ามอุปกรณ์ไม่ถูกต้อง
ดังนั้น เกือบจะไม่มีเอกสารธง จะต้องตั้งค่าบนอินเทอร์เฟซของกล้อง:
sysctl -w net.ipv4.conf.wlxb8b7f16a0602.src_valid_mark=1
sysctl -w net.ipv4.conf.wlxb8b7f16a04cd.src_valid_mark=1
ที่จะได้รับตอนนี้:
# เส้นทาง ip รับเครื่องหมาย 2 จาก 192.168.42.1 iif wlxb8b7f16a04cd 192.0.2.2
192.0.2.2 จาก 192.168.42.1 ผ่าน 192.168.0.1 dev wlan0 เครื่องหมาย 2
แคช iif wlxb8b7f16a04cd
แต่ที่จริงแล้ว ถึงอย่างไร ARP (จากกล้องไปยังโฮสต์) ยังคงหยุดชะงักเมื่อตั้งค่า SRPF เนื่องจาก ARP ไม่ได้รับเครื่องหมายของ iptables
ดังนั้นเพียงแค่ใช้ Loose RPF (rp_filter=2
) แทน (แล้วการตั้งค่าสำหรับ src_valid_mark
ด้านบนไม่จำเป็นอีกต่อไป) เพื่อแก้ปัญหา ใช้งานได้ไม่ว่าจะปิดใช้งาน RPF หรือตั้งค่าเข้มงวดก่อน:
sysctl -w net.ipv4.conf.wlxb8b7f16a0602.rp_filter=2
sysctl -w net.ipv4.conf.wlxb8b7f16a04cd.rp_filter=2
เพิ่มเครื่องหมายการตั้งค่ากฎ iptables เพื่อให้ส่วนการกำหนดเส้นทางเสร็จสมบูรณ์ ตลอดจนจัดการกับที่อยู่ที่ขัดแย้งกันใน NAT ในภายหลังโดยการตั้งค่าตัวเลือกโซนตอบกลับ
iptables -t raw -A PREROUTING ! -i wlx+ -p tcp --dport 4431 -j MARK --set-mark 1
iptables -t raw -A PREROUTING -i wlxb8b7f16a0602 -j MARK --set-mark 1
iptables -t raw -A PREROUTING -m เครื่องหมาย --mark 1 -j CT --zone-reply 1
iptables -t raw -A PREROUTING ! -i wlx+ -p tcp --dport 4432 -j MARK --set-mark 2
iptables -t raw -A PREROUTING -i wlxb8b7f16a04cd -j MARK --set-mark 2
iptables -t raw -A PREROUTING -m เครื่องหมาย --mark 2 -j CT --zone-reply 2
เพิ่มกฎเหล่านั้นใน NAT ไปยัง IP เป้าหมายและพอร์ต (ซึ่งเหมือนกันเสมอ) จากนั้นอินเทอร์เฟซที่ถูกต้องจะถูกเลือกโดยสแต็กการกำหนดเส้นทางด้วยการตั้งค่าก่อนหน้านี้:
iptables -t nat -A PREROUTING ! -i wlx+ -p tcp -m เครื่องหมาย ! --mark 0 -j DNAT --to-ปลายทาง 192.168.42.1:443
iptables -t nat -A โพสต์ -o wlx+ -j MASQUERADE
ควรเพิ่มอินเทอร์เฟซที่ 3 ที่เรียกว่า wlx3 ต่อไปนี้เป็นขั้นตอน สามารถสรุปได้ในลักษณะเดียวกันเพิ่มเติม:
เพิ่มกฎ ip ใหม่ที่เลือกด้วยเครื่องหมายใหม่ (3) ที่จะใช้ตารางเส้นทางใหม่ (4433):
กฎ ip เพิ่ม fwmark 3 ค้นหา 4433
เพิ่มตารางเส้นทางใหม่ที่ตรงกับรายการที่ซ้ำกันไม่มากก็น้อยจากเส้นทางของ LAN ตารางหลักสำหรับอินเทอร์เฟซใหม่:
เส้นทาง ip เพิ่ม 192.168.42.0/24 dev wlx3 ตาราง 4433
คลาย RPF บนอินเทอร์เฟซนี้หากค่าเริ่มต้นของ OS คือ SRPF (ตามที่บอก src_valid_mark
ไม่จำเป็นในตอนท้าย):
sysctl -w net.ipv4.conf.wlx3.rp_filter=2
เลือกพอร์ตใหม่ (4433) และเพิ่ม 3 ใหม่ raw/PREROUTING iptables กฎที่รวมถึงพอร์ตใหม่ เครื่องหมายใหม่ และอินเทอร์เฟซใหม่:
iptables -t raw -A PREROUTING ! -i wlx+ -p tcp --dport 4433 -j MARK --set-mark 3
iptables -t raw -A PREROUTING -i wlx3 -j MARK --set-mark 3
iptables -t raw -A PREROUTING -m เครื่องหมาย --mark 3 -j CT --zone-reply 3
(หากชื่ออินเทอร์เฟซใหม่ไม่ได้ขึ้นต้นด้วย wlx
เพิ่มใหม่ แนท ตามกฎ)
นี่คือตัวอย่างของ คอนแทรค การจัดการเมื่อไคลเอ็นต์เชื่อมต่อสองครั้ง แม้จะใช้พอร์ตต้นทางเดียวกันกับพอร์ตทั้งสองในขณะที่ RPi ได้รับที่อยู่ IP เดียวกันมากซึ่งกำหนดให้กับอินเทอร์เฟซไร้สาย wlx ทั้งสอง เดอะ คอนแทรค โซนรวมอยู่ในการเลือกโฟลว์และอนุญาตให้จัดการ NAT ได้อย่างถูกต้องแม้ว่าด้านใดด้านหนึ่งของโฟลว์จะเห็นที่อยู่และพอร์ตเดียวกันทุกประการ:
# conntrack -E
[ใหม่] tcp 6 120 SYN_SENT src=192.168.0.101 dst=192.168.0.205 sport=6666 dport=4431 [ไม่ได้ตอบ] src=192.168.42.1 dst=192.168.42.10 sport=443 dport=6666 zone-reply=10
[อัพเดท] tcp 6 60 SYN_RECV src=192.168.0.101 dst=192.168.0.205 sport=6666 dport=4431 src=192.168.42.1 dst=192.168.42.10 sport=443 dport=6666 zone-reply=1
[อัพเดท] tcp 6 432000 ESTABLISHED src=192.168.0.101 dst=192.168.0.205 sport=6666 dport=4431 src=192.168.42.1 dst=192.168.42.10 sport=443 dport=6666 zone-reply=1 [มั่นใจ]
[ใหม่] tcp 6 120 SYN_SENT src=192.168.0.101 dst=192.168.0.205 sport=6666 dport=4432 [ไม่ได้ตอบ] src=192.168.42.1 dst=192.168.42.10 sport=443 dport=6662 zone-reply=
[อัพเดท] tcp 6 60 SYN_RECV src=192.168.0.101 dst=192.168.0.205 sport=6666 dport=4432 src=192.168.42.1 dst=192.168.42.10 sport=443 dport=6666 zone-reply=2
[อัพเดท] tcp 6 432000 ESTABLISHED src=192.168.0.101 dst=192.168.0.205 sport=6666 dport=4432 src=192.168.42.1 dst=192.168.42.10 sport=443 dport=6666 zone-reply=2 [มั่นใจ]
เบ็ดเตล็ด
อื่น ๆ 1
เพื่อให้กล้องสามารถ ping โฮสต์หรือรับข้อผิดพลาด ICMP จากโฮสต์ได้ จะต้องเพิ่มการตั้งค่านี้ (ส่วนกลาง):
sysctl -w net.ipv4.fwmark_reflect=1
มิฉะนั้นคำตอบ ICMP จะไม่เป็นไปตามการกำหนดเส้นทางนโยบาย วิธีอื่นที่ดีกว่าคือการใช้ คอนมาร์ค/คอนมาร์คแต่จะทำให้คำตอบซับซ้อนขึ้นโดยไม่จำเป็น
อื่นๆ 2
ผลลัพธ์การทำงานไม่สามารถทดสอบได้อย่างถูกต้องจาก RPi เอง แต่จากไคลเอนต์บน LAN เท่านั้น (หรือบนอินเทอร์เน็ตด้วยการสนับสนุนจากเราเตอร์ของ RPi) การตั้งค่าเฉพาะสำหรับกรณีการกำหนดเส้นทาง
เป็นทางเลือกเพื่อให้โฮสต์สามารถทำงานได้ (และอนุญาตให้ใส่พร็อกซีย้อนกลับ) สามารถเพิ่มการตั้งค่าเพิ่มเติมเหล่านี้ได้:
เลือกอินเทอร์เฟซที่ถูกต้องก่อนที่ NAT จะเกิดขึ้น (ต้องการเคอร์เนล >= 4.17) มิฉะนั้นซ็อกเก็ตจะเลือกที่อยู่ต้นทางที่ไม่ถูกต้อง (ของอินเทอร์เฟซอื่น) ในภายหลัง:
กฎ ip เพิ่ม iif lo ipproto tcp dport 4431 ค้นหา 4431
กฎ ip เพิ่ม iif lo ipproto tcp dport 4432 ค้นหา 4432
ปลายทางจะต้องมี DNATed ใน nat/OUTPUT ไม่ต้องการชื่อ wlx ที่แน่นอนที่นี่ เส้นทางขาออกที่ถูกต้องได้รับการเลือกแล้วโดยสแต็กการจัดเส้นทางพร้อมกฎการกำหนดเส้นทางใหม่ (การตอบกลับยังคงต้องการส่วนหนึ่งของกฎ iptables raw/PREROUTING จากคำตอบหลัก) และ ก คอนแทรค โซนตอบกลับยังจำเป็นใน raw/OUTPUT เพื่อจัดการกับกรณีการปะทะกันที่หายาก
iptables -t raw -A OUTPUT -o wlx+ -p tcp --dport 4431 -j MARK --set-mark 1
iptables -t raw -A OUTPUT -m เครื่องหมาย --mark 1 -j CT --zone-reply 1
iptables -t raw -A OUTPUT -o wlx+ -p tcp --dport 4432 -j MARK --set-mark 2
iptables -t raw -A OUTPUT -m เครื่องหมาย --mark 2 -j CT --zone-reply 2
iptables -t nat -A OUTPUT -p tcp -m เครื่องหมาย ! --mark 0 -j DNAT --to-ปลายทาง :443
การทดสอบในกรณีนี้ควรทำจาก RPi ด้วย:
ขด --ไม่ปลอดภัย https://192.168.42.1:4431/
ขด --ไม่ปลอดภัย https://192.168.42.1:4432/
เบ็ดเตล็ด 3
การตั้งค่าใน เบ็ดเตล็ด 2 หากปรับให้เหมาะกับการจัดการ UDP ในเครื่องสำหรับกรณีที่แตกต่างจาก OP อาจไม่เพียงพอสำหรับบางกรณี: UDP ต้องการการสนับสนุนจากแอปพลิเคชันในเครื่องเสมอเมื่ออยู่ในสภาพแวดล้อมแบบหลายบ้าน